我不知道如何在标题的短片中准确描述我的困惑。
我在下面有一段C代码:
#include <stdio.h>
int fun(int arr[]) {
printf("%d %p\n", arr[0], arr);
arr = arr+1;
printf("%d %p\n", arr[0], arr);
}
int main(void) {
int arr[2] = {10, 20};
fun(arr);
printf("%d %p\n", arr[0], arr);
return 0;
}
猜猜输出是什么?
10 0x7ffe0a638520
20 0x7ffe0a638524
10 0x7ffe0a638520
好的,所以似乎地址确实在fun()中发生了变化,然而,它在退出函数后恢复了。
这是因为fun()中的arr只是main()中真实arr的副本吗?
答案 0 :(得分:2)
请注意int arr[]
实际上与int* arr
相同。换句话说,arr是从fun()
的第一个参数传递给它的指针值的副本。我将对您的代码进行一些小的更改,以使其更清晰。具体来说,我正在更改arr
中fun()
的名称,以便明确它与arr
中的main()
不一样。
#include <stdio.h>
int fun(int* ptr) {
printf("%d %p\n", *ptr, ptr);
ptr = ptr+1;
printf("%d %p\n", *ptr, ptr);
}
int main(void) {
int arr[2] = {10, 20};
fun(arr);
printf("%d %p\n", arr[0], arr);
return 0;
}
现在您可以看到arr
和ptr
完全独立。 ptr
是一个恰好指向arr
的第一个元素的指针。如果我们更改值 ptr
,那么我们将更改arr
的原始值,但这不是我们正在做的事情。我们正在更改 ptr
本身的值,因为ptr
只是arr
的副本,而不是原始值,所以它不会更改原始值。
我希望这很清楚。