资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,好好考,(,),全国计算机等级考试,二级,C,语言,预编译处理,文件包含,动态分配存储空间函数,真题分析,第,16,讲 编译预处理和动态存储分配,第一节 编译预处理,作用:,对源程序编译之前做一些处理,生成扩展,C,源程序,种类,宏定义,#define,文件包含,#include,条件编译,#if-#else-#,endif,等,格式:,“,#”,开头,占单独书写行,语句尾不加分号,第一节 编译预处理,宏定义,不带参数宏定义,一般形式:,#define,宏名,宏体,功能,:,用指定标识符,(,宏名,),代替字符序列,(,宏体,),如,#define YES 1,#define NO 0,#define PI 3.1415926,#define OUT,printf(,“,Hello,World,”,);,宏体可缺省,表示宏名,定义过或取消宏体,第一节 编译预处理,宏定义,不带参数宏定义,定义位置,:,任意,(,一般在函数外面),作用域:从定义命令到文件结束,#,undef,可,终止宏名作用域,格式:,#,undef,宏名,例,#define YES 1,main(), .,#,undef,YES,#define YES 0,max(),.,YES,原作用域,YES,新作用域,第一节 编译预处理,宏定义,不带参数宏定义,宏展开:预编译时,用宏体替换宏名,-,不作语法检查,如,if(x=,YES,),printf(,“,correct!n,”,);,else if (x=,NO,),printf(,“,error!n,”,);,展开后:,if(x,=,1,),printf(,“,correct!n,”,);,else if (x=,0,),printf(,“,error!n,”,);,如,#define YES 1,#define NO 0,#define PI 3.1415926,#define OUT,printf(,“,Hello,World,”,);,第一节 编译预处理,宏定义,不带参数宏定义,引号中的内容与宏名相同也不置换,例,#define,PI,3.14159,printf(,“,2*,PI,=%fn,”,PI,*2);,宏展开:,printf(,“,2*,PI,=%fn,”,3.14159,*2);,第一节 编译预处理,宏定义,不带参数宏定义,宏定义可嵌套,不能递归,例,#define MAX MAX+10,(,),例,#define WIDTH 80,#define LENGTH WIDTH+40,var,=LENGTH*2;,宏展开:,var,= 80+40 *2;,例,#define WIDTH 80,#define LENGTH WIDTH+40,var,=LENGTH*2;,宏展开:,var,= 80+40 *2;,第一节 编译预处理,宏定义,不带参数宏定义,宏定义中使用必要的括号,(),( ),( ),第一节 编译预处理,宏定义,带参的宏定义,一般形式:,#define,宏名,(,参数表,),宏体,不能加空格,例,#define S(a,b) a*b,.,area=S(3,2);,宏展开:,area=3*2;,宏展开:,形参用实参换,其它字符保留,宏体及各形参外一般应加括号,(),例,#define POWER(x) x*x,x=4; y=6;,z=POWER(x+y);,宏展开:,z=,x+y,*,x+y,;,一般写成:#,define POWER(x),(,(,x,),*,(,x,),),宏展开:,z=(x+y)*(x+y);,带参的宏与函数的区别,带参宏,函数,处理过程,不分配内存,简单的字符置换,分配内存,先求实参值,再代入形参,处理时间,编译时,程序运行时,参数类型,无类型问题,定义实参,形参类型,程序长度,变长,不变,运行速度,不占运行时间,调用和返回占时间,第二节 文件包含,功能:一个源文件可将另一个源文件的内容全部包含进来,一般形式:,#include “,文件名,”,或,#include ,直接按标准目录搜索,“”,先在当前目录搜索,再搜索标准目录可指定路径,处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对,“,包含,”,后的文件作一个源文件编译,第三节 动态分配存储空间函数,void *,malloc(unsigned,int,size);,功能,:,malloc,在内存的动态存储区中分配一个,size,长度的连续存储空间。,返值:返回一个指向分配域地址的指针(类型为,void,),;,若未成功,则返回空指针(,NULL,),例如:,int,*p;,p=(,int,*),malloc(sizeof(int,);,p,指向系统分配的,1,个整型存储单元的起始地址,第三节 动态分配存储空间函数,void *,calloc(unsigned,n,unsigned,size);,功能,:,在内存的动态存储区中分配,n,个长度为,size,的连续空间。,返回值:一个指向分配域起始地址的指针,不成功返回,NULL,。,用,calloc,函数可以为一维数组开辟动态存储空间,,n,为数组元素个数,每个元素长度为,size,。,void,free(void,*p);,功能,:,函数,free,释放由指针变量,p,所指示的内存区域,例如:,free(p,);,通过函数,free,将已分配的内存区域交还系统,使系统可以重新对其进行分配。,第三节 动态分配存储空间函数,真题分析,2008,年,4,月,(,28,)以下叙述中错误的是( )。,A,)在程序中凡是以“,#”,开始的语句行都是预处理命令行,B,)预处理命令行的最后不能以分号表示结束,C,),#define MAX,是合法的宏定义命令行,D,),C,程序对预处理命令行的处理是在程序执行的过程中进行的,答案,:D,真题分析,2008,年,9,月,(,31,)有以下程序,#include ,#include ,int,fun(int,n),int,*p;,p=(,int,*),malloc(sizeof(int,);,*p=n; return *p;,main(),int,a;,a = fun(10);,printf(%dn, a+fun(10);,程序的运行结果是( )。,A,),0 B,),10 C,),20 D,)出错,答案,:C,知识点分析,题型,:,上机、笔试都有,重点掌握,:,带参的宏定义和,malloc,及,free,函数的用法,动态分配函数通常多和后面的链表,等内容结合起来考查,
展开阅读全文