预处理:
编译过程:
1.预处理
//预编译 -- 将 代码中相关 预处理命令执行 最终生产一个 只包含c语言代码的文件
2.编译
//编译 -- 对语法进行检查,将这个c的源代码 生产 汇编代码
3.汇编
//汇编 -- 表示将 汇编源代码 最终生成 机器代码 //object
4.链接
//链接 -- 将使用到的其它代码了链接到一起 生成 最终可执行文件
宏定义 :
#define 标识符 字符串
#define 宏名 宏值
注意:
1. 预处理命令 都是以 # 开头的
2. 宏名 命名规则 和 之前标识符命名规则一致
注:宏名一般都写大写 ,以区别与普通变量名
3. 预处理 实际上 是将 宏名 用 宏值(预处理阶段的 字符串) 原样替换
文本替换
注意: c语言字符串中出现的 "宏名" 不会被替换
4. 应用
a. 提高代码可读性
b. 一改全改,方便代码修改
5. 宏名的 作用域
#undef 宏名 表示 取消 宏名的 定义
注意:
只是在预处理阶段发挥作用;
作用范围:
从定义处开始,到 #undef 结束
带参宏定义,宏函数
语法:
#define 宏名(参数)#define 宏名(参数) 宏值
注意:
1.带参宏 和 函数有本质的 区别
a.处理阶段不一样
宏定义 --预处理阶段
函数 --编译阶段
b.使用不一样
宏 :预处理阶段 就使用结束了
宏的使用,本质上,是文本的原样替换
宏的参数,只是进行 文本替换用,不进行语法检查
函数 :调用时,进行使用
函数的使用,本质上是函数代码的调用
参数: 函数的参数,是有类型的,编译阶段是要进行类型检查的
c.应用
一般对于一些短小代码 ,考虑写成带参宏
不超过5行的代码
d.宏的副作用
处理: 把能加括号的地方都加括号
e.注意
宏定义 必须 写在一行续行符
2.文件包含
#include <文件名>
#include "文件名"
<> 与 ""
区别在于,查找头文件的方式不一样
<> //到系统默认的路径寻找对应的头文件
"" //表示先到当下目录下寻找头文件,如没有,再到系统默认路径下寻找
3.条件编译
(1).
#ifdef 标识符
程序段 1
#else
程序段 2
#endif
含义:
如果 定义了 标识符 则 预处理程序段1 //就是将程序段1的代码 保留
否则保留
//1.调试代码
//2.设计头文件
(2)
#ifndef 标识符
程序段1
#else
程序段2
#endif
含义:
如果 没有定义了 标识,则 预处理 程序段1 //就是将程序段1的代码 保留
否则处理 程序段2
(3)
#if 表达式
程序段1
#else
程序段2
#endif
含义:
表达式为真 处理程序段1 表达式为假 处理程度段2
#if 0
...
#endif
项目
|-- main.c
|-- isLeapYear.c
|-- isLeapYear.h
|-- getDays.c
|-- getDays.h
|-- weekFirstDayOfMonth.c
|-- weekFirstDayOfMonth.h
|-- printCal.c
|-- printCal.h
项目:
|--main.c
|--add.c
|--add.h
防止多次包含,带来重复定义的问题
二.指针基础
1.指针的定义包括两部分:
指针类型:指针变量所指向的数据的类型。
指针变量:存储地址的变量。
定义指针的基本语法是:
type *pointer_name;
这里,type 是指针所指向的数据类型,pointer_name 是指针变量的名称。例如:
int *ptr; // 定义一个指向整数的指针
char *c_ptr; // 定义一个指向字符的指针
c
2. 指针变量的类型
指针变量的类型由它指向的数据类型决定。常见的指针类型包括:
**int ***:指向整数类型的指针。
**float ***:指向浮点数类型的指针。
**char ***:指向字符类型的指针。
**double ***:指向双精度浮点数类型的指针。
**struct type ***:指向结构体类型的指针。
例如:
int num = 10;
int *num_ptr = # // num_ptr 是一个指向整数的指针
char letter = 'A';
char *letter_ptr = &letter; // letter_ptr 是一个指向字符的指针
c
3. 使用指针
**取地址运算符 &**:用于获取变量的内存地址。
**解引用运算符 ***:用于访问指针所指向的值。
例如:
int value = 20;
int *ptr = &value; // ptr 指向 value 的地址
printf("Address of value: %p\n", (void*)ptr); // 打印地址
printf("Value at ptr: %d\n", *ptr); // 打印指针指向的值
三.指针的变量名和引用
指针的变量名
指针的变量名是指针本身的名称,它代表了存储在该指针中的内存地址。例如:
int a = 10; // 定义一个整型变量a
int *p = &a; // 定义一个指向整型的指针p,并将a的地址赋值给p
在这个例子中,p就是指针的变量名,它存储了变量a的地址。
指针的引用
在C语言中,"引用"通常不是一个标准术语,但我们可以将其理解为通过指针访问或修改其指向的变量的值。这通常涉及到解引用操作,即使用*运算符来访问指针所指向的值。例如:
printf("%d\n", *p); // 通过指针p访问a的值,输出10
*p = 20; // 修改p所指向的值(即a的值)
printf("%d\n", a); // 输出20,a的值被修改
总结
指针的变量名是指向特定类型数据的指针变量的名称。
指针的引用是通过解引用操作符*来访问或修改指针所指向的值。