考虑在C中定义一个char指针。然后执行指令:
char *str
str = "Hello World!"
没有产生任何错误。假设我对C和指针的知识几乎是不可接受的,为什么该指令正确?不应该是:
str = &("Hello World!");
答案 0 :(得分:3)
引用C11
,第6.3.2.1章
除非它是
sizeof
运算符,_Alignof
运算符或 一元&
运算符,或者是用于初始化数组的字符串文字,该表达式具有 类型“类型数组” 转换为类型为“类型指针” 的表达式 数组对象的初始元素,不是左值。 [....]
此处,字符串文字(基本上是char
FootNote 的类型数组)在用作赋值运算符的RHS时,会衰减到指向第一个元素的指针数组。
因此,根据赋值运算符的要求,LHS(指针类型)和RHS(派生指针类型)是兼容的,并且该语句有效。
那是
str = &("Hello World!");
无效,因为&("Hello World!");
的类型为char (*) [13]
(指向由13个char
组成的数组的指针),并且不是char *
的兼容类型,作业的LHS。
脚注:
引用C11
,第6.4.5节
在翻译阶段7中,每个多字节附加一个字节或零值的代码 由字符串文字或文字产生的字符序列。78)多字节字符 然后使用序列来初始化静态存储持续时间和长度的数组 足以包含序列。对于字符串文字,数组元素具有 类型为char,并使用多字节字符的各个字节进行初始化 顺序。 [....]
答案 1 :(得分:3)
字符串文字"Hello World!"
是类型char [13]
的匿名对象,即13个字符的数组,它隐式衰减为指向数组第一个字符的指针(char *
!)。在所有情况下,除非数组作为&的操作数或在sizeof
/ _Alignof
中出现。
str = &("Hello World!")
(可以在没有括号str = &"Hello World!"
的情况下写)特别是 不正确,因为&("Hello World!")
的结果是*char (*)[13]
类型的,即指针最多包含13个字符!
海湾合作委员会将其诊断为
test.c:3:9: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
str = &"Hello World!";