好吧,所以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