gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 02:30:16 24 4
gpt4 key购买 nike

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

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

最佳答案

请考虑 int arr[] 实际上与 int* arr 相同。换句话说,arr 是从 fun() 的第一个参数传递给它的指针值的副本。我将对您的代码进行一些小的更改,以使其更清晰。具体来说,我正在更改 fun()arr 的名称,以便清楚地知道它与 中的 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 的第一个元素。如果我们更改 at ptr 的值,那么我们将更改 arr 的原始值,但这不是我们正在做的。我们正在更改 of ptr 本身的值,因为 ptr 只是 arr 的副本,而不是原始值, 它不会改变原来的。

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

关于c - 为什么退出函数后指针会恢复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44225814/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com