⭐ 目录

  1. C 语言是什么

  2. 程序结构与 main 函数

  3. 变量与数据类型

  4. 常量

  5. 运算符

  6. 输入 / 输出

  7. 条件判断

  8. 循环

  9. 数组

  10. 字符串

  11. 指针(重点)

  12. 函数(含传值/传地址)

  13. 结构体 struct

  14. 内存四区(栈/堆/全局区/常量区)

  15. 动态内存 malloc/free

  16. 文件操作

  17. 编译与链接

  18. 预处理指令

  19. C 语言常见错误与易错点

  20. 综合小例子


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️⃣ 变量与数据类型

类型

大小(常见)

示例

char

1字节

char c = 'A';

int

4字节

int a = 10;

float

4字节

float f = 3.14;

double

8字节

double d = 3.14;

short

2字节

long

4或8字节


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️⃣ 内存四区(非常重要)

区域

特点

栈区 stack

存放局部变量,生命周期随函数结束

堆区 heap

malloc/free 手动管理

全局区

全局变量、静态变量

常量区

字面量字符串、常量


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 语言编译过程:

  1. 预处理(处理 #include/#define)

  2. 编译 → 生成 .o

  3. 链接 → 合并库和目标文件

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
}