一、预处理命令(Preprocessor Directives)
1. 宏定义(Macro Definition)
不带参数的宏定义
#define 宏名 替换内容
#define PI 3.1415
作用:编译前进行字符串替换
约定:宏名通常用大写字母表示
可嵌套使用多个宏
带参数的宏定义
#define 宏名(参数) 替换内容
#define SQUARE(x) ((x)*(x))
无需指定参数类型(参数只是字符串替换)
强烈建议在宏定义中加括号,防止优先级错误
2. 查看预处理结果
gcc -E -o main.i main.c
说明:只执行预处理阶段,不生成目标文件
输出文件 main.i
为预处理后的C文件
二、文件包含命令(Include)
#include "file.h" // 在当前目录查找
#include <file.h> // 在系统目录(如 include/)中查找
本质上也是文本替换
三、条件编译(Conditional Compilation)
#ifdef 宏名
// 已定义宏,编译这部分
#else
// 未定义宏,编译这部分
#endif
#define DEBUG
#ifdef DEBUG
printf("调试信息\n");
#else
printf("正式版本\n");
#endif
四、指针基础
定义方式
int i;
int* p = &i;
*p = 10;
*p
是指向变量 i
的指针,表示“访问地址中存储的值”
*p
的数据类型就是“指针的基类型”(如 int
)
内存占用
在64位系统中,指针变量占8个字节
在32位系统中,指针变量占4个字节
通过指针修改主调函数变量的值
使用函数传参时传递地址,实现在被调函数中改变主调函数的值(传址调用)
表达式理解
*&p == p
和 &*p == p
都成立
*p
类似一个跳转到内存中相应地址
访问指针指向的内存的过程:
1.根据指针变量的值确定内存地址;
2.从该地址向后偏移 sizeof(基类型)
字节;
3.将这段内存解释为一个 基类型
变量。