好吧,我无法理解指向指针的指针与指向数组的指针。
考虑以下代码:
char s[] = "Hello, World";
char (*p1)[] = &s;
char **p2 = &s;
printf("%c\n", **p1); /* Works */
printf("%c\n", **p2); /* Segmentation fault */
为什么第一个 printf 起作用,而第二个 printf 不起作用?
据我了解,'s'是指向数组第一个元素(即'H')的指针。
因此将 p2 声明为 char** 意味着它是一个指向 char 的指针。使其指向 's' 应该是合法的,因为 's' 是指向 char 的指针。因此取消引用它(即 **p2)应该给出“H”。但事实并非如此!
你的误解在于s
是。这是not指针:它是一个数组。
现在在大多数情况下,s
求值为指向数组第一个元素的指针:相当于&s[0]
,指向那个的指针'H'
。但这里重要的是,评估时获得的指针值s
是一个临时的、短暂的值——就像&s[0]
.
因为该指针不是永久对象(它实际上不是存储在s
),你不能用指针到指针来指向它。要使用指针到指针,您必须有一个真正的指针对象来指向 - 例如,以下内容就可以:
char *p = s;
char **p2 = &p;
如果你评价*p2
,你告诉编译器加载那个东西p2
指向并将其视为指向字符的指针。那就好当p2
实际上指向一个字符指针;但当你这样做时char **p2 = &s;
,那件事p2
指向根本不是一个指针 - 它是一个数组(在本例中,它是一个由 13 个元素组成的块)char
s).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)