前言C语言没有字符串类型。所有字符串都是依靠char 连续字符序列 \0 结束符模拟实现。绝大多数字符串 Bug、乱码、越界、段错误根源只有一个缺少 \0 结束符。一、单个字符 char底层本质char 本质是 1 字节整型存的是 ASCII 码字符只是显示形式。单引号 只能存一个字符对应 %c 输出。char c 97; char c a; // 两句完全等价二、C语言字符串唯一标准必考核心合法字符串 连续 char 数组 末尾必须带 \0ASCII0所有字符串函数全部依赖 \0 终止%s 打印strlen、strcpy、strcmp 等没有 \0 —— 就不是字符串只是普通字符数组使用字符串函数必然越界乱码。三、字符数组的两种身份最容易混淆1. 普通字符数组非字符串无 \0不能用 %s、strlen。char arr[] {1,2,3,4,5,6};2. 合法字符串带 \0char arr[] {1,2,3,4,5,6,\0};3. 双引号初始化编译器自动补 \0char arr[] 123456;内存真实存储1 2 3 4 5 6 \0共 7 字节。存储在栈区内容可修改。四、经典错题深度解析char str[6] 123456;这行代码错误原因123456 是 7 字节6字符1隐藏\0但数组只有 6 字节。结果放不下 \0丢失结束符不再是合法字符串使用 %s、strlen 一定会内存越界正确写法char str[7] 123456; char str[] 123456; // 推荐自动计算长度五、字符串常量 完整规则双引号包裹的都是字符串常量原生类型const char[N]存放位置只读常量区不可修改自带隐藏 \0无需手动写六、数组退化规则底层核心字符串常量本来是数组const char[N]绝大多数场景自动退化为指针 const char*。只有 3 种情况不退化保留数组属性sizeof(xxx)xxxchar arr[] xxx; 数组初始化七、字符串指针只读不可改const char *p 123456;p 只存首地址不拷贝数据指向只读常量区严禁修改内容修改直接段错误必须加 const八、终极对比表秒杀所有选择题写法性质可否修改是否合法字符串a单个字符1字节—否a字符串常量2字节不可改是char arr[]123456栈字符数组可改是char str[6]123456栈数组无\0可改否高危错误const char *p123456常量字符串指针不可改是九、完整可运行代码 标准运行结果#include stdio.h #include string.h int main() { // 1. 单个字符 char c a; printf(字符演示%cASCII%d\n\n, c, c); // 2. 错误写法丢失\0 char err_str[6] 123456; printf(错误写法 char[6]sizeof%d\n\n, sizeof(err_str)); // 3. 正确写法1指定长度7 char str[7] 123456; printf(正确写法 char[7]\n); printf(sizeof%d\n, sizeof(str)); printf(strlen%d\n\n, strlen(str)); // 4. 正确写法2自动推导推荐 char arr[] 123456; printf(正确写法 char[]\n); printf(sizeof%d\n, sizeof(arr)); printf(strlen%d\n\n, strlen(arr)); // 5. 常量字符串指针 const char *p 123456; printf(常量指针 strlen%d\n, strlen(p)); return 0; }运行结果字符演示aASCII97 错误写法 char[6]sizeof6 正确写法 char[7] sizeof7 strlen6 正确写法 char[] sizeof7 strlen6 常量指针 strlen6十、全篇终极口诀直接背单引是字符双引带零终字符串七字节六字加一空数组少零必越界指针常量不能动常量三态不退化其余皆变指针用。