第十三章 编译预处理和动态存储分配
13.1 编译预处理
以 #号开头的行,统称为编译预处理如
#define,#include
定义:对 C源程序编译前,由编译预处理程序进行预处理
每行的结束不能加 ;
13.1,1宏替换一、无参数的宏定义
格式,#define 宏名 替换文本
or #define 宏名 (说明宏名已被,定义“)
如,#define SIZE 100
替换文本中可以包含已定义过的宏名如,#define PI 3.14
#define ADDPI (PI+1)
#define TWO_ADDPI (2*ADDPI)
宏定义在一行中写不下,可在最后加,\”来继续
同一个宏名不能重复定义
替换文本不能替换双引号中与宏名相同的字符串
替换文本并不替换用户标识符中的成份
通常宏名的标识符用大写,这仅是一种习惯
宏定义的位置一般放在程序的开头二、有参数的宏定义
格式,#define 宏名(形参表) 替换文本
如,#define MU( X,Y) (( X) *( Y))
…………
a=MU(5,2); /*引用带参的宏名 */
b=6/MU(a+3,a);
注意:同一宏名也不能重复定义
` 圆括号不能少注意:宏替换不占运行时间实参不能替换在双引号中的形参三、终止宏定义用 #undef提前终止宏定义的作用域
13.1.2 文件包含文件包含:指在一个文件中,去包含另一个文件的全部内容。
形式,#include,文件名,或 #include <文件名 >
说明,一般把包含文件称为“头文件”
它有一些公用的 #define命令行、外部说明或库函数的原型说明。
可以有多个 #include 。当头文件修改后,
必需重新编译。
13.2动态存储分配静态存储分配,预先分配的内存空间是固定不变的动态存储分配,随时申请和释放内存空间注:必须在程序开头包含头文件 stdlib.h
13.2.1 malloc函数和 free函数
1.malloc 函数
它的返回值类型为 void*;调用形式为 malloc
(size),其中 size的类型为 unsigned int
此函数用来分配 size个字节的存储区,返回一个指向存储区首地址的基类型为 void的地址
如下所示,
int *pi;
float *pf;
pi=(int*)malloc(2);
pf=(float*)malloc(4);
以上程序段使 pi指向一个 int类型的存储单元,pf指向 float类型的存储单元。
注:括号中的 *号不可少。
若 if(pi!=NULL) *pi=6;
if(pf!=NULL) *pf=3.9;
6 3.9
执行后:
pi pf
注:由动态分配得到的存储单元没有名字,只能靠指针变量来引用它
若不能确定数据类型所占字节数,可有 sizeof运算符来得到。如,pi=(*int)malloc(sizeof (int));
pf=(float*)malloc(sizeof (float);
2,free 函数调用形式,free(p); /*p必须指向 malloc分配的地址功能:将指针 p所指的存储空间释放。无返回值。
13.2.2 calloc函数调用形式,calloc(n,size);
/*n和 size的类型为 unsigned int */
功能,给 n个、同一类型的数据项分配连续的存储空间每个数据项的长度为 size个字节若成功,返回存储空间的首地址;
否则返回空
系统自动设初值为 0。
如,char *ps;
ps=(char*)calloc(10,sizeof(char));
上述语句功能:开辟了 10个连续的
char类型的存储单元,由 ps指向首地址,每个存储单元存放一个字符。
calloc函数相当于开辟了一个一维数组。同样用 free函数释放。