C 语言中的 char 是基础整型类型,本质不是单纯的字符,它占用 1 个字节也就是 8 位内存,既可以保存单个字符,也可以保存小范围整数,字符在计算机里面是按照 ASCII 编码存储,也就是字符对应一个数字编码,比如大写 A 对应的编码是 65。char 分为 signed char 有符号 char 和 unsigned char 无符号 char 两种,默认编译器一般把 char 当成 signed char,取值范围是负 128 到正 127,unsigned char 范围是 0 到 255,这个区别在处理扩展编码、像素数据、字节数据的时候非常关键。char 最常见用法是定义单个字符变量、定义字符数组也就是字符串,配合 printf 和 scanf 做字符输入输出,同时因为它底层是整数,也可以参与加减运算,实现大小写转换、字符编码计算,这也是 C 语言 char 非常有特色的一点。
一 基础定义与赋值
定义单个字符变量写法 char ch;
字符常量赋值必须使用单引号,例如 ch = 'A';
也可以直接赋值 ASCII 数字,例如 ch = 65; 效果和 'A' 完全一样
转义字符赋值,比如 ch = '\n'; 代表换行,ch = '\0'; 是空字符,字符串结束标记
二 signed char 和 unsigned char 对比表
| 类型 | 是否带符号 | 位数 | 取值范围 | 典型用途 |
|---|---|---|---|---|
| signed char | 有符号 | 8 位 | -128 ~ 127 | 普通字符、小整数 |
| unsigned char | 无符号 | 8 位 | 0 ~ 255 | 字节数据、图像像素、扩展 ASCII |
重点提醒,不同编译器默认 char 是否带符号不是绝对统一,跨平台开发如果需要明确符号属性,最好显式写成 signed char 或者 unsigned char,不要依赖默认行为。
三 char 数组 字符串用法
char 数组就是连续多个 char 单元,C 语言没有独立字符串类型,字符串就是以 '\0' 作为结束标记的 char 数组。
定义写法 char str [20];
初始化写法 char str [] = "hello";
双引号是字符串常量,系统会自动在末尾追加 '\0',单引号是单个字符,二者不能混淆。
输入输出:scanf 读取单个字符用 % c,读取字符串用 % s,printf 输出单个字符 % c,输出字符串 % s。
四 字符运算深度要点
因为 char 底层是整数编码,可以直接做算术运算。
大写转小写原理,小写字母 ASCII 比大写大 32,ch = ch + 32;
也可以用 ch = ch - 'A' + 'a';
字符比较,直接用大于小于等于号比较,本质就是比较 ASCII 编码数值。
char 参与表达式运算的时候,会自动提升成 int 类型再计算,这个是整型提升规则。
五 输入输出与常见坑点
scanf ("% c", &ch); 读取单个字符的时候,不会自动跳过空格回车,缓冲区残留换行符会被当成字符读入,解决办法是格式符前面加空格,写成 scanf ("% c", &ch);
字符常量单引号里面只能放一个字符,如果写多个字符属于多字符常量,属于特殊实现,初学不要使用。
char 存储超过范围数值会发生截断,比如给 signed char 赋值 200,会变成负数,这个是非常常见的错误。
'\0' 空字符编码是 0,是判断字符串结尾的标志,如果 char 数组没有这个结束标记,strlen printf% s 就会越界读取,出现乱码。
六 其他扩展用法
作为函数参数,传递单个字符或者字节数据
作为位操作变量,对单个字节做按位与按位或运算
缓冲区字节单元,串口通信 文件读写里面,经常用 unsigned char 接收原始字节
七 常见误区
误区一 char 只能存字符,不能存数字,错误,本质是 8 位整型
误区二 单引号和双引号可以混用,错误,单引号单个字符,双引号字符串
误区三 char 永远是有符号,错误,可以显式声明 unsigned char
【常见问题】
问题 1 C 语言中的 char 具体用法 char 为什么可以做加减运算
回答 1 C 语言中的 char 具体用法,char 本质是 8 位整型,存储的是 ASCII 编码数值,所以可以直接参与加减运算,比如大小写转换就是利用大小写字母编码差值 32 计算。
问题 2 C 语言中的 char 具体用法 signed char 和 unsigned char 范围差别是什么
回答 2 C 语言中的 char 具体用法,signed char 范围负 128 到 127,最高位是符号位,unsigned char 没有符号位,全部 8 位存数值,范围 0 到 255,处理原始字节数据推荐 unsigned char。
问题 3 C 语言中的 char 具体用法 scanf 读取 char 字符为什么会读到回车
回答 3 C 语言中的 char 具体用法,% c 读取单个字符不会跳过空白字符,输入缓冲区残留回车换行就会被读入,可以在 % c 前面加空格,跳过空白再读取字符。
问题 4 C 语言中的 char 具体用法 char 数组为什么必须要有 '\0'
回答 4 C 语言中的 char 具体用法,C 语言字符串依靠 '\0' 识别结尾,没有结束标记的 char 数组,使用 strlen 或者 printf% s 的时候会一直向后读取内存,造成乱码或者越界。
【免责申明】
本文是 C 语言中的 char 具体用法相关基础知识讲解,编译器默认 char 符号属性、整型提升行为在不同平台存在细微差异,示例代码仅用于学习演示,字节通信、图像数据处理项目需要结合编码规范设计,程序溢出和编码异常由开发者自行排查处理。


