5

如果我要做类似的事情:

printf("The string is: %s\n", "string1");

以下是在编译时完成的:

printf("The string is: %s\n", (unsigned char*) "string1"); 

还是类似的?

4

2 回答 2

12

标准定义字符串字面量的类型是char1的数组,数组自动衰减为指针,即char*. printf在将其作为参数传递给使用%s说明符时,您不需要显式地强制转换它。

旁注:在 C++ 中它是const char*2


[1] C99 6.4.5:“字符串文字是用双引号括起来的零个或多个多字节字符的序列,如“xyz”......静态存储持续时间和长度的数组刚好足以包含序列. 对于字符串文字,数组元素的类型为char"

[2] C++03 2.13.4 §1:“普通字符串文字的类型为“n 数组 const char”和静态存储持续时间”

于 2013-10-09T16:30:17.283 回答
4

您的理解或多或少是正确的,尽管机制不同。

除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串字面量,否则“N 元素数组T”类型的表达式将被转换(“衰减”)为键入“pointer to T”,表达式的值将是数组中第一个元素的地址。这适用于所有数组类型,而不仅仅是字符串文字。

表达式"string1"的类型为“8 元素数组char1;在printf调用中,它不是一元运算符sizeof或一元运算符的操作数&,也不是用于初始化另一个数组,因此它被隐式转换为类型为“pointer to char2的表达式,其值为第一个字符的地址。


1. 7 个字母加上 0 终止符。
2. C中是这样的;在 C++ 中,字符串文字是 的数组const char,因此表达式将衰减为 type const char *

于 2013-10-09T16:53:37.577 回答