gpt4 book ai didi

c - 为什么指向指针的指针与指向数组的指针不兼容?

转载 作者:太空狗 更新时间:2023-10-29 16:40:58 25 4
gpt4 key购买 nike

好的,我无法理解指向指针的指针与指向数组的指针。考虑以下代码:

char s[] = "Hello, World";
char (*p1)[] = &s;
char **p2 = &s;
printf("%c\n", **p1); /* Works */
printf("%c\n", **p2); /* Segmentation fault */

为什么第一个 printf 工作,而第二个不工作?

据我了解,“s”是指向数组第一个元素(即“H”)的指针。所以声明 p2 为 char** 意味着它是一个指向 char 的指针。让它指向“s”应该是合法的,因为“s”是一个指向字符的指针。因此取消引用它(即 **p2)应该给出“H”。但事实并非如此!

最佳答案

你的误解在于什么是s。它不是一个指针:它是一个数组。

现在在大多数情况下,s 计算为指向数组第一个元素的指针:等同于 &s[0],一个指向该 ' 的指针H'。不过这里重要的是,您在评估 s 时获得的指针值是一个临时的、短暂的值——就像 &s[0] 一样。

因为该指针不是永久对象(它实际上不是存储在 s 中的内容),所以您不能在它上面创建一个指向指针的指针。要使用指向指针的指针,您必须有一个真正的指针对象指向 - 例如,以下是可以的:

char *p = s;
char **p2 = &p;

如果您评估*p2,您是在告诉编译器加载p2 指向的内容并将其视为指向字符的指针。当 p2 实际上指向一个指向字符的指针时,这很好;但是当你执行 char **p2 = &s; 时,p2 指向的东西根本不是一个指针——它是一个数组(在这种情况下,它是一个13 个 char block )。

关于c - 为什么指向指针的指针与指向数组的指针不兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7923464/

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