课程核心模块概览
- C语言入门与环境搭建
- 基本数据类型与运算
- 程序流程控制
- 数组
- 函数
- 指针 (C语言的精髓与难点)
- 结构体与共用体
- 文件操作
- 编译预处理与位运算 (进阶)
C语言入门与环境搭建
这是学习任何编程语言的第一步。

(图片来源网络,侵删)
-
什么是C语言?
- 一种通用、高级的编程语言。
- 由 Dennis Ritchie 于 1972 年在贝尔实验室开发。
- 特点:高效、灵活、功能强大,被称为“现代编程语言的鼻祖”,许多后来的语言(如 C++, Java, C#, Python)都借鉴了C语言的语法和思想。
- 应用领域:操作系统(Linux, Windows内核)、嵌入式系统、驱动程序、游戏引擎等对性能要求极高的场景。
-
第一个C程序:Hello, World!
-
这是你写下的第一个程序,目的是让你成功编译并运行一个程序,建立信心。
-
代码示例:
(图片来源网络,侵删)#include <stdio.h> // 包含标准输入输出库 int main() { printf("Hello, World!\n"); // 调用printf函数在屏幕上打印文字 return 0; // 程序正常结束,返回0 } -
核心概念:
#include:预处理指令,用于包含头文件。stdio.h提供了输入输出相关的函数(如printf)。main():程序的主函数,是C程序的入口点,任何一个C程序都必须有且仅有一个main函数。- 代码块,用于将多条语句组织在一起。
printf():标准库函数,用于格式化输出。return 0;:表示main函数执行成功并返回0,操作系统通过返回值判断程序是否正常退出。
-
-
开发环境搭建
- 编辑器:用于编写代码,如 VS Code, Sublime Text, Notepad++。
- 编译器:将人类可读的C源代码(
.c文件)翻译成机器可执行的二进制文件(.exe文件),常用的有:- GCC (GNU Compiler Collection):Linux/Unix下最主流的编译器。
- Clang:一个现代、快速的编译器。
- MinGW / TDM-GCC:Windows下的GCC移植版,可在命令行使用。
- 集成开发环境:集成了编辑器、编译器、调试器等工具,方便开发,如:
- Visual Studio (Windows):功能强大,配置简单。
- Code::Blocks (跨平台):轻量级,适合初学者。
- Dev-C++ (Windows):非常轻量,但版本较旧。
- CLion (跨平台):专业的IDE,但收费。
基本数据类型与运算
程序需要处理数据,数据有不同的类型。
-
基本数据类型
(图片来源网络,侵删)int:整型,用于存储整数(如 10, -100)。float:单精度浮点型,用于存储实数(小数),约7位有效数字(如 3.14, -0.5)。double:双精度浮点型,精度更高,约15-16位有效数字(如 3.1415926535)。char:字符型,用于存储单个字符(如 'A', '1', '#'),在内存中实际存储的是其ASCII码。void:空类型,表示“无值”,常用于函数返回值或参数。
-
变量与常量
- 变量:内存中一个命名的存储空间,其值可以改变。
- 定义:
数据类型 变量名;(如int age;) - 初始化:
数据类型 变量名 = 初始值;(如int age = 20;)
- 定义:
- 常量:程序运行期间其值不能改变的量。
- 字面常量:如
100, 'A',14。 - 符号常量:用
#define或const定义。#define PI 3.14159 // 宏定义 const int MAX = 100; // const定义的常量
- 字面常量:如
- 变量:内存中一个命名的存储空间,其值可以改变。
-
运算符
- 算术运算符: (加), (减), (乘), (除), (取模/求余)。
- 注意: 用于整数时是整除(
5 / 2结果是2),用于浮点数时才是真除法(0 / 2.0结果是5)。 只能用于整数。
- 注意: 用于整数时是整除(
- 赋值运算符:, , , , , (如
a += 5等价于a = a + 5)。 - 关系运算符:
>(大于),<(小于),>=(大于等于),<=(小于等于), (等于), (不等于)。结果为真(1)或假(0)。 - 逻辑运算符:
&&(与), (或), (非)。操作数和结果也都是真(1)或假(0)。 - 自增/自减运算符: (自增), (自减),分为前置(
++i)和后置(i++),会影响表达式的值。 - sizeof运算符:用于获取数据类型或变量所占的内存字节数。
sizeof(int)。
- 算术运算符: (加), (减), (乘), (除), (取模/求余)。
-
数据类型转换
- 自动类型转换:当不同类型的数据进行运算时,系统会自动将低精度类型转换为高精度类型(如
int->double)。 - 强制类型转换:使用
(类型名)将一个表达式强制转换为指定类型。(double)5 / 2结果是5。
- 自动类型转换:当不同类型的数据进行运算时,系统会自动将低精度类型转换为高精度类型(如
程序流程控制
程序不是简单的从上到下执行,需要根据条件进行判断和重复。
-
顺序结构:默认的执行方式,代码按书写顺序依次执行。
-
选择结构
- if 语句:根据条件执行不同的代码块。
if (条件) { // 如果条件为真,执行此代码块 } else { // 如果条件为假,执行此代码块 } - switch 语句:用于处理多分支情况。
switch (表达式) { case 常量1: // 代码块1 break; case 常量2: // 代码块2 break; default: // 默认代码块 break; }
- if 语句:根据条件执行不同的代码块。
-
循环结构
- while 循环:先判断条件,条件为真则执行循环体。
while (条件) { // 循环体 } - do-while 循环:先执行一次循环体,再判断条件,至少执行一次。
do { // 循环体 } while (条件); - for 循环:最常用的循环,通常用于循环次数已知的情况。
for (初始化表达式; 循环条件; 更新表达式) { // 循环体 } break和continue:break:立即终止整个循环或switch语句。continue:跳过本次循环的剩余语句,直接进入下一次循环的判断。
- while 循环:先判断条件,条件为真则执行循环体。
数组
用于存储一组相同类型的数据。
-
一维数组
- 定义:
数据类型 数组名[数组长度];(如int scores[10];) - 初始化:
int a[5] = {1, 2, 3, 4, 5};int b[] = {1, 2, 3}; // 数组长度自动确定为3
- 访问:通过下标(从0开始)访问元素。
a[0]是第一个元素,a[4]是第五个元素。
- 定义:
-
二维数组
- 可以看作是一个表格,有行和列。
- 定义:
数据类型 数组名[行数][列数];(如int matrix[3][4];) - 初始化:
int c[2][3] = { {1, 2, 3}, {4, 5, 6} }; - 访问:
c[行下标][列下标](如c[0][1]的值是2)。
函数
将一段常用的代码封装起来,实现代码的模块化和复用。
-
函数的定义
返回值类型 函数名(参数列表) { // 函数体 return 返回值; // 如果返回值类型是void,可以省略return或用return; }- 返回值类型:函数执行后返回的数据类型。
- 参数列表:传递给函数的数据。
- 函数体:实现功能的代码块。
-
函数的调用
- 在
main函数或其他函数中,通过函数名和参数来调用。int add(int a, int b) { // 函数定义 return a + b; }
int main() { int result = add(10, 20); // 函数调用 printf("Result is %d\n", result); return 0; }
- 在
-
函数的声明
- 如果函数定义在调用之后,需要在调用前进行声明,告诉编译器这个函数的存在。
- 格式:
返回值类型 函数名(参数列表); int add(int a, int b);
指针 (C语言的精髓与难点)
C语言最强大的特性之一,也是初学者最难理解的部分。
-
地址与指针
- 内存地址:内存中每个字节都有一个唯一的编号,就是地址。
- 指针变量:专门用来存储地址的变量。
- 指针的定义:
数据类型 *指针变量名;(如int *p;)- 是指针运算符,表示
p是一个指针。 int表示p指向的内存空间中存储的数据是int类型。
- 是指针运算符,表示
-
指针的基本操作
- 取地址运算符
&:获取变量的地址。int a = 10; int *p = &a; // 将变量a的地址赋给指针p
- *间接访问运算符 ``**:通过指针访问其指向地址的值。
printf("%d", *p); // 输出指针p指向的值,即a的值10 *p = 20; // 修改指针p指向的值,即a的值变为20
- 取地址运算符
-
指针与数组
- 数组名在大多数情况下会“退化”为其首元素的地址。
p = arr;和p = &arr[0];是等价的。- 指针遍历数组:指针可以像下标一样遍历数组,且效率更高。
int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; for (int i = 0; i < 5; i++) { printf("%d ", *(p + i)); // *(p+i) 等价于 arr[i] }
-
函数指针与指针函数
- 指针函数:返回值是指针的函数。
- 函数指针:指向函数的指针,可以作为参数传递,是实现回调函数的基础。
结构体与共用体
用于将不同类型的数据组合成一个有机的整体。
-
结构体
- 定义:使用
struct关键字定义一个新的数据类型。struct Student { int id; // 学号 char name[20]; // 姓名 float score; // 成绩 }; - 声明结构体变量:
struct Student stu1; // 声明一个结构体变量 struct Student stu2 = {1001, "Zhang San", 95.5}; // 初始化 - 访问成员:使用成员访问运算符 。
stu1.id = 1002; strcpy(stu1.name, "Li Si"); // 注意:不能用 stu1.name = "Li Si";
- 结构体指针:使用
->运算符访问成员。struct Student *p = &stu1; p->id = 1003; // 等价于 (*p).id = 1003;
- 定义:使用
-
共用体
- 所有成员共享同一段内存空间,同一时间只能存储其中一个成员的值。
- 用途:当需要在不同时候使用不同类型的数据,且数据不会同时存在时,可以节省内存。
union Data { int i; float f; char c; };
文件操作
将程序的数据持久化存储到硬盘上。
-
文件指针
- 所有文件操作都通过一个
FILE类型的指针来完成。 - 打开文件:
FILE *fopen(const char *filename, const char *mode);mode:"r"(只读),"w"(只写,会覆盖),"a"(追加),"rb","wb"(二进制模式)等。
- 关闭文件:
int fclose(FILE *stream); - 标准文件指针:
stdin(标准输入),stdout(标准输出),stderr(标准错误)。
- 所有文件操作都通过一个
-
文件的读写
- 字符读写:
fgetc(),fputc() - 字符串读写:
fgets(),fputs() - 格式化读写:
fscanf(),fprintf()(用法和scanf(),printf()类似,只是第一个参数是文件指针) - 二进制读写:
fread(),fwrite()(用于读写结构体等复杂数据)
- 字符读写:
编译预处理与位运算 (进阶)
-
编译预处理
- 在编译之前,预处理器会对源代码进行处理。
#include:包含文件。#define:宏定义和宏替换。#if,#ifdef,#ifndef,#else,#endif:条件编译,用于根据不同条件编译不同的代码。
-
位运算
- 直接对整数的二进制位进行操作,效率极高。
&(按位与), (按位或),^(按位异或), (按位取反),<<(左移),>>(右移)。- 应用:设备驱动、嵌入式开发、加密算法、高效算法实现等。
学习建议
- 动手实践:编程是“做”会的,不是“看”会的,一定要多写代码,多调试。
- 理解概念:不要死记硬背语法,理解“变量是内存空间”、“指针是地址”这些核心概念至关重要。
- 善用调试器:学会使用IDE的调试功能(设置断点、单步执行、查看变量值),这比用
printf调试更高效。 - 多思考多总结:做完一个题目后,思考有没有更好的解法,总结编程模式和技巧。
- 阅读优秀代码:尝试阅读一些开源的、简单的C语言项目,学习别人的代码风格和设计思想。
希望这份详细的梳理能帮助你更好地学习《计算机程序设计基础(C语言)》,祝你学习顺利!
