为什么指针会在退出功能后恢复?

  • 本文关键字:功能 恢复 退出 指针 c
  • 更新时间 :
  • 英文 :


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

我在下面有一段 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;
}

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

我希望这已经足够清楚了。

最新更新