C “*”的地址;航空公司指向

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”的第一个字符 这

我遵循“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”的第一个字符

这是否意味着
*“太空旅客”
是一个地址?
头部没有声明指针?

“太空旅行者”
的类型为
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];