字符串文字是否在C中编译时自动转换为char *?

时间:2013-10-09 16:28:58

标签: c string pointers types compilation

如果我要这样做:

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

以下是在编译时完成的:

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

或者类似的?

2 个答案:

答案 0 :(得分:12)

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

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


[1] C99 6.4.5:“字符串文字是一个包含零个或多个多字节字符的序列 双引号,如“xyz”... 一组静态存储持续时间和长度 足以包含序列。对于字符串文字,数组元素具有 输入char

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

答案 1 :(得分:4)

虽然机制不同,但您的理解或多或少是正确的。

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

表达式"string1"的类型为“{element}的8个元素数组” 1 ;在char调用中,它不是printf或一元sizeof运算符的操作数,也不是用于初始化另一个数组,因此它被隐式转换为类型为“的表达式”指向& 2 的指针,其值是第一个字符的地址。

<小时/> 1。 7个字母加0终止符。
2。这是C的情况;在C ++中,字符串文字是char的数组,因此表达式将衰减为const char类型。

相关问题