C 语言速查表
最后更新
Hello World 和程序结构
每个 C 程序都从 main 开始,并返回一个 int。
| 元素 | 代码 |
|---|---|
| 引入头文件 | #include <stdio.h> |
| 程序入口 | int main(void) { ... } |
| 带命令行参数 | int main(int argc, char *argv[]) { ... } |
| 打印一行 | printf("Hello, World!\n"); |
| 返回成功 | return 0; |
| 单行注释 | // comment |
| 块注释 | /* comment */ |
数据类型
类型大小取决于平台,下面列出的是标准保证的最小值。
| 类型 | 说明 |
|---|---|
int | 整数,至少 16 位(通常为 32 位) |
unsigned int | 非负整数 |
long / long long | 更宽的整数(至少 32 / 64 位) |
float / double | 单精度 / 双精度浮点数 |
char | 单字节,也用来表示字符 |
_Bool(通过 <stdbool.h> 使用 bool) | true 或 false |
size_t | 表示大小和索引的无符号类型 |
void | 无类型,用于函数和通用指针 |
printf 和 scanf 格式说明符
与每个参数类型对应的占位符。
| 说明符 | 对应类型 |
|---|---|
%d / %i | 有符号 int |
%u | 无符号 int |
%ld / %lld | long / long long |
%f | double(在 printf 中也用于 float) |
%.2f | 保留 2 位小数的 double |
%c | 单个 char |
%s | 字符串(char *) |
%p | 指针地址 |
%x | 以十六进制表示的无符号 int |
%zu | size_t |
运算符
| 运算符 | 含义 |
|---|---|
+ - * / % | 算术运算(% 是整数取余) |
== != | 等于 / 不等于 |
< > <= >= | 比较 |
&& || ! | 逻辑与 / 或 / 非 |
& | ^ ~ << >> | 按位与、或、异或、取反、移位 |
++ -- | 自增 / 自减 |
+= -= *= /= | 复合赋值 |
cond ? a : b | 三元条件运算 |
sizeof(x) | 类型或变量占用的字节数 |
控制流程
| 语句 | 语法 |
|---|---|
| if / else | if (x > 0) { ... } else { ... } |
| else if | else if (x == 0) { ... } |
| switch | switch (n) { case 1: ...; break; default: ...; } |
while 循环 | while (i < n) { ... } |
do-while 循环 | do { ... } while (i < n); |
for 循环 | for (int i = 0; i < n; i++) { ... } |
| break / continue | break; 退出循环,continue; 跳到下一次迭代 |
| goto(很少用) | goto label; ... label: |
函数
先声明再使用,或者在文件顶部添加函数原型。
| 操作 | 语法 |
|---|---|
| 定义函数 | int add(int a, int b) { return a + b; } |
| 函数原型(声明) | int add(int a, int b); |
| 无返回值 | void greet(void) { ... } |
| 无参数 | int rand_seed(void) { ... } |
| 通过指针传参(修改原值) | void inc(int *p) { (*p)++; } |
| 传入数组 | int sum(int arr[], int n) { ... } |
| static(仅限本文件) | static int helper(void) { ... } |
指针和内存
指针保存的是地址。堆内存必须手动释放。
| 操作 | 语法 |
|---|---|
| 声明指针 | int *p; |
| 取地址 | p = &x; |
| 解引用(读 / 写) | int y = *p; / *p = 10; |
| 空指针 | int *p = NULL; |
| 在堆上分配内存 | int *a = malloc(n * sizeof(int)); |
| 分配并清零 | int *a = calloc(n, sizeof(int)); |
| 调整已分配内存的大小 | a = realloc(a, newSize); |
| 释放堆内存 | free(a); |
| 指针运算 | *(a + i) 等同于 a[i] |
数组和字符串
C 语言中的字符串是以 \0 结尾的 char 数组。
| 操作 | 语法 |
|---|---|
| 声明数组 | int nums[5]; |
| 初始化数组 | int nums[] = {1, 2, 3}; |
| 访问元素 | nums[0] = 10; |
| 数组长度(栈上数组) | sizeof(nums) / sizeof(nums[0]) |
| 字符串字面量 | char s[] = "hello"; |
| 字符串长度 | strlen(s)(不含 \0) |
| 复制字符串 | strcpy(dst, src); |
| 比较字符串 | strcmp(a, b) == 0 表示相等 |
| 拼接字符串 | strcat(dst, src); |
结构体和常用标准库
| 操作 | 语法 |
|---|---|
| 定义结构体 | struct Point { int x; int y; }; |
| 声明并访问 | struct Point p; p.x = 1; |
| 通过指针访问 | p->x = 1;(等同于 (*p).x) |
| 类型别名 | typedef struct Point Point; |
| 读取输入 | scanf("%d", &n); |
| 字符串转整数 | int n = atoi("42"); |
| 绝对值 / 幂运算 | abs(x)(int),pow(x, y) 来自 <math.h> |
| 数组排序 | qsort(arr, n, sizeof(int), cmp); |
最常用的 C 语法、格式说明符和指针写法,全部放在一页上。这份 C 语言速查表是写 C 代码时的快速参考:数据类型、printf/scanf 格式说明符、运算符、控制流程,以及最容易出错的指针和内存操作。
这里的内容都是标准 C(C99/C11),可以用 gcc 或 clang 编译。复制你需要的代码,或者在 C 在线编辑器里直接运行任意代码片段,无需安装编译器。正在学 C 语言?Coddy 的免费交互式 C 语言课程会带你动手掌握指针、内存和标准库。
C 语言速查表常见问题
这份 C 语言速查表免费吗?
免费。这份 C 语言速查表完全免费,无需注册。收藏起来,需要查类型、格式说明符或指针操作时随时回来看。
C 语言中的栈和堆有什么区别?
malloc 或 calloc 显式分配,一直存在到你调用 free 为止,适用于需要比当前函数活得更久、或者大小在运行时才能确定的内存。忘记 free 堆内存会导致内存泄漏。为什么 scanf 需要 & 符号,而 printf 不需要?
scanf 要把值写回你的变量,所以需要变量的地址,&x 给的就是地址。printf 只读取值,所以直接传值本身。字符串是例外:char 数组本身就会退化为指针,所以写 scanf("%s", name) 时不加 &。可以在线练习 C 语言吗?
可以。打开 C 在线编辑器,就能在浏览器里编译并运行这份速查表中的任意代码片段,无需安装编译器。如果你想系统学习,Coddy 的免费交互式 C 语言课程会一步步带你从变量和循环学到指针和内存管理。
这份速查表适合初学者吗?
适合。它从最常用的基础内容(类型、printf、控制流程)一直讲到进阶内容(指针、内存、结构体),你第一天就能用上前面的部分,再慢慢掌握后面的内容。