Menu
CoddyTech

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 / %lldlong / long long
%fdouble(在 printf 中也用于 float)
%.2f保留 2 位小数的 double
%c单个 char
%s字符串(char *)
%p指针地址
%x以十六进制表示的无符号 int
%zusize_t

运算符

运算符含义
+ - * / %算术运算(% 是整数取余)
== !=等于 / 不等于
< > <= >=比较
&& || !逻辑与 / 或 / 非
& | ^ ~ << >>按位与、或、异或、取反、移位
++ --自增 / 自减
+= -= *= /=复合赋值
cond ? a : b三元条件运算
sizeof(x)类型或变量占用的字节数

控制流程

语句语法
if / elseif (x > 0) { ... } else { ... }
else ifelse if (x == 0) { ... }
switchswitch (n) { case 1: ...; break; default: ...; }
while 循环while (i < n) { ... }
do-while 循环do { ... } while (i < n);
for 循环for (int i = 0; i < n; i++) { ... }
break / continuebreak; 退出循环,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、控制流程)一直讲到进阶内容(指针、内存、结构体),你第一天就能用上前面的部分,再慢慢掌握后面的内容。

Coddy 编程语言插图

在 Coddy 学习 C

开始