如果我要做类似的事情:
printf("The string is: %s\n", "string1");
以下是在编译时完成的:
printf("The string is: %s\n", (unsigned char*) "string1");
还是类似的?
如果我要做类似的事情:
printf("The string is: %s\n", "string1");
以下是在编译时完成的:
printf("The string is: %s\n", (unsigned char*) "string1");
还是类似的?
标准定义字符串字面量的类型是char
1的数组,数组自动衰减为指针,即char*
. printf
在将其作为参数传递给使用%s
说明符时,您不需要显式地强制转换它。
旁注:在 C++ 中它是const char*
2。
[1] C99 6.4.5:“字符串文字是用双引号括起来的零个或多个多字节字符的序列,如“xyz”......静态存储持续时间和长度的数组刚好足以包含序列. 对于字符串文字,数组元素的类型为char
"
[2] C++03 2.13.4 §1:“普通字符串文字的类型为“n 数组
const char
”和静态存储持续时间”
您的理解或多或少是正确的,尽管机制不同。
除非它是sizeof
或一元运算符的操作数&
,或者是用于在声明中初始化另一个数组的字符串字面量,否则“N 元素数组T
”类型的表达式将被转换(“衰减”)为键入“pointer to T
”,表达式的值将是数组中第一个元素的地址。这适用于所有数组类型,而不仅仅是字符串文字。
表达式"string1"
的类型为“8 元素数组char
” 1;在printf
调用中,它不是一元运算符sizeof
或一元运算符的操作数&
,也不是用于初始化另一个数组,因此它被隐式转换为类型为“pointer to char
” 2的表达式,其值为第一个字符的地址。
const char
,因此表达式将衰减为 type const char *
。