char是1字节整型,非字符容器;其值为ascii码等整数,解释为字符取决于上下文;需显式声明signed/unsigned;char数组须含'\0'才是c字符串;char*是否有效字符串取决于所指内存是否含合法'\0';char无法原生处理unicode,中文等需宽字符或专用库。

char 是整数类型,不是“字符容器”
在 C++ 里 char 本质是 1 字节宽的整型,能表示 -128~127(有符号)或 0~255(无符号),取决于编译器默认和平台。它不自带“字符语义”,只是碰巧常被用来存 ASCII 码值。
- 你写
'a',编译器实际塞进去的是整数 97;'\n'是 10;'€'在窄字符里可能截断或触发多字节编码问题 -
char不等于“一个可读文字”,它只负责存一个字节——要不要解释成字符、怎么解释,全靠上下文(比如 printf 的%cvs%d) - 别假设
char总是有符号:用signed char或unsigned char显式声明更安全,尤其做位运算或范围判断时
char 数组 ≠ 字符串,空终止符才是关键
定义 char buf[10] 只是一块 10 字节内存,只有当你手动或函数写入 '\0' 且位置合法时,它才被 C 风格字符串函数(如 strlen、strcpy)识别为字符串。
- 常见错误:
char s[] = {'h','e','l','l','o'};—— 没'\0',printf("%s", s)会越界读内存直到撞上随机零字节 -
char s[] = "hello";自动补'\0',等价于{'h','e','l','l','o','\0'},长度是 6 - 用
std::string替代裸char数组,避免手动管理终止符和长度
char* 指向哪,决定了它能不能当字符串用
char* 本身只是地址,它指向的内容是否构成有效 C 字符串,完全取决于那块内存里有没有合法的 '<p><code>char* 本身只是地址,它指向的内容是否构成有效 C 字符串,完全取决于那块内存里有没有合法的 '\0' 终止符,以及你有没有越界访问。
- 指向字面量:
char* p = "hello";—— 安全,但不能改内容(修改触发未定义行为) - 指向栈数组:
char buf[10] = "hi"; char* p = buf;—— 可读可写,前提是操作不越界 - 指向堆内存:
char* p = new char[10]; strcpy(p, "test");—— 必须确保分配足够空间(含'\0'),且记得delete[] p - 悬空指针、未初始化指针、指向非零结尾内存的
char*,传给strlen或printf("%s")就崩
宽字符、UTF-8、多字节——char 处理不了中文等 Unicode
char 单字节,天然无法表示 UTF-8 中文(通常 3 字节)、UTF-16(至少 2 字节)或 UTF-32(4 字节)。强行用 char* 存中文字符串,只是把多字节序列当普通字节流处理,strlen 返回的是字节数,不是字符数。
-
char s[] = "你好";在 UTF-8 下占 6 字节,strlen(s)返回 6,但只有 2 个字符 - 想正确处理 Unicode 字符,得用
char16_t/char32_t+std::u16string/std::u32string,或依赖 ICU、UTF8-CPP 等库解析char序列 - 跨平台项目慎用 locale 依赖的
mbstowcs,Windows 和 Linux 对 GBK/UTF-8 的默认行为差异大
真正麻烦的不是怎么写,而是很多人直到遇到中文乱码、strlen 返回异常值、或 strcmp 比较失败才意识到:自己一直把 char 当“字符”用,但它从来就只是字节。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











