C语言程序设计PPT第13章编译预处理和动态存储分配配套教材高等教育出版社清华大学出版社_第1页
C语言程序设计PPT第13章编译预处理和动态存储分配配套教材高等教育出版社清华大学出版社_第2页
C语言程序设计PPT第13章编译预处理和动态存储分配配套教材高等教育出版社清华大学出版社_第3页
C语言程序设计PPT第13章编译预处理和动态存储分配配套教材高等教育出版社清华大学出版社_第4页
C语言程序设计PPT第13章编译预处理和动态存储分配配套教材高等教育出版社清华大学出版社_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、13.1 编译预处理编译预处理13.2 动态动态存储存储分配分配2022年2月24日19时38分编译预处理:编译预处理:在编译之前进行的处理在编译之前进行的处理。 C语言的预处理主要有三个方面的内容:语言的预处理主要有三个方面的内容: 1.宏定义;宏定义; 2.文件包含;文件包含; 3.条件编译。条件编译。 预处理预处理命令以符号命令以符号“#”开头。开头。2022年2月24日19时39分 1.不带参数的宏定义:不带参数的宏定义: 宏定义又称为宏代换、宏替换,简称宏定义又称为宏代换、宏替换,简称“宏宏”。 格式格式:#define 标识符标识符 替换文本替换文本 其中的标识符就是所谓的其中的标

2、识符就是所谓的符号常量符号常量,也称为,也称为“宏名宏名”。预。预处理处理(预编译)工作也叫做宏展开:将宏名替换为文本(预编译)工作也叫做宏展开:将宏名替换为文本(这个文本可以是字符串、可以是代码等)这个文本可以是字符串、可以是代码等)。掌握。掌握宏宏概念概念的关键是的关键是“换换”。即。即在对相关命令或语句的含义和功能作在对相关命令或语句的含义和功能作具体分析之前就要换:具体分析之前就要换: 例例:#define PI 3.1415926 把程序中全部的标识符把程序中全部的标识符PI换成换成32月24日19时39分说明:说明:(1)宏名一般用大写)宏名一般用大写(2

3、)使用宏可提高程序的通用性和易读性,减少)使用宏可提高程序的通用性和易读性,减少不一致性,减少输入错误和便于修改。例如:数不一致性,减少输入错误和便于修改。例如:数组大小常用宏定义组大小常用宏定义(3)可以用)可以用#undef命令终止宏定义的作用域命令终止宏定义的作用域(4)宏定义可以嵌套)宏定义可以嵌套2022年2月24日19时39分 2.带参数的宏:带参数的宏: 除了一般的字符串替换,还要做参数代换除了一般的字符串替换,还要做参数代换 格式:格式: #define 宏名(参数表)文本宏名(参数表)文本 例如:例如:#define S(a,b) a*b area=S(3,2);第一步被换为

4、;第一步被换为area=a*b; ,第二步被,第二步被换为换为area=3*2;2022年2月24日19时39分 类似于函数调用,有一个哑实结合的过程:类似于函数调用,有一个哑实结合的过程: (1)实参如果是表达式容易出问题)实参如果是表达式容易出问题#define S(r) r*rarea=S(a+b);第一步换为第一步换为area=r*r;,第二步被换第二步被换为为area=a+b*a+b; 正确的宏定义是正确的宏定义是#define S(r) (r)*(r) (2)宏名和参数的括号间不能有空格)宏名和参数的括号间不能有空格 (3)宏替换只作替换,不做计算,不做表达式求解)宏替换只作替换,

5、不做计算,不做表达式求解 (4)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存前进行,不分配内存 (5)宏的哑实结合不存在类型,也没有类型转换。)宏的哑实结合不存在类型,也没有类型转换。 (6)宏展开使源程序变长,函数调用不会)宏展开使源程序变长,函数调用不会 (7)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配)宏展开不占运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)内存、保留现场、值传递、返回值)2022年2月24日19时39分3.终止宏定义终止宏定义可以

6、可以用用#undef提前终止宏定义的作用域提前终止宏定义的作用域例如:例如:#define PI 3.14main()()#undef PI2022年2月24日19时39分 一个文件包含另一个文件的内容一个文件包含另一个文件的内容 格式:格式: #include “文件名文件名“ 或或 #include 编译时以包含处理以后的文件为编译单位,被包含的文件编译时以包含处理以后的文件为编译单位,被包含的文件是源文件的一部分。是源文件的一部分。 编译以后只得到一个目标文件编译以后只得到一个目标文件.obj 被包含的文件又被称为被包含的文件又被称为“标题文件标题文件”或或“头部文件头部文件”、“头文件

7、头文件”,并且常用,并且常用.h作扩展名。作扩展名。 修改头文件后所有包含该文件的文件都要重新修改头文件后所有包含该文件的文件都要重新编译编译2022年2月24日19时39分 头文件的内容除了函数原型和宏定义外,还可以有结构体头文件的内容除了函数原型和宏定义外,还可以有结构体定义,全局变量定义:定义,全局变量定义: (1)一个)一个#include命令指定一个头文件;命令指定一个头文件; (2)文件)文件1包含文件包含文件2,文件,文件2用到文件用到文件3,则文件,则文件3的包的包含命令含命令#include应放在文件应放在文件1的头部第一行;的头部第一行; (3)包含可以嵌套;)包含可以嵌套

8、; (4)称为标准方式,系统到头文件目录查找文称为标准方式,系统到头文件目录查找文件件,文件名文件名则先在当前目录查找,而后到头文件目录查则先在当前目录查找,而后到头文件目录查找;找; (5)被包含文件中的静态全局变量不用在包含文件中声)被包含文件中的静态全局变量不用在包含文件中声明。明。2022年2月24日19时39分非静态的局部变量是分配在内存中的动态存非静态的局部变量是分配在内存中的动态存储区的,这个存储区是一个称为储区的,这个存储区是一个称为栈栈的区域的区域C语言还允许建立内存动态分配区域,以存语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据需要时随时放一些临时用的数据

