好吧,所以C是按值傳遞的,這意味着使用變量的副本而不是參數的原始變量,對吧?那麼,這個副本是否總是有相同的內存地址?考慮以下代碼: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
對於所有五個函數調用都是相同的?
它不保證是相同的。你正在觀察未指定的行爲。 (如果您使用除main之外的其他函數調用地址,則可以看到地址更改。) –
即使沒有中間函數調用,它也可能不會顯示此行爲。取決於特定機器上的實現。 –
@AndyzSmith也取決於編譯器如何決定實現它。 :) – jmstoker