我正在使用“ 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;
}
运行它并通过:
./a.out
We, 0x1066e4fa1, s
参考*"space farers"
,该书解释说:
*“ space farers”应该产生地址指向的值,该值应该是字符串“ space farers”的第一个字符。
这是否意味着*"space farers"
是一个地址?
头中没有声明任何指针?
答案 0 :(得分:3)
photoFile
是一个字符序列。 C通过将其视为指向第一个字符的指针来进行处理。这就是为什么你看到
"space farers"
char * str = "space farers";
说“返回该指针xx指向的内容”。对于*xx
,这是字符串的第一个字符,即*"space farers"
。
一种更清晰的方法是
s
这将删除奇怪的 char * str = "space farers";
char s = *str;
构造;
答案 1 :(得分:3)
"space farers"
是字符串文字-C中的lvalue字符串文字的类型为char [n]
,其中n
是文字中的字符数加上一个空终止符。在这种情况下为13。
在几乎所有上下文中,数组类型的左值都会衰减为指向第一个元素的指针。由于元素的类型为char
,因此衰减后的值为char *
类型。
*
取消引用给定的指针,这将导致元素类型的左值-这里为char
类型。然后将对其求值-即第一个字符的值,该值是整数's'
(如果ASCII是执行字符,则为115)。
TL; DR:
*"space farers"
本身不是地址,而是类型为char
的 lvalue ,它是字符串中的第一个字符。您可以使用&
运算符获取左值的地址。
P.S。字符串文字和字符串值是不是指针,而是数组。
答案 2 :(得分:3)
在大多数情况下,类型为T
的N元素数组的表达式将被转换(“衰变”)为类型为“指向{{1}的指针”的表达式。 }”,表达式的值将是数组第一个元素的地址。当数组表达式是T
或一元sizeof
运算符的操作数,或者是用于初始化声明中的字符数组的字符串文字时,会发生异常。
因此,对于任何数组
&
表达式T arr[N];
将“衰减”以键入“指向arr
的指针”,其值将与T
相同。
表达式 &arr[0]
的类型为“ "space farers"
的13个元素的数组”。由于它不是char
或一元sizeof
运算符的操作数,并且不被用于初始化声明中的字符数组,因此它会“衰减”为类型{{ 1}},表达式的值是数组第一个元素的地址。就像&
等效于char *
一样,*arr
等效于arr[0]
,并为我们提供了存储在数组第一个元素中的 value -字符值*"space farers"
。
答案 3 :(得分:0)
"space farers"
的类型为char[]
。当传递给函数(在这种情况下为printf
)时,它会衰减为char*
,因此*"space farers"
的类型为char
并保存's'
。