为什么指针会在退出函数后恢复?

时间:2017-05-28 09:35:07

标签: c

我不知道如何在标题的短片中准确描述我的困惑。

我在下面有一段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的副本吗?

1 个答案:

答案 0 :(得分:2)

请注意int arr[]实际上与int* arr相同。换句话说,arr是从fun()的第一个参数传递给它的指针值的副本。我将对您的代码进行一些小的更改,以使其更清晰。具体来说,我正在更改arrfun()的名称,以便明确它与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;
}

现在您可以看到arrptr完全独立。 ptr是一个恰好指向arr的第一个元素的指针。如果我们更改值 ptr,那么我们将更改arr的原始值,但这不是我们正在做的事情。我们正在更改 ptr本身的值,因为ptr只是arr的副本,而不是原始值,所以它不会更改原始值。

我希望这很清楚。