C は値渡しです。つまり、パラメーターの元の変数の代わりに、変数のコピーが使用されます。それで、そのコピーは常に同じメモリアドレスを持っていますか? 次のコードを検討してください。
void test(int *ptr) {
printf("&ptr: %p\n", &ptr);
printf("ptr: %p\n", ptr);
printf("*ptr: %d\n\n", *ptr);
}
int main() {
int a = 1, b = 2, c = 3, d = 4, e = 5;
test(&a);
test(&b);
test(&c);
test(&d);
test(&e);
return 0;
}
このコードから得られる出力は次のとおりです。
&ptr: 0x7fff70536728
ptr: 0x7fff7053674c
*ptr: 1
&ptr: 0x7fff70536728
ptr: 0x7fff70536750
*ptr: 2
&ptr: 0x7fff70536728
ptr: 0x7fff70536754
*ptr: 3
&ptr: 0x7fff70536728
ptr: 0x7fff70536758
*ptr: 4
&ptr: 0x7fff70536728
ptr: 0x7fff7053675c
*ptr: 5
私の直感は「いいえ」でした。ptr
のコード ブロックの外側に が存在しないことは、私の理解ですtest()
。では、なぜ&ptr
5 つの関数呼び出しすべてが同じなのでしょうか?