それは参照渡しではなく、他の人が述べたように値渡しです。
C言語は例外なく値渡しです。ポインターをパラメーターとして渡すことは、参照渡しを意味しません。
ルールは次のとおりです。
関数は、実際のパラメーター値を変更できません。
関数のスカラーパラメータとポインタパラメータの違いを見てみましょう。
スカラー変数
この短いプログラムは、スカラー変数を使用した値渡しを示しています。param
は仮パラメータと呼ばれ、variable
関数呼び出しでは実パラメータと呼ばれます。param
関数のインクリメントは変化しないことに注意してくださいvariable
。
#include <stdio.h>
void function(int param) {
printf("I've received value %d\n", param);
param++;
}
int main(void) {
int variable = 111;
function(variable);
printf("variable %d\m", variable);
return 0;
}
結果は
I've received value 111
variable=111
参照渡しの錯覚
コードを少し変更します。param
ポインタです。
#include <stdio.h>
void function2(int *param) {
printf("I've received value %d\n", *param);
(*param)++;
}
int main(void) {
int variable = 111;
function2(&variable);
printf("variable %d\n", variable);
return 0;
}
結果は
I've received value 111
variable=112
これにより、パラメーターが参照によって渡されたと確信できます。そうではありませんでした。これは値で渡され、param値はアドレスです。int型の値がインクリメントされました。これは、参照渡し関数呼び出しであると私たちに思わせる副作用です。
ポインター-値渡し
その事実をどのようにして証明/証明できるでしょうか?まあ、スカラー変数の最初の例を試すことができるかもしれませんが、スカラーの代わりにアドレス(ポインター)を使用します。それが役立つかどうか見てみましょう。
#include <stdio.h>
void function2(int *param) {
printf("param's address %d\n", param);
param = NULL;
}
int main(void) {
int variable = 111;
int *ptr = &variable;
function2(ptr);
printf("ptr's address %d\n", ptr);
return 0;
}
その結果、2つのアドレスは等しくなります(正確な値を気にする必要はありません)。
結果の例:
param's address -1846583468
ptr's address -1846583468
私の意見では、これはポインターが値渡しされていることを証明しています。それ以外の場合ptr
はNULL
、関数呼び出しの後になります。