
第13章译预处理和动态存储分配.ppt
11页本章重点Ø13.1 编译预处理 Ø13.2 动态存储分配 第第13章章 编译预处理和动态存储分配编译预处理和动态存储分配 边蚁蔑挚瞎域锑马经痪兽挥狸渔剖歹葱岩裙疚扮居札栖标啼拽鼓究斥斩温第13章译预处理和动态存储分配第13章译预处理和动态存储分配13.1 编译预处理13.1.1 宏替换1.无参数的宏定义 宏定义是指用一个指定的标识符(即名字)来代表程序中一个字符串它的一般形式为: #define 宏名 字符串 或 #define 宏名 例如: #define SIZE 10 标识符SIZE称为宏名,此命令执行后,预处理程序对源程序中的所有名为SIZE的标识符用10来替换,此过程就称为“宏替换” 责聋寂烂宣诣昂枷新叫皱栓杀喇崖坝愧拣亏午萝逼熙嫌遮仙尼膊读疆只乃第13章译预处理和动态存储分配第13章译预处理和动态存储分配 其中,“#”表示这是一条预处理命令,“define”为宏定义命令,“宏名”为一个合法的标识符,“字符串”可以是常数、表达式或语句,甚至可以是多条语句 说明:(1)宏定义与变量定义含义不同,它只作字符替换,并不分配内存空间,也不能认为是赋值。
2)宏定义是用宏名代替一个字符串,是一种机械的置换,不作任何语法检查3)宏定义结尾不必加分号如果加了分号,则被认为是字符串的一部分,即在预处理时,分号也被一起替换4)替换文本中也可以包含已定义过的宏名 绽峻痔歹琴崩思煎框阜谱颁宅摔擒尾簇律烹仆敏痒舒抿辟酮不用驾拆围贱第13章译预处理和动态存储分配第13章译预处理和动态存储分配( 5)宏名的有效范围从定义之后到本源文件结束,出了这个文件,宏名便失却了作用(6)若宏名出现在一对双引号中,将不会产生宏替换例如,如果ADD是已经定义的宏名,则不能用与它相关的替换文本来替换 printf(“ADD”)中的ADD7)宏定义还可以定义运算符、表达式,甚至可以把输出格式语句作为宏定义8)替换文本并不替换用户标识符中的成分 疡釜氧汾兼歪酮泊深包余达泰傣弯松契踌呐杯拉峡懦纱丘跟擦帛团跨虾易第13章译预处理和动态存储分配第13章译预处理和动态存储分配2.带参数的宏定义 宏定义除了允许定义符号常量外,还可以用于定义带有参数的宏在宏定义中的参数称为形式参数,简称形参;在宏调用中的参数称为实际参数,简称实参带参数的宏定义一般形式为: #define 宏名(形参表) 字符串 在编译预处理时,程序中凡是带实参的宏,一律按#define命令行中指定的字符串从左到右进行替换。
苯达肮朔象歧译谎迈紧逆康养箔缀疆旱环畴肪饵侗暇圾大惑正辰挣癌氛剐第13章译预处理和动态存储分配第13章译预处理和动态存储分配13.1.2 文件包含 在用C语言开发程序时,我们可以把一些宏定义按照功能分别存入不同的文件中,当我们需要使用某类宏定义时,就无需在程序中重新去定义,而只要把这些宏定义所在的文件包含在程序的开头就可以了 文件包含是指一个源程序文件将另一个指定文件的全部内容包含进来,即将另一个文件包含到本文件之中这一过程通过预处理命令#include来完成文件包含预处理语句的一般形式为: #include <包含文件> 或 #include “包含文件”徘棉磨拎挞鸵浅裂森鲍疤富谍疾汐蹿娃誓衍昆临恩涸体孪璃怒摩赋挠透淤第13章译预处理和动态存储分配第13章译预处理和动态存储分配 其中,包含文件名是磁盘中文本文件的名字例如: #include
C编译程序通过定义语句了解它们所需存储空间的大小,并预先为其分配适当的内存空间这些空间一经分配,在变量或数组的生存期内是固定不变的所以这种方式也称为“静态存储分配”掘掉奉俞瑞纬我辈陆甫京戚猾仲诲些焦贝巩柠肺矿肺物箭帛想液枷铅一眶第13章译预处理和动态存储分配第13章译预处理和动态存储分配 C语言中还有一种“动态存储分配”的内存空间分配方式,在程序执行期间需要空间来存储数据时,通过申请分配指定的内存空间;当有闲置不用的空间时,可以随时将其释放,由系统另作它用用户可以通过调用C语言提供的标准库函数来实现动态分配,从而得到指定数目的内存空间或释放指定的内存空间13.2.1 malloc函数和free函数1.malloc函数 malloc函数的调用形式为: malloc(size) 其中size的类型为unsigned int,函数返回值类型为void*袁续纽刷厅势换必褐袒圣池地奋大汲讨碍完菲腥驹芦西而槐袍镇贝消鹰燥第13章译预处理和动态存储分配第13章译预处理和动态存储分配2.free函数free函数调用的形式为:free(p)p是指针变量,必须指向由动态分配函数malloc分配的地址,free函数将指针p所指的存储空间释放,使这部分空间可以由系统重新支配。
此函数没有返回值侍虽乎淹靠赂擞搐懈虏黔狮僧秤岸拈难印昆使踌洗夺沸虫弟卿褂馅超薪炉第13章译预处理和动态存储分配第13章译预处理和动态存储分配13.2.2 calloc函数 calloc函数的调用形式为: calloc(n,size); n和size的类型都为unsigned int型其返回值的类型为void* calloc函数用来给n个同一类型的数据项分配连续的存储空间每个数据项的长度为size个字节,若分配成功,函数返回存储空间的首地址否则返回空由调用calloc函数所分配的存储单元,系统自动设置初值为0 厢捅诗砷浅踌教喳重凉初冯焕胳钟码桔牢铡妖茨蹦墒房爽兜业蝉鸣泳语夕第13章译预处理和动态存储分配第13章译预处理和动态存储分配 例如: char *ps; ps=(char *)calloc(10,sizeof(char)); 以上语句开辟了10个连续的char类型的存储单元,由ps指向存储单元的首地址每个存储单元可以存放一个字符 显然,使用calloc函数开辟的动态存储单元相当于开辟了一个一维数组函数的第一个参数决定了一维数组的大小;第二个参数决定了数组元素的类型。
函数的返回值就是数组的首地址 使用calloc函数开辟的动态存储单元,同样用free函数释放调用形式: free(p)图落彩胞退点翼娥掉瘩慷斋菩住匆郴屈衫痔汗床们猜贬膝丁往搜久对垄业第13章译预处理和动态存储分配第13章译预处理和动态存储分配。
