作为一门古老的编程语言,C语言已经坚挺了好几十年了,初学者从 C语言入门,大学将 C语言视为基础课程。不管别人如何抨击,如何唱衰,C语言就是屹立不倒;Java、C#、Python、PHP、Perl 等都有替代方案,它们都可以倒下,唯独 C语言不行。
C 语言是一种通用的、过程式的编程语言,由 Dennis Ritchie 于 1972 年在贝尔实验室开发。它设计初衷是为了重写 UNIX 操作系统,因此具有极高的效率和底层控制能力。
对于大部分程序员,C语言是学习编程的第一门语言,很少有不了解 C 的程序员。
C语言除了能让你了解编程的相关概念,带你走进编程的大门,还能让你明白程序的运行原理,比如,计算机的各个部件是如何交互的,程序在内存中是一种怎样的状态,操作系统和用户程序之间有着怎样的"爱恨情仇",这些底层知识决定了你的发展高度,也决定了你的职业生涯。
下表罗列了 C 语言的主流应用场景:
| 领域 | 典型应用 |
|---|---|
| 系统软件 | 操作系统(如 UNIX、Linux 内核)、驱动程序 |
| 嵌入式开发 | 单片机、智能家居、汽车电子 |
| 高性能应用 | 数据库、游戏引擎、编译器 |
| 跨平台开发 | 底层库、网络协议栈 |
C 语言语法简洁,但概念深入。新手需理解内存地址、指针等底层机制,初期比 Python、Java 等语言陡峭。然而,一旦掌握,再学其他语言会事半功倍。
C语言开发环境选择
C语言的集成开发环境有很多种,尤其是 Windows 下,多如牛毛,初学者往往不知道该如何选择。
这里推荐 2 款 C 语言 IDE,分别是:
1) Visual Studio 2022(重量级,功能强大)
它是微软开发的 Visual Studio(简称 VS),是 Windows 下的标准 IDE,实际开发中大家也都在使用。
不过 VS 有点庞大,安装包有 2~3G,下载不方便,而且会安装很多暂时用不到的工具,安装时间在半个小时左右。
VS2022下载安装和使用教程:
2) Dev-C++(轻量级)
如果你讨厌 VS 的复杂性,那么可以使用 Dev C++。Dev C++ 是一款免费开源的 C/C++ IDE,内嵌 GCC 编译器(Linux GCC 编译器的 Windows 移植版),是 NOI、NOIP 等比赛的指定工具。Dev C++ 的优点是体积小(只有几十兆)、安装卸载方便、学习成本低,缺点是调试功能弱。
Dev C++下载安装和使用教程:
初学者任选其一即可,后续整体把 C 语言知识点学一遍,再接触 GCC 命令行也不迟。
C语言知识点总结
1. 数据类型
数据类型决定变量占用内存大小与解释方式。基本分类如下:
| 类型 | 典型占位(32 位系统) | 示例 |
|---|---|---|
| char | 1 字节 | 存储字母 'A' 或整数 -128~127 |
| int | 4 字节 | 计数器、年龄 |
| float | 4 字节 | 3.14f |
| double | 8 字节 | 精确到 15 位小数的 π |
使用 sizeof(变量) 可查看实际占用字节数,结果因平台而异。
2. 变量与常量
变量是内存中一块可读写区域,必须先声明类型再使用。命名只能由字母、数字、下划线组成,且不能以数字开头。
int age = 18; // 声明并初始化
const float PI = 3.1415926f; // 常量,运行期不可改
注意:未初始化的局部变量值是随机的,务必赋初值。
3. 分支语句
程序靠分支实现判断。C 提供 if-else 与 switch 两套方案。
-
if-else适合区间判断 -
switch适合离散值匹配,效率高且结构清晰int score = 85;
if (score >= 90)
printf("优秀");
else if (score >= 60)
printf("及格");
else
printf("不及格");
4. 循环语句
循环让代码重复执行,C 提供三种风格:
| 类型 | 特点 | 示例场景 |
|---|---|---|
| for | 循环次数已知 | 遍历数组 |
| while | 先判断再执行 | 读取文件直到结尾 |
| do-while | 先执行一次再判断 | 菜单选择至少显示一次 |
for (int i = 0; i < 10; ++i)
printf("%d ", i);
5. 数组
数组是同类型元素的连续集合,下标从 0 开始。
一维数组语法:
类型 数组名[长度] = {初值列表};
二维数组可看作矩阵:
int a[2][3] = {{1,2,3}, {4,5,6}};
printf("%d", a[1][2]); // 输出 6
注意:数组名在表达式中会退化为指针,sizeof(数组名) 得到整个字节数,而函数传参后退化为指针,丢失长度信息,需额外传递长度。
6. 指针
指针是 C 的灵魂,它存储变量的内存地址。声明时在类型后加 *,取地址用 &,解引用用 *。
int x = 10;
int *p = &x; // p 指向 x
*p = 20; // 通过 p 修改 x 的值为 20
指针与数组关系密切:数组名即首元素地址,因此可用指针算术遍历数组。
int arr[5] = {1,2,3,4,5};
int *q = arr;
for (int i = 0; i < 5; ++i)
printf("%d ", *(q + i));
常见错误:野指针(未初始化)、悬空指针(指向已释放内存)。对策:初始化时置 NULL,释放后置 NULL,遵守"谁申请谁释放"。
指针是 C 语言的重点,用法还有很多,包括指针数组、数组指针、函数指针、二级指针、二维数组指针、字符串指针等。
7. 结构体
结构体把不同类型的数据打包成整体,形成自定义类型。定义格式:
struct Student {
char name[20];
int age;
float score;
};
使用 typedef 可简化类型名:
typedef struct Student Stu;
Stu s1 = {"Tom", 19, 89.5f};
结构体指针常用于函数参数,避免整份拷贝,提高效率:
void printStu(const Stu *p) {
printf("%s %d %.1f\n", p->name, p->age, p->score);
}
8. 文件操作
C 通过标准 I/O 库处理文件,核心步骤:打开→读写→关闭。
| 函数 | 作用 |
|---|---|
| fopen | 返回 FILE *,失败返回 NULL |
| fscanf/fprintf | 格式化读写 |
| fgets/fputs | 按行读写 |
| fclose | 刷新缓冲区并释放资源 |
FILE *fp = fopen("data.txt", "w");
if (!fp) { perror("fopen"); exit(EXIT_FAILURE); }
fprintf(fp, "Hello C\n");
fclose(fp);
二进制读写用 fread/fwrite,可保存结构体数组,实现数据持久化。
9.其他语法
- C语言宏定义
- C语言标准库常用函数
- C语言随机数生成(srand 和 rand)
- C语言 static
- ...
C语言结业测试:学生成绩管理小程序
下面给出完整源码,整合数组、结构体、指针、文件操作与循环分支。程序功能:从键盘录入 3 名学生信息,保存到文件,再读取并打印平均分。
cpp
#include <stdio.h>
#include <stdlib.h>
#define N 3
typedef struct {
char name[20];
int age;
float score;
} Student;
/* 输入学生信息 */
void input(Student *p, int n) {
for (int i = 0; i < n; ++i) {
printf("请输入第 %d 个学生的姓名 年龄 成绩:", i + 1);
scanf("%s %d %f", p[i].name, &p[i].age, &p[i].score);
}
}
/* 保存到文件 */
void save(const Student *p, int n, const char *filename) {
FILE *fp = fopen(filename, "wb");
if (!fp) { perror("save"); exit(EXIT_FAILURE); }
fwrite(p, sizeof(Student), n, fp);
fclose(fp);
}
/* 从文件读取并计算平均分 */
float loadAndAvg(const char *filename, int n) {
Student tmp;
float sum = 0;
FILE *fp = fopen(filename, "rb");
if (!fp) { perror("load"); exit(EXIT_FAILURE); }
for (int i = 0; i < n; ++i) {
fread(&tmp, sizeof(Student), 1, fp);
printf("%s\t%d\t%.1f\n", tmp.name, tmp.age, tmp.score);
sum += tmp.score;
}
fclose(fp);
return sum / n;
}
int main(void) {
Student stu[N];
const char *file = "stu.dat";
input(stu, N); // 1. 键盘录入
save(stu, N, file); // 2. 持久化保存
printf("----- 文件内容如下 -----\n");
float avg = loadAndAvg(file, N); // 3. 读取并展示
printf("平均分 = %.2f\n", avg);
return 0;
}
运行结果是:
请输入第 1 个学生的姓名 年龄 成绩:Alice 19 90.5 请输入第 2 个学生的姓名 年龄 成绩:Bob 20 85 请输入第 3 个学生的姓名 年龄 成绩:Carol 18 92 ----- 文件内容如下 ----- Alice 19 90.5 Bob 20 85.0 Carol 18 92.0 平均分 = 89.17
至此,你已走完 C 语言最核心的知识地图。接下来建议:
- 学习数据结构和算法,刷 100 道经典算法题(顺序表、链表、栈、队列、排序、搜索)。
- 阅读《C Primer Plus》、《C 和指针》,进阶内存与指针。
坚持练习,你会逐渐体会到 C 的简洁与强大。祝你编码愉快,享受指针飞舞的乐趣!