2017-05-28 70 views
1

我不知道如何在标题中很好地描述我的困惑。为什么指针会在退出函数后恢复?

我有一段如下的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()中的arr只是main()中真实arr的副本?

+1

'int fun(int x){x = x + 1; } int main(void){int x = 5;有趣的(X); printf(“%d \ n”,x);返回0; ''你期望产生什么输出? –

+0

@OliverCharlesworth不够公平......我很愚蠢。 –

+0

简而言之,'arr'的基地址被复制到'fun()'中的一个本地指针(函数参数可以被视为方便初始化的局部变量)。这里只修改局部变量。因此输出 –

回答

2

考虑到int arr[]实际上与int* arr相同。换句话说,arr是从fun()的第一个参数传递给它的指针的值的副本。我将对您的代码进行一些小的更改以使其更清晰。具体来说,我在fun()中更改arr的名称,因此很明显它与main()arr不一样。

#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的副本而不是原始值,所以不会更改原始值。

我希望这已经够清楚了。

+0

嗨斯图尔特,感谢您的答复。现在我明白了。 –

相关问题