目录
1、计算机
中央处理器(CPU),
- 作用:负责执行计算和逻辑判断的核心部件
- 组成 :
- 运算器(ALU):执行算术和逻辑运算
- 控制器(CU):由时钟信号同步,协调各部件工作
- 寄存器:临时存储数据和指令
存储器
- 内存(RAM):存储正在执行的程序和数据,断电后数据丢失
- 外存:硬盘、SSD等,用于长期存储
预处理
编译之前要预处理:执行预处理指令
在C语言代码中,以 # 开头的指令就是预处理指令。预处理指令有多种形式,两种最常见的形式:
| 指令 | 作用 | 示例 |
|---|---|---|
#include |
用于包含头文件 | #include <stdio.h> |
#define |
用于定义宏或常量 | #define PI 3.14159 |
预处理输出文件 :.i 文件
2、项目文件
项目组织架构(Visual Studio)
| 层级 | 说明 |
|---|---|
| 解决方案(.sln) | 存放多个相关项目的容器 |
| 项目(.vcxproj) | 单个项目的配置和文件集合 |
文件分类
头文件(Header Files)
- 作用 :存放
.h文件,包含函数声明、结构体定义、宏定义等 - 创建步骤:右键点击"头文件" → "添加" → "新建项" → 选择"头文件(.h)"
源文件(Source Files)
- 作用 存放
.c文件,包含函数的具体实现 - 创建步骤:右键点击"源文件" → "添加" → "新建项" → 选择"C文件(.c)"
- ⚠️ 注意:不要选择"C++文件(.cpp)",应直接选择C文件
项目示例结构
cpp
1LinkedList(项目名称)
2├── 头文件
3│ ├── Link_list.h (链表结构定义和函数声明)
4│ └── Common.h (公共定义,如状态码)
5├── 源文件
6│ ├── Link_list.c (链表函数实现)
7│ ├── main.c (主函数,用于测试)
8│ └── Test.c (专门的测试代码)
9└── 其他
10 └── README.md (项目说明)
3、符号含义
& 运算符
表格
| 类型 | 说明 | 示例 |
|---|---|---|
| 取地址运算符(一元) | 获取变量在内存中的地址 | int *p = &c4; |
| 按位与运算符(二元) | 对两个操作数的每个二进制位进行"与"运算 | a & b |
取地址运算符常用场景:
- 指针初始化:
int *p = &c4; - 传递地址给函数:
scanf("%d", &c4);
按位与运算符常用场景:
掩码操作(检查/设置特定位) 底层硬件编程
4、内存空间
C程序内存区域总览
cpp
高地址
┌─────────────────┐
│ 内核空间 │ ← 操作系统专用,用户程序不可访问
├─────────────────┤
│ 栈 Stack │ ↓ 向下增长
├─────────────────┤
│ 堆 Heap │ ↑ 向上增长
├─────────────────┤
│ 未初始化数据 │ (.bss)
│ (BSS段) │
├─────────────────┤
│ 已初始化数据 │ (.data)
│ (数据段) │
├─────────────────┤
│ 只读数据段 │ (.rodata)
├─────────────────┤
│ 代码段 │ (.text)
└─────────────────┘
低地址
各区域详解
| 区域 | 存储内容 | 管理方式 | 生命周期 |
|---|---|---|---|
| 代码段(.text) | 可执行指令 | 只读 | 程序启动→结束 |
| 只读数据段(.rodata) | 字符串常量、const变量 | 只读 | 程序启动→结束 |
| 已初始化数据段(.data) | 显式初始化的全局/静态变量 | 静态分配 | 程序启动→结束 |
| 未初始化数据段(.bss) | 未初始化的全局/静态变量(自动初始化为0) | 静态分配 | 程序启动→结束 |
| 堆(Heap) | 动态分配的内存 | 手动管理(malloc/free) | 申请→释放 |
| 栈(Stack) | 局部变量、函数参数、返回地址 | 自动管理(LIFO) | 函数调用→返回 |
详细说明
1. 栈区(Stack)
- 存储内容:局部自动变量、函数参数、返回地址、栈帧指针
- 管理方式:编译器自动分配/释放,遵循「后进先出(LIFO)」规则
- 空间特性 :大小有限(Linux默认约8MB),递归过深或局部数组过大会触发栈溢出(Stack Overflow)
2. 数据段(Data Segment)
-
.data段 :存储显式初始化的全局变量/静态变量c
cpp1int global_a = 10; 2static int func_static = 20; -
.bss段 :存储未显式初始化的全局变量/静态变量(编译器自动初始化为0)c
cpp1int global_b; 2static int func_static_b; -
生命周期:程序加载时分配,进程结束时由操作系统回收
3. 堆区(Heap)
- 申请/释放 :C/C++用
malloc/free、new/delete手动管理 - 空间特性 :可动态扩展(受物理内存+虚拟内存限制),但易产生内存碎片
- 风险点 :
- 不释放 → 内存泄漏(Memory Leak)
- 越界访问 → 程序崩溃
4. 代码段(Text Segment)
- 存储内容:程序的可执行指令
- 特性:只读(防止运行时被篡改),多进程可共享同一份代码段副本
5. 只读数据段(.rodata)
-
存储内容 :字符串常量、
const修饰的只读变量ccpp1const int MAX = 100; 2char *str = "Hello"; // 字符串常量存于.rodata -
特性:只读,尝试修改会导致段错误(Segmentation Fault)
6. 内核空间(Kernel Space)
- 说明:属于操作系统专属内存,用户程序无权直接访问
- 存储内容:内核代码、设备驱动、进程调度表等
- 权限:受硬件+操作系统双重保护