📄 一句话概括
字符串常量=双引号包起来的一串字符,比如 "abc"、"Hello, C++!"。最关键的一点:编译器会在末尾自动补一个看不见的结束符 '\0'——所以你写 3 个字符,内存里实际占 4 字节。strlen("ABC") 得 3(不数结束符),sizeof("ABC") 得 4(含结束符)。别把 'A' 和 "A" 搞混:前者是字符(1 字节),后者是字符串(2 字节)。
一、怎么写
"abc" // 普通字符串
"Hello, C++!" // 带标点也行
"" // 空字符串(照样占 1 字节:只有结束符)
"中文也可以" // UTF-8 下每个汉字占 3 字节
"他说:\"你好\"" // 想在里面写双引号,要转义
"第一行\n第二行" // 转义字符在字符串里同样有效
相邻的字符串会自动拼接(写长字符串时很有用):
cout << "这是很长的一句话,"
"我把它分成两行写。" << endl; // 输出连成一整句
二、那个看不见的 '\0'
| 你写的 | 内存里实际存的 | 占几字节 |
|---|---|---|
"A" |
A + \0 |
2 |
"ABC" |
A + B + C + \0 |
4 |
"" |
\0 |
1 |
为什么非要加这个 \0:计算机需要知道"字符串到哪儿结束"。它不像数组那样自带长度信息,只能靠一个特殊标记收尾——'\0'(ASCII 值为 0)就是那个"句号"。
这个机制的两个后果(后面章节会不断用到):
- 处理字符串时,程序会一个字符一个字符往下读,直到遇见
\0才停 - 如果某处忘了留
\0,程序就会一路读下去,读到别的内存里,产生乱码甚至崩溃——这是 C 语言时代最经典的 bug 来源
三、字符常量 vs 字符串常量(本节最要背的一张表)
| 字符常量 | 字符串常量 | |
|---|---|---|
| 写法 | 'A' 单引号 |
"A" 双引号 |
| 内容 | 恰好一个字符 | 任意长度(含 0 个) |
| 占字节 | 1 | 字符数 + 1 |
能否赋给 char |
能:char c = 'A'; |
不能:char c = "A"; ✗ 报错 |
| 类型 | char |
字符数组 / const char* |
记忆口诀:单引号小、双引号大——一个字符用单,一串字符用双。
四、动手 Demo:用 sizeof 数一数字节
新建 strconst.cpp:
#include <iostream>
using namespace std;
int main() {
cout << "sizeof(\"A\") = " << sizeof("A") << endl;
cout << "sizeof(\"ABC\") = " << sizeof("ABC") << endl;
cout << "sizeof(\"\") = " << sizeof("") << endl;
cout << "sizeof(\"中\") = " << sizeof("中") << endl;
return 0;
}
看到什么算成功:
sizeof("A") = 2
sizeof("ABC") = 4
sizeof("") = 1
sizeof("中") = 4 ← UTF-8 下汉字占 3 字节 + 结束符
这三行结果,就是"隐藏结束符"的铁证——每个结果都比"你看到的字符数"多 1。
sizeof 是 C++ 的运算符,直接问"这个东西占几字节"(2.4 讲数据类型时细说)。
30 秒实验:把 sizeof 的结果和你数出来的字符数逐个对比,全部差 1。再试试 sizeof("你好"),看看是不是 7(3+3+1)——中文占 3 字节这件事,也会在你处理文本文件时反复遇到。
五、常见误区
- "
"A"就是 1 字节"——是 2 字节(多一个结束符)。这个"多 1"是所有字符串处理逻辑的起点 - "
char c = "A";应该也行吧"——不行,编译报错。char只能装一个字符,装不下一串(哪怕只有一个字母) - "字符串常量可以改"——不能。像
"abc"这样的字面量放在只读区,硬改会崩溃。要能改的字符串得用字符数组或string类型(第 6 章之后) - "写中文的时候
sizeof就是字符数"——不是。UTF-8 下一个汉字 3 字节,所以sizeof("中文")是 7 不是 3。做文本长度统计时(比如"限定 20 字")要留意这个差别
自测四问(点开对答案)
1. `"ABC"` 占几字节?为什么?——**4 字节**:3 个字符 + 1 个自动补上的结束符 `'\0'`。 2. `strlen` 和 `sizeof` 对一个字符串的结果差在哪?——`strlen` 数**有效字符数**(不含 `\0`);`sizeof` 数**总占字节数**(含 `\0`)。 3. `'A'` 和 `"A"` 分别占几字节?——`'A'` 占 1 字节;`"A"` 占 2 字节。 4. 为什么字符串需要一个结束符?——计算机不知道字符串有多长,靠 `'\0'` 这个特殊标记判断"到这儿结束了"。- ☑ 其他常量