C语言程序设计简明教程
前言:为什么是C语言?
C语言是一门历史悠久但至今依然生命力旺盛的编程语言,它被誉为“现代编程语言的鼻祖”,许多流行语言(如C++, Java, C#, Python)的语法和思想都源于C。

- 高效:C语言直接操作内存和硬件,运行速度快,效率高。
- 强大:用于开发操作系统(如Windows, Linux)、嵌入式系统、游戏引擎等底层和高性能软件。
- 基础:学好C语言,能让你深刻理解计算机的工作原理,为学习其他语言打下坚实的基础。
第一部分:入门基础
第1章:你好,C世界!
1 什么是程序? 程序就是告诉计算机一步一步做什么的指令集合,我们用C语言写的代码,就是这种指令。
2 第一个C程序:Hello, World! 这是所有编程教程的传统开端,让我们来创建它。
步骤:
-
安装编译器:你需要一个C语言编译器来将你的代码转换成计算机能执行的程序,最常用的是 GCC (GNU Compiler Collection),在Windows上,你可以安装
MinGW或TDM-GCC;在macOS上,Xcode自带Clang;在Linux上,通常已预装。
(图片来源网络,侵删) -
编写代码:创建一个文本文件,命名为
hello.c,并输入以下内容:#include <stdio.h> // 引入标准输入输出库 int main() { // 主函数,程序的入口点 printf("Hello, World!\n"); // 调用printf函数在屏幕上打印文字 return 0; // 返回0,表示程序正常结束 } -
编译和运行:
- 打开终端(或命令提示符)。
- 使用
cd命令切换到hello.c文件所在的目录。 - 输入编译命令:
gcc hello.c -o hello - 运行程序:
./hello(在Windows上是hello.exe)
你将看到输出:
Hello, World!
代码解析:

#include <stdio.h>:#include是一个预处理指令,用于包含头文件。stdio.h是标准输入输出库,它提供了像printf这样用于输入输出的函数。int main():这是程序的主函数,每个C程序都必须有一个main函数,它是程序开始执行的地方。printf(...):printf函数来自stdio.h,用于格式化并输出文本。\n是一个转义字符,代表“换行”。return 0;:main函数执行完毕后,返回一个整数值给操作系统。0表示程序成功执行完毕。
第二部分:核心元素
第2章:变量与数据类型
计算机需要存储数据,变量就是用来存储数据的容器。
1 基本数据类型
| 类型 | 关键字 | 描述 | 示例 |
|---|---|---|---|
| 整型 | int |
存储整数(如 10, -5, 0) | int age = 25; |
| 浮点型(单精度) | float |
存储带小数的数(如 3.14, -0.5) | float price = 19.99; |
| 浮点型(双精度) | double |
比float精度更高的小数 | double pi = 3.1415926; |
| 字符型 | char |
存储单个字符(如 'A', '1', '$') | char grade = 'A'; |
2 变量的声明与赋值
// 声明一个整型变量 int score; // 声明并同时赋值 int score = 100; // 同时声明多个变量 int x = 10, y = 20, z;
3 常量
使用 const 关键字定义一个不能修改的变量。
const int MAX_AGE = 120; // MAX_AGE = 121; // 这行代码会编译错误!
第3章:运算符
运算符用于对变量和值进行操作。
1 算术运算符 (加), (减), (乘), (除), (取模,即求余数)
int a = 10, b = 3;
printf("%d\n", a / b); // 输出 3 (整数除法会丢弃小数部分)
printf("%d\n", a % b); // 输出 1 (10除以3的余数是1)
2 赋值运算符 , , , ,
int x = 5; x += 3; // 等价于 x = x + 3; x 现在是 8
3 比较运算符
用于比较两个值,结果为真(1)或假(0)。
(等于), (不等于), > (大于), < (小于), >= (大于等于), <= (小于等于)
4 逻辑运算符
用于组合多个条件。
&& (逻辑与), (逻辑或), (逻辑非)
第三部分:流程控制
程序不是按部就班地从头执行到尾,流程控制语句让程序可以做出选择和循环。
第4章:条件判断
1 if-else 语句
int score = 85;
if (score >= 90) {
printf("优秀!\n");
} else if (score >= 60) {
printf("及格!\n");
} else {
printf("不及格!\n");
}
// 输出: 及格!
2 switch 语句
当需要判断一个变量的多个固定值时,switch 更清晰。
char grade = 'B';
switch (grade) {
case 'A':
printf("成绩是A\n");
break; // break是必须的,用于跳出switch
case 'B':
printf("成绩是B\n");
break;
default: // 如果不匹配任何case,执行default
printf("成绩未知\n");
break;
}
第5章:循环
1 for 循环 当你知道循环次数时使用。
// 打印 0 到 4
for (int i = 0; i < 5; i++) {
printf("%d ", i);
}
// 输出: 0 1 2 3 4
for 循环由三部分组成:初始化表达式 (i=0), 条件 (i<5), 循环后操作 (i++)。
2 while 循环 当你不知道循环次数,但有一个循环条件时使用。
int count = 0;
while (count < 5) {
printf("%d ", count);
count++;
}
// 输出: 0 1 2 3 4
3 do-while 循环
while 循环的变体,它至少会执行一次循环体。
int num = 1;
do {
printf("%d ", num);
num++;
} while (num <= 5);
// 输出: 1 2 3 4 5
第四部分:函数
函数是一块可以重复使用的代码块,它接收输入(参数),执行一些操作,并可以返回一个结果。
1 函数的定义与调用
// 函数声明 (可选,如果函数定义在main之后)
int add(int a, int b);
// 主函数
int main() {
int result = add(5, 3); // 调用add函数
printf("5 + 3 = %d\n", result); // 输出 5 + 3 = 8
return 0;
}
// 函数定义
int add(int a, int b) {
return a + b; // 返回a和b的和
}
函数结构:
返回类型 函数名(参数列表) { 函数体 }
第五部分:数组与字符串
第6章:数组
数组是存储相同类型的多个元素的集合。
// 声明一个包含5个整数的数组
int numbers[5]; // 默认值是未知的垃圾值
// 声明并初始化
int scores[3] = {88, 92, 76};
// 访问数组元素 (索引从0开始)
printf("第一个分数是: %d\n", scores[0]); // 输出 88
// 修改数组元素
scores[0] = 95;
// 遍历数组
for (int i = 0; i < 3; i++) {
printf("%d ", scores[i]);
}
// 输出: 95 92 76
第7章:字符串
在C语言中,字符串本质上是一个以 '\0' (空字符) 结尾的字符数组。
// 方法1: 字符串字面量
char greeting[] = "Hello"; // 编译器会自动在末尾添加 '\0'
// 方法2: 逐个字符赋值
char name[6] = {'J', 'o', 'h', 'n', '\0'}; // 必须手动添加 '\0'
// 使用 printf 打印字符串
printf("%s\n", greeting); // 输出 Hello
// 重要:字符串处理函数 (需要 #include <string.h>)
strcpy(name, "Alice"); // 复制字符串
strlen(name); // 获取字符串长度
第六部分:指针
指针是C语言的灵魂,也是最难点,它是一个变量,其存储的值是另一个变量的内存地址。
1 指针的定义与使用
int num = 10;
int *ptr; // 声明一个整型指针 ptr
ptr = # // & 是取地址运算符,获取 num 的内存地址
printf("num 的值: %d\n", num); // 输出 10
printf("num 的地址: %p\n", &num); // 输出 num 的内存地址
printf("ptr 存储的地址: %p\n", ptr); // 输出和上面一样
printf("ptr 指向的值: %d\n", *ptr); // * 是解引用运算符,获取 ptr 地址上的值,输出 10
2 指针与数组 数组名在表达式中会“退化”为其首元素的地址,所以指针和数组关系密切。
int arr[3] = {10, 20, 30};
int *p = arr; // p 指向 arr 的第一个元素
printf("%d\n", *p); // 输出 10
p++; // p 指向下一个元素
printf("%d\n", *p); // 输出 20
第七部分:结构体
当你需要将不同类型的数据组合成一个整体时,使用结构体。
// 定义一个学生结构体
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
// 创建一个结构体变量
struct Student student1;
// 给结构体成员赋值
strcpy(student1.name, "张三");
student1.age = 20;
student1.gpa = 3.8;
// 访问结构体成员
printf("姓名: %s, 年龄: %d, GPA: %.2f\n", student1.name, student1.age, student1.gpa);
return 0;
}
第八部分:文件操作
C语言可以对文件进行读写操作。
1 写入文件
#include <stdio.h>
int main() {
FILE *fp; // 声明一个文件指针
fp = fopen("test.txt", "w"); // 以"写"模式打开文件,如果文件不存在则创建
if (fp != NULL) {
fprintf(fp, "你好,C语言文件操作!\n"); // fprintf 像printf一样,但输出到文件
fprintf(fp, "这是一个新行。");
fclose(fp); // 关闭文件
printf("文件写入成功!\n");
} else {
printf("无法打开文件!\n");
}
return 0;
}
2 读取文件
#include <stdio.h>
int main() {
FILE *fp;
char buffer[100];
fp = fopen("test.txt", "r"); // 以"读"模式打开文件
if (fp != NULL) {
while (fgets(buffer, sizeof(buffer), fp)) { // 逐行读取
printf("%s", buffer);
}
fclose(fp);
printf("\n文件读取成功!\n");
} else {
printf("无法打开文件!\n");
}
return 0;
}
总结与学习建议
- 多动手实践:编程是门手艺,光看教程是不够的,把每个例子都敲一遍,并尝试修改它,看看会发生什么。
- 理解概念,而非死记硬背:特别是指针和内存管理,一定要理解其背后的原理。
- 学会调试:编译器会告诉你哪里有错,仔细阅读错误信息,学会使用调试工具(如GDB)是进阶的关键。
- 阅读优秀代码:阅读一些开源的C项目(如Redis的源码),可以让你学到很多实战技巧。
- 坚持下去:C语言有一定难度,但一旦掌握,你将获得无与伦比的编程能力和对计算机深刻的理解。
这份简明教程涵盖了C语言的核心知识,祝你学习愉快,早日成为C语言高手!
