C 风格字符串和字符串字面值 (C-style string and string literal)#
C 风格字符串是一串以 '\0'
结尾的字符. 按照从 C 继承来的约定, char*
和 char const*
虽然是指针, 但很多时候会被认为是 C 风格字符串进行处理.
1char array[] = {'a', 'b', 'c', '\0'};
2
3int const size = std::strlen(array); // 计数直到遇到终止字符 '\0'
4std::cout << array << '\n'; // 输出直到遇到终止字符 '\0'
而形如 "hello"
的写法称为字符串字面值, 是书写 C 风格字符串的便携方法, 它实际是将 "hello"
作为 字符数组 静态存储在一个 只读区域, 因此不能修改它的内容.
1"hello"; // "hello" 的类型是 char[6], 除了 hello, 之后还有终止字符 '\0'.
2
3char const* string = "hello"; // 获取它首元素的指针, 按约定这就被认为是一个字符串
4
5char* string = "hello"; // 警告: 字符串字面值不允许被转换为 char*
6string[1] = 'a'; // 未定义行为!
你可以用一个字符串字面值初始化字符数组.
1char array[] = "hello";
2sizeof(array) == sizeof(char[6]);
3// 相当于:
4char array[6];
5array[0] = 'h';
6array[1] = 'e';
7array[2] = 'l';
8array[3] = 'l';
9array[4] = 'o';
10array[5] = '\0';
1char array[8] = "hello";
2// 相当于:
3array[0] = 'h';
4array[1] = 'e';
5array[2] = 'l';
6array[3] = 'l';
7array[4] = 'o';
8array[5] = '\0';
9array[6] = '\0'; // 之后的部分都会被初始化为 '\0', 即数值 0
10array[7] = '\0';
1char array[5] = "hello"; // 错误: "hello" 需要长度至少为 6