指向*的“ space farers”指针的地址

时间:2018-10-16 15:31:02

标签: 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;
}

运行它并通过:

./a.out
We, 0x1066e4fa1, s

参考*"space farers",该书解释说:

  

*“ space farers”应该产生地址指向的值,该值应该是字符串“ space farers”的第一个字符。

这是否意味着*"space farers"是一个地址?
头中没有声明任何指针?

4 个答案:

答案 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'