火星科技网您的位置:首页 >科普解惑 > 知识分享 >

C 语言中 char 的用法 类型详解实战

导读 C 语言里 char 本质是一个单字节的整型类型,并不是单纯只能存放字符,它底层存储的是字符对应的 ASCII 编码数值,这是理解 C 语言

C 语言里 char 本质是一个单字节的整型类型,并不是单纯只能存放字符,它底层存储的是字符对应的 ASCII 编码数值,这是理解 C 语言中 char 的用法最关键的核心,很多初学者误以为 char 只能存字母符号,实际上 char 可以当成小范围整数来做算术运算,也可以用来存放单个字符,还可以组合成 char 数组也就是字符串。char 默认是有符号还是无符号,这个由编译器平台决定,大部分 x86 环境默认 signed char,取值范围是负 128 到正 127,unsigned char 取值范围是 0 到 255,这个特性会直接影响数值运算和判断结果,也是学习 C 语言中 char 的用法经常踩坑的地方。C 语言中 char 的用法覆盖单个字符存储 字符串数组 字节数据处理 类型强制转换 缓冲区定义这些场景,是入门基础类型,后续指针 文件读写 内存操作都会大量用到 char,把 char 吃透之后,理解字符串处理函数就会轻松很多。

char 基础定义与分类

三种声明形式

signed char 有符号字符型,范围负 128 到 127

unsigned char 无符号字符型,范围 0 到 255

char 原生 char,等价于 signed char 或者 unsigned char,由编译器决定

存储原理

字符在内存里面保存的是 ASCII 码数字,比如字符 A 对应的 ASCII 值是 65,写 char c = 'A',内存实际保存的数值就是 65,所以 char c = 65,打印的时候用字符格式输出,同样可以显示 A。

初始化方式清单

单个字符初始化 char ch = 'a'

直接写 ASCII 数值初始化 char ch = 97

unsigned char 声明 unsigned char uc = 200

字符数组初始化 char str [] = "hello"

常见使用场景

场景一 单个字符输入输出

使用 printf 的 % c 格式符输出 char,scanf 使用 % c 读取单个字符,这里要注意 scanf 读取 % c 的时候,会接收上一次残留的回车换行符,这是高频坑点,需要提前处理缓冲区残留字符。

场景二 char 数组实现字符串

C 语言没有专门的字符串类型,字符串就是以 '\0' 作为结束标记的 char 数组,这是 C 语言中 char 的用法最重要的应用,字符串处理函数 strlen strcpy strcat 全部都是基于 char 数组,依靠末尾的结束符识别字符串边界,如果忘记添加结束符,函数读取会越界。

场景三 当做小整数运算

因为 char 底层是整数,可以直接加减运算,比如 char ch = 'A' ch 加 1 之后变成 ASCII 66 也就是字符 B,可以实现大小写转换,大写字母加 32 转小写,小写减 32 转大写。

场景四 unsigned char 处理原始字节数据

处理图像 二进制文件 原始内存字节的时候,一般使用 unsigned char,因为有符号 char 大于 127 的值会变成负数,做位运算和字节判断容易出错,所以二进制字节数据优先选用 unsigned char。

场景五 char 指针

char 指针是最常用的指针类型,用来指向字符串首地址,区分 char 数组和 char 指针的区别,数组是一块固定内存,char 指针可以指向字符串常量,字符串常量本身是只读内存,不能通过指针修改内容,这个也是经典考点。

signed char unsigned char char 对比表

类型取值范围适用场景特点
signed char负 128 到 127普通字符 带符号小整数默认多数平台是这个
unsigned char0 到 255原始字节 二进制数据 位运算不会出现负数
char跟随平台默认常规字符书写跨平台行为不确定

深度易错要点

第一点 单引号和双引号区别,单引号里面是单个 char 字符,双引号是字符串,末尾自带 '\0',不能把双引号字符串直接赋值给单个 char 变量。

第二点 转义字符,char 可以存放转义字符,比如换行 制表符 空字符 '\0',空字符就是字符串结束标记,属于 char 类型。

第三点 类型提升,char 参与算术运算的时候,会自动提升成 int 类型再计算,这个是整数提升规则,运算结果不一定还能放回 char,超出范围会发生截断。

第四点 溢出问题,signed char 最大值是 127,如果继续加 1,会溢出变成负 128,出现回绕现象,写循环计数的时候要留意这个特性。

第五点 char 和 wchar_t 区分,char 是单字节字符,wchar_t 是宽字符,用来保存中文这类多字节字符,不要混淆,普通 char 存放中文会占用多个字节。

【常见问题】

问题 1 C 语言中 char 的用法里面,char 是不是只能保存字符

回答 1 C 语言中 char 的用法里面,char 底层属于单字节整型,并不是只能保存字符,它本质存储 ASCII 数值,可以当做小范围整数参与算术运算,同时也可以保存单个字符。

问题 2 C 语言中 char 的用法里面,char 数组为什么一定要有结束符

回答 2 C 语言中 char 的用法里面,C 语言没有原生字符串类型,字符串依靠 char 数组末尾 '\0' 结束符判断边界,标准字符串函数全部依靠这个结束符识别字符串长度,缺少结束符会造成内存越界读取。

问题 3 C 语言中 char 的用法里面,signed char 和 unsigned char 什么时候选择

回答 3 C 语言中 char 的用法里面,普通字符处理可以使用默认 char,如果是处理二进制原始字节做位运算,推荐 unsigned char,避免数值超过 127 变成负数带来逻辑错误。

问题 4 C 语言中 char 的用法里面,scanf 读取 char 为什么经常读到回车

回答 4 C 语言中 char 的用法里面,scanf 使用 % c 读取 char 的时候,不会自动跳过空白字符,上一次输入留下的回车换行符会被当成有效字符读入,需要额外处理输入缓冲区残留内容。

【免责申明】

本文讲解 C 语言中 char 的用法,char 默认符号属性依赖编译器和平台,不同架构编译器默认行为可能不同,整数提升溢出相关表现符合 C 标准通用规则,代码示例仅作为学习参考,实际项目请结合目标平台验证,本文不保证所有特殊编译选项下表现完全一致。