🔷 第二章 C++语言基础
📄 一句话概括

字符串常量=双引号包起来的一串字符,比如 "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)就是那个"句号"。

这个机制的两个后果(后面章节会不断用到):

  1. 处理字符串时,程序会一个字符一个字符往下读,直到遇见 \0 才停
  2. 如果某处忘了留 \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 字节这件事,也会在你处理文本文件时反复遇到。

五、常见误区

  1. ""A" 就是 1 字节"——是 2 字节(多一个结束符)。这个"多 1"是所有字符串处理逻辑的起点
  2. "char c = "A"; 应该也行吧"——不行,编译报错。char 只能装一个字符,装不下一串(哪怕只有一个字母)
  3. "字符串常量可以改"——不能。像 "abc" 这样的字面量放在只读区,硬改会崩溃。要能改的字符串得用字符数组或 string 类型(第 6 章之后)
  4. "写中文的时候 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'` 这个特殊标记判断"到这儿结束了"。

相关笔记