资源描述:
《编译预处理和动态存储分配课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、全国计算机等级考试教程C语言程序设计(二级)万红波烟台大学第十三章编译预处理和动态存储分配编译预处理动态存储分配13.1编译预处理编辑程序C语言源文件C语言编译程序产生目标程序连接程序C函数库产生可执行程序hello.chello.objhello.exe13.1编译预处理“#”开头的行--预处理命令预处理命令末尾不加;区别于语句在编译程序进行编译之前,由预处理程序进行处理hello.chello.ihello.objhello.exe预处理编译器链接器13.1编译预处理13.1.1宏替换#define
2、13.1.2文件包含#include13.1编译预处理13.1.1宏替换不带参数的宏定义#define宏名替换文本#definePI3.1415926预处理程序对源程序中所有名为PI的标识符替换为3.141592613.1编译预处理13.1.1宏替换#definePI3.1415#defineADDPI(PI+1)#defineTWO_ADDPI(2*ADDPI)intmain(){doublex=TWO_ADDPI*2;}#definePI3.1415#defineADDPI(3.1415+1)#def
3、ineTWO_ADDPI(2*(3.1415+1))13.1编译预处理13.1.1宏替换不能替换双引号中与宏名相同的字符串。不能替换用户标识符中的成分。对其他与宏名相同的字符串进行机械的替换操作#defineSIZE100intmain(0{inta=SIZE;intaSIZE=a*SIZE;printf(“2*SIZE=%d”,SIZE*2);}13.1编译预处理带参数的宏定义#define宏名(形式参数表)替换文本#defineMU(X,Y)((X)*(Y))intmain(){intm=MU(2,3
4、);inta=3;intb=MU(a+3,a);}MU(a+3,a)替换为((a+3)*(a))#defineMU(X,Y)(X*Y)intmain(){intm=MU(2,3);inta=3;intb=MU(a+3,a);}MU(a+3,a)替换为(a+3*a)13.1编译预处理终止宏定义#definePI3.14intmain(){...}#undefPI...doublefun(intx){...}练习题13.3//程序的输出结果#include#defineFUDGF(y)2.8
5、4+y#definePR(a)printf("%d",(int)(a))#definePRINT1(a)PR(a);putchar('')main(){intx=2;PRINT1(FUDGF(5)*x);}练习题13.11#include#defineSWAP(t,x,y){ttemp=x;x=y;y=temp;}voidmain(){inta=3,b=7;SWAP(int,a,b);printf("%d,%d",a,b);}13.1编译预处理13.1.2文件包含在一个文件中去包
6、含另一个文件的全部内容//main.c#include“myfun.h”voidmain(){fun();printf("Hello,World!");}//myfun.hexternintfun();//myfun.cintfun();{printf(“Fun”);return1;}13.1编译预处理13.1.2文件包含-头文件#includevoidmain(){printf("Hello,World!");}13.2动态存储分配静态存储分配:通过定义,分配存储空间;动态
7、存储分配:在程序执行期间,通过”申请”,分配内存空间,不用的时候可以释放。用户通过标准的库函数实现动态的存储分配malloc,calloc,free函数stdlib.h13.2动态存储分配13.2.1malloc函数和free函数malloc函数-分配size个字节的存储空间,返回指向存储空间首地址的指针。返回的地址是void*,要根据需要进行强制类型转换。动态分配的存储空间只能靠指针来引用。void*malloc(unsignedintsize);voidfree(void*);13.2动态存储分配13
8、.2.1malloc函数和free函数#include#include#defineSIZE10intmain(intargc,char*argv[]){int*p;p=(int*)malloc(SIZE*sizeof(int));if(p!=NULL)printf("MemoryAllocationSuccess!");*p=23;printf(“*p=%d”,*p);free(p)