一、预处理命令(Preprocessor Directives)
1. 宏定义(Macro Definition)

 不带参数的宏定义

#define 宏名 替换内容
#define P 100

作用:编译前进行字符串替换

约定:宏名通常用大写字母表示

可嵌套使用多个宏

带参数的宏定义

#define 宏名(参数) 替换内容
#define ADD(a,b) ((a)*(b))

 无需指定参数类型(参数只是字符串替换)

强烈建议在宏定义中加括号,防止优先级错误

2. 查看预处理结果
gcc -E -o main.i main.c

 说明:只执行预处理阶段,不生成目标文件

输出文件 main.i 为预处理后的C文件

二、文件包含命令(Include)
#include "file.h"   // 在当前目录查找
#include <file.h>   // 在系统目录

本质上也是文本替换

三、条件编译(Conditional Compilation)
#ifdef 宏名
  // 已定义宏,编译这部分
#else
  // 未定义宏,编译这部分
#endif

#define DEBUG

#ifdef DEBUG
  printf("调试信息\n");
#else
  printf("正式版本\n");
#endif
四、指针基础

定义方式

int i;
int *p = &i;
*p = 10;
printf("%d\n",*p);

 *p 是指向变量 i 的指针,表示“访问地址中存储的值”

*p 的数据类型就是“指针的基类型”(如 int

内存占用

int 型指针

在64位系统中,指针变量占8个字节

在32位系统中,指针变量占4个字节

通过指针修改主调函数变量的值

使用函数传参时传递地址,实现在被调函数中改变主调函数的值(传址调用)

表达式理解

*&p == p&*p == p 都成立

*p 类似一个跳转到内存中相应地址

访问指针指向的内存的过程:

1.根据指针变量的值确定内存地址;

2.从该地址向后偏移 sizeof(基类型) 字节;

3.将这段内存解释为一个 基类型 变量。

更多推荐