6.4.5 字符串字面量
TIP
这一节最容易误读的点有两个:一是字符串字面量并不等于指针,二是相邻字符串字面量会在翻译期拼接。
字符串字面量由双引号括起的字符序列组成,可以带编码前缀。常见形式包括:
- 普通字符串字面量:
"abc" - UTF-8 字符串字面量:
u8"abc" - UTF-16 字符串字面量:
u"abc" - UTF-32 字符串字面量:
U"abc" - 宽字符串字面量:
L"abc"
- 普通字符串字面量:
字符串字面量中的字符与转义规则,整体上对应字符常量的
s-char规则;通用字符名、八进制转义、十六进制转义同样适用。一个字符串字面量会生成一个具有静态存储期的数组对象,其元素类型由前缀决定。
字符串字面量总是会自动附加一个终止零元素。
多个相邻的字符串字面量会在翻译阶段拼接成一个字符串字面量;若编码前缀组合不合法,则违反约束。
用字符串字面量初始化数组时,不会发生“数组到指针”的转换;此时会按数组初始化规则把内容拷入目标数组。
除这种特殊初始化语境外,字符串字面量在表达式中通常会转换为指向其首元素的指针。
尝试修改字符串字面量对应的数组对象,行为未定义。
IMPORTANT
"abc" 的本体是一个数组,不是指针。只是在大多数表达式位置,它会进一步转换为指向首元素的指针。
常见例子
c
char s[] = "abc"; /* 数组初始化,拷入 {'a','b','c','\0'} */
char *p = "abc"; /* 字面量数组再转换为指针 */
"ab" "cd" /* 翻译期拼接为 "abcd" */
u8"ab" u8"cd" /* 也会拼接 */1
2
3
4
5
2
3
4
5