⭐ 目录
C 语言是什么
程序结构与 main 函数
变量与数据类型
常量
运算符
输入 / 输出
条件判断
循环
数组
字符串
指针(重点)
函数(含传值/传地址)
结构体 struct
内存四区(栈/堆/全局区/常量区)
动态内存 malloc/free
文件操作
编译与链接
预处理指令
C 语言常见错误与易错点
综合小例子
1️⃣ C 语言是什么
一门结构化、过程式语言
底层、高性能、控制内存
是 操作系统、嵌入式、Linux、驱动、游戏引擎 的基础
C++、Python、Java 的底层都受到 C 的影响
2️⃣ 程序基本结构
#include <stdio.h>
int main() {
printf("Hello C");
return 0; // 0 表示正常结束
}
关键点
#include <...>:预处理,包含头文件main:程序入口printf()需要<stdio.h>
3️⃣ 变量与数据类型
4️⃣ 常量
const int MAX = 100;
#define PI 3.14
5️⃣ 运算符
算术
+ - * / %
关系
== != > < >= <=
逻辑
&& || !
位运算(C 的核心,面试常考)
& | ^ << >>
6️⃣ 输入输出 I/O
输出:
printf("age=%d, score=%.2f", age, score);
输入:
scanf("%d", &age); // 注意,要取地址!
7️⃣ 条件判断
if (a > 10) {
...
} else if (a == 10) {
...
} else {
...
}
8️⃣ 循环
for
for(int i = 0; i < 10; i++) {
printf("%d", i);
}
while
while(x < 5) {
x++;
}
do-while
do {
x++;
} while(x < 5);
9️⃣ 数组
int a[5] = {1,2,3,4,5};
printf("%d", a[0]);
数组名就是首地址的常量指针(不能修改)
🔟 字符串(实际是 char 数组)
char s1[] = "hello";
char s2[10] = "hi";
字符串函数:
strlen()
strcpy()
strcmp()
strcat()
这些在 <string.h> 中。
1️⃣1️⃣ 指针(C 语言灵魂)
指针是“存放地址的变量”。
int a = 10;
int *p = &a;
printf("%d", *p); // 解引用,得到 a 的值
指针与数组
int arr[3] = {1,2,3};
int *p = arr; // arr 就是 arr[0] 地址
printf("%d", *(p+1)); // 2
指针是 C 语言最强大的机制:
传地址(解决传值的问题)
操作数组
动态内存(malloc/free)
链表、树等数据结构
操作硬件寄存器(嵌入式)
1️⃣2️⃣ 函数
int add(int a, int b) {
return a + b;
}
传值调用(默认)
void change(int x) {
x = 100;
}
传地址(能改变原值)
void change(int *p) {
*p = 100;
}
1️⃣3️⃣ 结构体 struct
struct Person {
int age;
char name[20];
};
struct Person p = {18, "Tom"};
指针版:
struct Person *sp = &p;
sp->age = 20;
1️⃣4️⃣ 内存四区(非常重要)
1️⃣5️⃣ 动态内存 malloc/free
int *p = (int*)malloc(sizeof(int) * 5);
p[0] = 10;
free(p);
一定要 free,否则泄漏。
1️⃣6️⃣ 文件操作
FILE *fp = fopen("a.txt", "r");
char buf[100];
fgets(buf, 100, fp);
fclose(fp);
1️⃣7️⃣ 编译与链接
C 语言编译过程:
预处理(处理 #include/#define)
编译 → 生成 .o
链接 → 合并库和目标文件
Linux 编译:
gcc main.c -o main
1️⃣8️⃣ 预处理指令
#include
#define
#ifdef
#ifndef
#endif
1️⃣9️⃣ 常见易错点
❌ 忘了给 scanf 取地址
scanf("%d", num); // 错
scanf("%d", &num); // 对
❌ 指针忘记初始化
❌ malloc 后忘记 free
❌ 越界访问数组
❌ 字符串未以 '\0' 结束
❌ 使用释放后的指针(悬空指针)
2️⃣0️⃣ 综合例子:交换两个变量
❌ 错误:传值调用无效
void swap(int a, int b) {
int t = a;
a = b;
b = t;
}
✅ 正确:传地址
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int main() {
int x = 1, y = 2;
swap(&x, &y);
printf("%d %d", x, y); // 2 1
}
评论