gpt4 book ai didi

c - 基本的 C 指针和按引用传递的混淆

转载 作者:太空狗 更新时间:2023-10-29 17:18:21 25 4
gpt4 key购买 nike

我有以下基本程序:

#include <stdio.h>

void doit(char *c) {
c = "world";
}

int main() {
char *c = "hello";
doit(c);
printf("%s\n", c);
return 0;
}

一行一行:

  • c 将地址存储到它指向的字符串(字符序列)
  • *c 指向主函数中的“hello”

现在,当 c(指针)传递给试图修改它的函数时。修改后的值在 main 中不可用。为什么?

#include <stdio.h>

void doit(char **c) {
*c = "world";
}

int main() {
char *c = "hello";
doit(&c);
printf("%s\n", c);
return 0;
}

工作正常吗?我希望第一个示例本身可以正常工作,因为我传递的 doit(c) 已经是指向我要修改的字符串的指针。

最佳答案

这是因为在第一个版本中,您通过 传递指针。这意味着来自 main 的实际指针被复制 并且在 doit 函数中您只修改副本。

在第二个版本中,您通过将指针传递给指针来模拟按引用传递(C 没有正确的引用)。


让我们看看这是否让您更清楚。

对于第一个程序,在 main 函数中有一个指针 c 指向字符串文字 "hello":

+--------+       +---------+| main:c | ----> | "hello" |+--------+       +---------+

然后当你把它传递给函数时,指针被复制,所以你有这个:

+--------+| main:c | --+--------+   \     +---------+              >--> | "hello" |+--------+   /     +---------+| doit:c | --+--------+

doit 中更改指针后,您将得到:

+--------+       +---------+| main:c | ----> | "hello" |+--------+       +---------++--------+       +---------+| doit:c | ----> | "world" |+--------+       +---------+

对于第二个程序,它的开始是一样的:

+--------+       +---------+| main:c | ----> | "hello" |+--------+       +---------+

但是当您使用指向指针的指针调用时它会发生变化:

+--------+       +--------+       +---------+| doit:c | ----> | main:c | ----> | "hello" |+--------+       +--------+       +---------+

然后在 doit 中取消引用 c 为您提供 original c 来自 main 的指针>,并改变它

+--------+       +--------+       +---------+| doit:c | ----> | main:c | ----> | "world" |+--------+       +--------+       +---------+

关于c - 基本的 C 指针和按引用传递的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27483368/

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