C “*”的地址;航空公司指向
我遵循“C Primer Plus”并遇到以下代码:C “*”的地址;航空公司指向,c,C,我遵循“C Primer Plus”并遇到以下代码: //strptr.c -- strings are pointers #include <stdio.h> int main(void) { printf("%s, %p, %c\n", "We", "are", *"space farers"); return 0; } 参考*“太空票价”,本书解释如下: *“space Faers”应生成地址指向的值,该值应为字符串“space Faers”的第一个字符 这
//strptr.c -- strings are pointers
#include <stdio.h>
int main(void)
{
printf("%s, %p, %c\n", "We", "are", *"space farers");
return 0;
}
参考*“太空票价”
,本书解释如下:
*“space Faers”应生成地址指向的值,该值应为字符串“space Faers”的第一个字符
这是否意味着*“太空旅客”
是一个地址?头部没有声明指针?
“太空旅行者”
的类型为char[]
。当传递到函数(printf
在本例中)时,它会衰减为char*
,因此*“太空旅行者”
的类型为char
,并保持's'
“太空旅行者”
是一个字符序列。C通过将其视为指向第一个字符的指针来处理。这就是你看到的原因
char * str = "space farers";
*xx
表示“返回此指针xx指向的内容”。对于*“太空旅客”
,这是字符串的第一个字符,即s
更清楚的办法是
char * str = "space farers";
char s = *str;
这将删除奇怪的*“…”
构造 “space faers”
是一个字符串文字-字符串文字是C语言中的一个字符,其类型为char[n]
,其中n
是文字中的字符数加上一个空终止符。在这种情况下是13
在几乎所有的上下文中,数组类型的左值衰减为指向第一个元素的指针。由于元素类型为char
,因此衰减后的值类型为char*
*
取消对给定指针的引用,这将导致元素类型的左值-这里的类型为char
。然后计算其值,即第一个字符的值,即整数's'
(如果ASCII是执行字符,则为115)
TL;博士:
*“space faers”
本身不是地址,而是字符串中第一个字符类型为char
的左值。您可以使用&
运算符获取左值的地址
p.S.字符串文字和字符串值不是指针,而是数组。在大多数情况下,“T的N元素数组”类型的表达式将转换(“衰减”)为“指向T的指针”类型的表达式,表达式的值将是数组第一个元素的地址。当数组表达式是
sizeof
或一元&
运算符的操作数,或者是用于初始化声明中字符数组的字符串文字时,会发生异常
因此,对于任何数组
T arr[N];
表达式arr
将“衰减”为键入“指向T
”的指针,其值将与&arr[0]
相同
表达式
“space faers”
的类型为“char的13元素数组”。由于它不是sizeof
或一元&
运算符的操作数,并且不用于初始化声明中的字符数组,因此它“衰减”为char*
类型的表达式,表达式的值是数组第一个元素的地址。正如*arr
相当于arr[0]
,*“space faers”
相当于“space faers”[0]
,并为我们提供存储在数组第一个元素中的值-字符值's'
printf
与为什么“太空旅行者”
在这里衰变为char*
没有任何关系。@trentcl它是这样做的printf
是一个函数,所以是的,它与为什么有关。对不起,我正在努力学习这个棘手的话题。它是char*还是*char?@riderdragon它是char*
char*
表示指向char
的指针。您提到的语法称为解引用,用于获取指针指向的值。“space farers”
不会传递给函数。这是解引用操作符*
的参数。我认为这是不正确的。字符串文字是一个数组,C可以通过将其转换为指向第一个元素(字符)的指针来处理它(取决于上下文)。请看:-如果你在回答中所说的是普遍正确的,静态断言将通过-但它反而失败了。对于rep 89人员,我认为我们需要在适当的级别上给出答案89如何开始解释它。。。这比书的标题更重要?不管怎样,我认为添加一个注释(这是一个并不总是适用的简化)会使答案更正确,并且不会使它对初学者的用处降低。因此,任何数组,例如{1,2,3}
本质上都是一个指针。“太空旅行者”相当于{'s',p','a',…},但是*{'s'、'p'、'a'、…}不起作用。@riderdragon:不,数组不是指针;数组表达式根据需要转换为指针表达式,但数组对象不是指针。大括号表示法只在初始值设定项中起作用。
T arr[N];