第13章 编译预处理和动态存储分配(海贝).ppt_第1页
第13章 编译预处理和动态存储分配(海贝).ppt_第2页
第13章 编译预处理和动态存储分配(海贝).ppt_第3页
第13章 编译预处理和动态存储分配(海贝).ppt_第4页
第13章 编译预处理和动态存储分配(海贝).ppt_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第13章 编译预处理和动态存储分配,宏定义 #define 文件包含 #include 条件编译 #if-#else-#endif等,第一节 编译预处理,一、定义,以“#”开头的一些命令,二、预处理命令的处理时间,编译阶段,且在C源程序编译之前,三、常用编译命令,四、书写格式,“#”开头 占单独书写行 语句尾不加分号,五、 宏替换,例 #define YES 1 #define NO 0 #define PI 3.1415926 #define OUT printf(“Hello,World”);,1. 不带参数宏定义,格式: #define 宏名 宏体 功能: 用指定标识符(宏名)代替字符序

2、列(宏体),说明:,A:宏名是合法的用户标识符,且不能与其他名字相同,B:宏体可以省略,表示标识符被定义(不能单独使用),C:定义位置: 任意 (一般在函数外面),D 作用域: 从定义命令到文件结束 E 引号中的内容不做替换,例 #define MAX MAX+10 (),例 #define PI 3.14159 printf(“2*PI=%fn”,PI*2); 宏展开:printf(“2*PI=%fn”,3.14159*2);,例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2; 宏展开:var= 80+40 *2;,F 宏定义可嵌

3、套,不能递归,例 #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;,G 宏定义中使用必要的括号(),例 #define YES 1 main() . #undef YES #define YES 0 max() . ,H 当其他标识符中含有宏名时不替换,printf(“%d”,YESNO) ;,2. 带参数宏定义,例 #define S (r) P

4、I*r*r 相当于定义了不带参宏S,代表字符串“(r) PI*r*r”,宏展开:形参用实参换,其它字符保留,格式: #define 宏名(参数表) 宏体,例 #define S(a,b) a*b . area=S(3,2); 宏展开: area=3*2;,说明,(1). 宏名与后面的括号间不能留空格,不能加空格,(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) );,(3).

5、 带参数宏必须用()将参数括起,多个参数用“,”分开,(4). 带参数宏不能替换双引号中的形参,(5)带参的宏与函数区别,3. 宏的终止,格式: #undef 宏名,六 文件包含,处理过程:,功能:一个源文件可将另一源文件的内容全部包含进来,一般形式: #include “文件名” 或 #include , 直接按标准目录搜索 “” 先在当前目录搜索,再搜索标准目录可指定路径,预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译,说明:,2. 文件包含可嵌套,1. 被包含文件内容 源文件(*.c) 头文件(*.h),第二节 动态存储分配,概 述,前面我们讲过,变量

6、和数组必须先定义,再使用。所谓定义实际上就是为他们分配存储空间。一旦分配了存储空间,他们在内存中的存储地址也就固定下来,所以我们称之为静态存储分配。,用户没有办法根据需要随时定义变量,不用时随时释放这些存储单元。 比如数组,为了使数组能处理多个元素,我们需要定义的空间应足够大,但这样就带来下列两个问题:,(1) 定义的再大也可能满足不了用户的需求 (2) 如果定义的很大而实际用的很少就会浪费存储空间,一、malloc函数,格式: void *malloc(unsigned int size),例:,功能:,在内存开辟指定大小的存储空间,并将此存储空间的起始地址作为函数值带回 。,char *p

7、; p=(char *) malloc(8);,说明:,1. 因为返回值为一个 void类型指针,因此必须使用强制类型转换 将其转换成需要的类型。 2. 动态分配得到的存储单元没有名字,只能靠指针变量引用它, 一旦指针改变,这些单元将无法再引用。,二、free函数,格式: free(p),例:,功能:,释放指针变量p指向的动态分配的空间,char *p; p=(char *) malloc(8);,说明:,1. 该命令使用前,p必须指向动态分配的存储空间 2. 该函数没有返回值,free(p),三、calloc函数,格式: void *calloc(unsigned n, unsigned size),例:,功能:,开辟连续的n个size大小的存储空间,返回其首

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论