在 C 中,字符串文字具有字符数组的类型。来自 C 标准(6.4.5 字符串文字)
6 在翻译阶段 7 中,将一个字节或零值代码附加到
由字符串文字产生的每个多字节字符序列
或文字。78) 然后使用多字节字符序列
初始化一个静态存储持续时间和长度的数组
足以包含序列。 对于字符串文字,
数组元素的类型为 char,并使用
多字节字符序列的单个字节。
具有罕见异常的数组也被转换为表达式中的指针。 C 标准,6.3.2.1 左值、数组和函数指示符
3 除非它是 sizeof 运算符的操作数或一元 &
运算符,或者是用于初始化数组的字符串文字,
具有“类型数组”类型的表达式被转换为
类型为“pointer to type”的表达式,指向初始
数组对象的元素并且不是左值。如果数组对象
有注册存储类,行为未定义。
因此在此调用中
strcpy(dest, "HelloWorld");
字符串文字的类型为char[11],它被转换为char * 类型的值,它等于字符串文字的第一个字符的地址。
你也可以写例子
strcpy(dest, &"HelloWorld"[0]);
甚至:)
strcpy(dest, &0["HelloWorld"]);
或:)
strcpy(dest, &*"HelloWorld");
所有三个表达式都产生字符串字面量的初始元素的地址,类型为char *。
考虑到它是否是实现定义的(通常由编译器选项控制)
"HelloWorld" == "HelloWorld"
被评估为真。这就是编译器是为相同的字符串文字分配单独的内存范围还是只存储它们的一个副本。
在此表达式中,比较字符串文字的第一个字符的地址。
如果你写
strcmp( "HelloWorld", "HelloWorld" )
那么结果将等于0,即字符串文字彼此相等(包含相同的字符序列)