🌟 零基础入门 C 语言基础知识(含面试题):结构体、联合体、枚举、链表、环形队列、指针全解析!
C 语言是所有程序员通向“系统世界”的第一把钥匙。很多嵌入式开发、操作系统内核、网络通信、图形引擎,背后都是 C 语言在支撑。
这篇文章适合零基础入门,内容涵盖:
- 什么是结构体、联合体、枚举?
- 链表和环形队列怎么用?
- 指针到底有多重要?怎么区分函数指针、指针函数、指针数组、数组指针?
- 面试会问什么?我该怎么答?
📦 1. 结构体(struct
):让多个变量抱团出道!
✅ 什么是结构体?
结构体可以把不同类型的变量打包在一起,用于描述“一个实体”的多个属性。
struct Student {
char name[50];
int age;
float score;
};
✅ 如何使用?
struct Student s1 = {"Alice", 20, 95.5};
printf("Name: %s, Age: %d, Score: %.2f\n", s1.name, s1.age, s1.score);
❓面试常问:
- 结构体和数组有啥区别?
sizeof(struct)
为什么可能大于所有字段之和?(👉 答案:内存对齐)
🔄 2. 联合体(union
):一个房间多个人轮流用
✅ 什么是联合体?
联合体的所有成员共用同一块内存,同时只能存一个值。
union Data {
int i;
float f;
char str[20];
};
✅ 使用演示:
union Data d;
d.i = 42;
d.f = 3.14; // 会覆盖i的值
❓面试常问:
- 联合体和结构体的最大区别是什么?
- 联合体的大小是多少?(👉 答案:最大成员的大小 + 对齐)
🧾 3. 枚举(enum
):给数字起个好记的名字
✅ 枚举的作用?
枚举是一个有名字的常量集合,让代码更易读。
enum Color {RED, GREEN, BLUE};
默认 RED=0, GREEN=1…
✅ 使用示例:
enum Color c = GREEN;
printf("Color = %d\n", c); // 输出 1
❓面试常问:
- 枚举默认值是啥?能指定吗?
- 枚举和宏
#define
有啥区别?
🔗 4. 链表:动态增删神器
✅ 什么是链表?
链表由多个“节点”组成,每个节点包含数据 + 指向下一个节点的指针。
struct Node {
int data;
struct Node* next;
};
✅ 插入 + 遍历代码示例:
struct Node n1 = {1, NULL};
struct Node n2 = {2, NULL};
n1.next = &n2;
struct Node* p = &n1;
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
❓面试常问:
- 链表和数组的区别?
- 单链表怎么反转?
- 如何检测链表是否有环?(👉 快慢指针法)
🔄 5. 环形队列:数组也能绕起来!
✅ 场景举例:键盘输入、缓冲区、任务调度等
用数组实现队列,并首尾相连,形成一个“环”。
✅ 核心变量:
#define MAX 5
int queue[MAX];
int front = 0, rear = 0;
✅ 入队 & 出队逻辑:
int isFull() { return (rear + 1) % MAX == front; }
int isEmpty() { return front == rear; }
void enqueue(int val) {
if (!isFull()) {
queue[rear] = val;
rear = (rear + 1) % MAX;
}
}
int dequeue() {
if (!isEmpty()) {
int val = queue[front];
front = (front + 1) % MAX;
return val;
}
return -1;
}
❓面试常问:
- 环形队列为什么要浪费一个空间?
- 怎么判断满和空?
🧭 6. 指针:C语言灵魂中的灵魂
✅ 基础:什么是指针?
指针是一个变量,它存储另一个变量的地址。
int a = 10;
int* p = &a;
🧠 四种经典指针概念:
1️⃣ 指针函数:返回指针的函数
int* findMax(int* a, int* b) {
return (*a > *b) ? a : b;
}
2️⃣ 函数指针:指向函数的指针
int add(int a, int b) { return a + b; }
int (*func)(int, int) = add;
printf("%d\n", func(3, 4)); // 调用函数
3️⃣ 指针数组:数组中每个元素是指针
char* names[] = {"Alice", "Bob", "Charlie"};
4️⃣ 数组指针:指向数组的指针
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr;
❓面试常问:
int *a[5]
和int (*a)[5]
有什么区别?- 函数指针有什么用途?(👉 回调函数、注册表驱动)
🎯 总结:知识图谱一图胜千言
结构体 struct → 封装多个不同类型数据
联合体 union → 节省内存,多种解释选其一
枚举 enum → 给常量起名字,易读
链表 Linked List → 动态存储结构,适合插入删除
环形队列 Ring Queue → 固定空间高效队列,循环缓冲
指针 Pointer → 内存操作核心,掌握就掌控C
🧪 附:面试真题汇总(适合大一/大二)
- 结构体和联合体的区别?
sizeof(struct)
和sizeof(union)
有啥规律?- 解释
int *a[10]
和int (*a)[10]
- 实现链表反转函数
- 实现环形队列的入队与出队函数
- 解释函数指针的声明方式
- 使用函数指针实现简易计算器
📚 结语:学好 C 语言,你的底层能力才算合格
C 是最贴近机器的高级语言,掌握它的关键在于理解指针和内存管理。希望这篇博客能帮你少走弯路,直达本质!
如果你喜欢这样的讲解风格,欢迎点赞、收藏或留言,我会继续出更多:
✅ Linux C 项目实战
✅ 内存管理详解
✅ 结构体 + 指针项目应用
✅ 面试 C 语言 100 题整理版