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