char 是 C 语言中最基本、最常用的数据类型之一,它的名字来源于 "character"(字符),但它在底层实际上是一个整型数据。

(图片来源网络,侵删)
char 是什么?
char 是一种用于存储单个字符的数据类型。'A', 'a', '1', , 等都可以用 char 类型来存储。
关键点: 在 C 语言中,字符被存储为数字,这个数字是字符在ASCII 编码表(或更广泛的 Unicode 编码,如 UTF-8)中对应的值。
- 字符
'A'的 ASCII 码是65。 - 字符
'a'的 ASCII 码是97。 - 字符
'0'的 ASCII 码是48。
当你声明一个 char 变量时,计算机实际上分配一个字节的内存(通常是 8 位)来存储这个数字。
如何声明和使用 char 变量?
声明 char 变量非常简单,使用 char 关键字。

(图片来源网络,侵删)
声明和赋值
#include <stdio.h>
int main() {
// 声明一个 char 变量
char grade;
// 赋值:使用单引号括起来的字符
grade = 'A';
// 声明并初始化
char initial = 'J';
char punctuation = '!';
// 声明一个 char 数组(字符串)
char name[] = "Alice";
return 0;
}
注意:
- 字符值必须用单引号 () 括起来,
'A'。 - 如果用双引号 (
"A"),C 语言会将其解释为一个包含'A'和'\0'(字符串结束符)的字符数组(字符串)。
char 的底层:整型特性
char 可以被当作一个很小的整数来使用,这使得 char 在处理字符和进行底层位运算时非常灵活。
示例:打印字符和其 ASCII 码
#include <stdio.h>
int main() {
char c = 'A';
// %c 用于打印字符
printf("The character is: %c\n", c);
// %d 用于打印整数(ASCII码)
printf("The ASCII value of %c is: %d\n", c, c);
return 0;
}
输出:
The character is: A
The ASCII value of A is: 65
这个例子清晰地展示了 char 变量 c 既代表字符 'A',也代表整数 65。
示例:使用 char 进行算术运算
#include <stdio.h>
int main() {
char c1 = 'A';
char c2 = 'a';
// ASCII码差值
int difference = c2 - c1;
printf("The difference between 'a' and 'A' is: %d\n", difference); // 输出 32
// 字符加法
char c3 = c1 + 1; // 'A' + 1 = 66,对应字符 'B'
printf("The character after 'A' is: %c\n", c3); // 输出 B
return 0;
}
char 的三种类型(signed vs unsigned)
char 有三种变体,这取决于它是否能表示负数。
-
signed char:- 默认情况下,
char是否为signed取决于编译器(在大多数现代系统上是signed)。 - 它占用 1 个字节(8 位)。
- 范围:-128 到 127。
- 最高位(第 7 位)是符号位,
0表示正,1表示负。
- 默认情况下,
-
unsigned char:- 明确指定为无符号。
- 它占用 1 个字节(8 位)。
- 范围:0 到 255。
- 所有位都用来表示数值,没有负数。
-
char(plain char):- 这是默认的
char类型。 - 它的行为可能是
signed char,也可能是unsigned char,具体由编译器决定。 - 最佳实践:如果你需要明确处理有符号或无符号的数值,应该使用
signed char或unsigned char,如果你只想存储字符,使用char即可。
- 这是默认的
示例:signed char vs unsigned char 的区别
#include <stdio.h>
int main() {
signed char sc = -1; // 11111111 in binary (two's complement)
unsigned char uc = -1; // -1 is converted to its unsigned form: 255 (11111111 in binary)
// %d 用于打印 signed int
// %u 用于打印 unsigned int
// %hhd 用于打印 signed char
// %hhu 用于打印 unsigned char
printf("signed char -1 is: %hhd\n", sc); // 输出: -1
printf("unsigned char -1 is: %hhu\n", uc); // 输出: 255
return 0;
}
char 与字符串
单个 char 只能存储一个字符,而字符串("hello")是由多个字符组成的,并且在末尾有一个特殊的空字符 ('\0') 来表示字符串的结束。
空字符的 ASCII 码是 0。
示例:字符串的内部表示
#include <stdio.h>
int main() {
// 字符串 "Hello" 在内存中实际是这样存储的:
// 'H' | 'e' | 'l' | 'l' | 'o' | '\0'
// 72 | 101| 108| 108| 111| 0
char greeting[] = "Hello";
printf("The string is: %s\n", greeting);
printf("The first character is: %c\n", greeting[0]); // H
printf("The ASCII of the null terminator is: %d\n", greeting[5]); // 0
return 0;
}
常用函数
处理 char 和字符串时,C 标准库 <ctype.h> 和 <string.h> 提供了许多有用的函数。
来自 <ctype.h> 的函数(用于字符分类)
#include <stdio.h>
#include <ctype.h> // 必须包含此头文件
int main() {
char c1 = 'A';
char c2 = '5';
char c3 = 'z';
printf("Is '%c' alphanumeric? %d\n", c1, isalnum(c1)); // 1 (true)
printf("Is '%c' a digit? %d\n", c2, isdigit(c2)); // 1 (true)
printf("Is '%c' lowercase? %d\n", c3, islower(c3)); // 1 (true)
printf("Uppercase of '%c' is: %c\n", c3, toupper(c3)); // Z
return 0;
}
来自 <string.h> 的函数(用于字符串操作)
#include <stdio.h>
#include <string.h> // 必须包含此头文件
int main() {
char str1[50] = "Hello, ";
char str2[] = "World!";
// strcat: 连接字符串
strcat(str1, str2);
printf("Concatenated string: %s\n", str1); // Hello, World!
// strlen: 获取字符串长度 (不包括 '\0')
printf("Length of str1: %zu\n", strlen(str1)); // 12
// strcpy: 复制字符串
char str3[50];
strcpy(str3, str1);
printf("Copied string: %s\n", str3); // Hello, World!
return 0;
}
注意:strlen 返回 size_t 类型,这是一个无符号整数类型,最好使用 %zu 来格式化打印。
| 特性 | 描述 |
|---|---|
| 用途 | 存储单个字符(如 'A', '1')。 |
| 本质 | 底层是一个 1 字节的整数,存储的是字符的编码值(如 ASCII)。 |
| 声明 | char myChar = 'Z'; |
| 变体 | signed char (-128 to 127), unsigned char (0 to 255), char (取决于编译器)。 |
| 字符串 | 字符串是 char 数组,以 '\0'
|
| 相关库 | <ctype.h> (字符分类), <string.h> (字符串操作)。 |
掌握 char 的整型特性是理解 C 语言底层工作方式的关键一步,它也是处理文件 I/O、网络协议和系统编程的基础。