9、,这些数据需要时随时开辟,不需要时随时释放。这些数据是临时开辟,不需要时随时释放。这些数据是临时存放在一个特别的自由存储区,称为存放在一个特别的自由存储区,称为堆堆区区2022年2月24日19时39分对内存的动态分配是通过系统提供的库函数对内存的动态分配是通过系统提供的库函数来实现的,主要有来实现的,主要有malloc,calloc,free,realloc这这4个函数。个函数。2022年2月24日19时39分malloc函数函数其函数原型为其函数原型为 void *malloc(unsigned int size); u其作用是在内存的动态存储区中分配一个长度其作用是在内存的动态存储区中分配

10、一个长度为为size的连续空间的连续空间u函数的值是所分配区域的第一个字节的地址,函数的值是所分配区域的第一个字节的地址,或者说,此函数是一个指针型函数,返回的指或者说,此函数是一个指针型函数,返回的指针指向该分配域的开头位置针指向该分配域的开头位置2022年2月24日19时39分 malloc(100);u开辟开辟100字节的临时分配域,函数值为其第字节的临时分配域,函数值为其第1个字节的地址个字节的地址 注意指针的基类型为注意指针的基类型为void,即不指向任何,即不指向任何类型的数据,只提供一个地址类型的数据,只提供一个地址如果此函数未能成功地执行(例如内存空间如果此函数未能成功地执行(

11、例如内存空间不足),则返回空指针不足),则返回空指针(NULL)2022年2月24日19时39分有以下程序段有以下程序段int *p;p= _ malloc( sizeof( int );若要求使若要求使p指向一个指向一个int型的动态存储单元,在横线处应填型的动态存储单元,在横线处应填入的是入的是( )A (int *)B intC int *D ( *int )参考答案:参考答案:A【解析】本题考查【解析】本题考查malloc函数,题目中要求函数,题目中要求p指向一个指向一个int型的动态存储单元,那么就应该将分配的存储单元转化为型的动态存储单元,那么就应该将分配的存储单元转化为int,所

12、以选项,所以选项A正确。正确。2022年2月24日19时39分2calloc函数函数其函数原型为其函数原型为 void *calloc(unsigned n,unsigned size); 其作用是在内存的动态存储区中分配其作用是在内存的动态存储区中分配n个长度个长度为为size的连续空间,这个空间一般比较大,的连续空间,这个空间一般比较大,足以保存一个数组。足以保存一个数组。2022年2月24日19时39分用用calloc函数可以为一维数组开辟动态存储函数可以为一维数组开辟动态存储空间,空间,n为数组元素个数,每个元素长度为为数组元素个数,每个元素长度为size。这就是动态数组。函数返回指向

13、所分。这就是动态数组。函数返回指向所分配域的起始位置的指针;如果分配不成功,配域的起始位置的指针;如果分配不成功,返回返回NULL。如:。如: p=calloc(50,4); 开辟开辟504个字节的临时分配域,把起始个字节的临时分配域,把起始地址赋给指针变量地址赋给指针变量p 2022年2月24日19时39分3free函数函数其函数原型为其函数原型为 void free(void *p); 其作用是释放指针变量所指向的动态其作用是释放指针变量所指向的动态空间,使这部分空间能重新被其他变量空间,使这部分空间能重新被其他变量使用。使用。p应是最近一次调用应是最近一次调用calloc或或malloc

14、函数时得到的函数返回值。函数时得到的函数返回值。2022年2月24日19时39分 free(p);释放指针变量所指向的已分配的动态释放指针变量所指向的已分配的动态空间空间 free函数无返回值函数无返回值2022年2月24日19时39分4. realloc函数函数其函数原型为其函数原型为void *realloc(void *p,unsigned int size);如果已经通过如果已经通过malloc函数或函数或calloc函数获函数获得了动态空间,想改变其大小,可以用得了动态空间,想改变其大小,可以用recalloc函数重新分配。函数重新分配。2022年2月24日19时39分用用reall

15、oc函数将函数将p所指向的动态空间的大所指向的动态空间的大小改变为小改变为size。p的值不变。如果重分配不的值不变。如果重分配不成功,返回成功,返回NULL。如。如 realloc(p,50); 将将p所指向的已分配的动态空间改为所指向的已分配的动态空间改为50字节字节 2022年2月24日19时39分以上以上4个函数的声明在个函数的声明在stdlib.h头文件中,头文件中,在用到这些函数时应当用在用到这些函数时应当用“#include ”指令把指令把stdlib.h头文件包含头文件包含到程序文件中。到程序文件中。2022年2月24日19时39分 例例13.1 建立动态数组,输入建立动态数组

16、,输入5个学生的成个学生的成绩,另外用一个函数检查其中有无低于绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。分的,输出不合格的成绩。2022年2月24日19时39分 解题思路:用解题思路:用malloc函数开辟一个动态函数开辟一个动态自由区域,用来存自由区域,用来存5个学生的成绩,会得到个学生的成绩,会得到这个动态域第一个字节的地址,它的基类这个动态域第一个字节的地址,它的基类型是型是void型。用一个基类型为型。用一个基类型为int的指针的指针变量变量p来指向动态数组的各元素,并输出它来指向动态数组的各元素,并输出它们的值。但必须先把们的值。但必须先把malloc函数返回的函数返回的void指针转换为整型指针,然后赋给指针转换为整型指针,然后赋给p12022年2月24日19时39分#include #include in

温馨提示

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

评论

0/150

提交评论