【发布时间】:2013-10-17 03:23:34
【问题描述】:
如果我要这样做:
printf("The string is: %s\n", "string1");
以下是在编译时完成的:
printf("The string is: %s\n", (unsigned char*) "string1");
还是类似的?
【问题讨论】:
标签: c string pointers types compilation
如果我要这样做:
printf("The string is: %s\n", "string1");
以下是在编译时完成的:
printf("The string is: %s\n", (unsigned char*) "string1");
还是类似的?
【问题讨论】:
标签: c string pointers types compilation
标准定义字符串字面量的类型是char1的数组,数组自动衰减为指针,即char*。当使用 %s 说明符时,您不需要在将其作为参数传递给 printf 时显式地强制转换它。
旁注:在 C++ 中,它是 const char*2。
[1] C99 6.4.5: “字符串文字是包含在
双引号,如“xyz”... 静态存储持续时间和长度的数组
足以包含序列。对于字符串文字,数组元素有
输入char"
[2] C++03 2.13.4 §1: "一个普通的字符串字面量具有类型“n 的数组”
const char”和静态存储时长”
【讨论】:
const char *。
char 的数组”,在 C11 6.7.9.32 下最明确,但在 C11 6.4.5.6 下也是如此。显然你是正确的,在通常情况下它会衰减到char *。参考 +1。
您的理解或多或少是正确的,尽管机制不同。
除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则为“T 的N 元素数组”类型的表达式将被转换(“decay”)为类型为“pointer to T”的表达式,表达式的值将是数组中第一个元素的地址。这适用于所有数组类型,而不仅仅是字符串文字。
表达式"string1"的类型为“char的8元素数组”1;在printf 调用中,它不是sizeof 或一元& 运算符的操作数,也不是用于初始化另一个数组,因此它被隐式转换为“指向char 的指针”类型的表达式2,其值为第一个字符的地址。
const char 的数组,因此表达式将衰减为类型 const char *。
【讨论】: