




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章重点 13.1 编译预处理 13.2 动态存储分配,第13章 编译预处理和动态存储分配,13.1 编译预处理 13.1.1 宏替换 1无参数的宏定义 宏定义是指用一个指定的标识符(即名字)来代表程序中一个字符串。它的一般形式为: define 宏名 字符串 或 define 宏名 例如: define SIZE 10 标识符SIZE称为宏名,此命令执行后,预处理程序对源程序中的所有名为SIZE的标识符用10来替换,此过程就称为“宏替换”。,其中,“”表示这是一条预处理命令,“define”为宏定义命令,“宏名”为一个合法的标识符,“字符串”可以是常数、表达式或语句,甚至可以是多条语句。 说明: (1)宏定义与变量定义含义不同,它只作字符替换,并不分配内存空间,也不能认为是赋值。 (2)宏定义是用宏名代替一个字符串,是一种机械的置换,不作任何语法检查。 (3)宏定义结尾不必加分号。如果加了分号,则被认为是字符串的一部分,即在预处理时,分号也被一起替换。 (4)替换文本中也可以包含已定义过的宏名。,( 5)宏名的有效范围从定义之后到本源文件结束,出了这个文件,宏名便失却了作用 (6)若宏名出现在一对双引号中,将不会产生宏替换。例如,如果ADD是已经定义的宏名,则不能用与它相关的替换文本来替换 printf(“ADD”)中的ADD。 (7)宏定义还可以定义运算符、表达式,甚至可以把输出格式语句作为宏定义。 (8)替换文本并不替换用户标识符中的成分。,2带参数的宏定义 宏定义除了允许定义符号常量外,还可以用于定义带有参数的宏。在宏定义中的参数称为形式参数,简称形参;在宏调用中的参数称为实际参数,简称实参。带参数的宏定义一般形式为: define 宏名(形参表) 字符串 在编译预处理时,程序中凡是带实参的宏,一律按#define命令行中指定的字符串从左到右进行替换。 对于字符串中的字符不是参数字符(如*号),则保留不变。,说明 (1)宏名与形参表之间不能有空格出现 (2)在定义带参数的宏是,一对圆括号必不可少,圆括号中实参的个数应该与形参个数相同,若有多个参数,之间用逗号隔开。 (3)宏替换时,实参不能替换扩在双引号中的形参。 (4)带参数的宏与带参数的函数的区别: a. 带参数的宏仅是简单机械的字符替换,并不计算实参表达式的值; b. 宏名无类型,宏参数也不存在类型问题,因此宏定义中的字符串可以是任何类型的数据,而函数中的实参和形参都要定义类型,两者要求一致; c. 宏替换是预编译处理时进行的,不占运行时间,而函数调用则是在程序运行时进行的,占用运行时间(如分配单元、保留现场、值传递、返回等); d. 宏是原样替换,展开后源程序增长,而函数调用则不会。,以下程序运行结果是() #include #define N 5 #define M N+1 #define f(x) (x*M) main() int i1, i2; i1=f(2); i2=f(1+1); printf(”%d %dn”, i1,i2); 11 7,13.1.2 文件包含 在用C语言开发程序时,我们可以把一些宏定义按照功能分别存入不同的文件中,当我们需要使用某类宏定义时,就无需在程序中重新去定义,而只要把这些宏定义所在的文件包含在程序的开头就可以了。 文件包含是指一个源程序文件将另一个指定文件的全部内容包含进来,即将另一个文件包含到本文件之中。这一过程通过预处理命令#include来完成。文件包含预处理语句的一般形式为: include 或 include “包含文件”,其中,包含文件名是磁盘中文本文件的名字。例如: #include 或 #include “stdio.h“ 在编译时,预编译程序将用指定文件中的内容来替换此命令行。 13.2 动态存储分配 此前,我们用于存储数据的变量和数组都必须在说明部分进行定义。C编译程序通过定义语句了解它们所需存储空间的大小,并预先为其分配适当的内存空间。这些空间一经分配,在变量或数组的生存期内是固定不变的。所以这种方式也称为“静态存储分配”。,C语言中还有一种“动态存储分配”的内存空间分配方式,在程序执行期间需要空间来存储数据时,通过申请分配指定的内存空间;当有闲置不用的空间时,可以随时将其释放,由系统另作它用。用户可以通过调用C语言提供的标准库函数来实现动态分配,从而得到指定数目的内存空间或释放指定的内存空间。 13.2.1 malloc函数和free函数 1malloc函数 malloc函数的调用形式为: malloc(size) 其中size的类型为unsigned int,函数返回值类型为void*。,2free函数 free函数调用的形式为:free(p) p是指针变量,必须指向由动态分配函数malloc分配的地址,free函数将指针p所指的存储空间释放,使这部分空间可以由系统重新支配。此函数没有返回值。,13.2.2 calloc函数 calloc函数的调用形式为: calloc(n,size); n和size的类型都为unsigned int型。其返回值的类型为void*。 calloc函数用来给n个同一类型的数据项分配连续的存储空间。每个数据项的长度为size个字节,若分配成功,函数返回存储空间的首地址。否则返回空。由调用calloc函数所分配的存储单元,系统自动设置初值为0。,例如: char *ps; ps=(char *)calloc(10,sizeof(char); 以上语句开辟了10个连续的char类型的存储单元,由ps指向存储单元的首地址。每个存储单元可以存放一个字符。 显然,使用calloc函数开辟的动态存储单元相当于开辟了一个一维数组。函数的第一个参数决定了一维数组的大小;第二个参数决定了数组元素的类型。函数的返回值就是数组的首地址。 使用calloc函数开辟的动态存储单元,同样用free函数释放。调用形式: free(p),1. 以下程序运行后的输出结果是() #include #define PT 3.5; #define S(x) PT*X*X; main() int a=1, b=2; printf(“%4.1fn”,S(a+b); A) 14.0 B) 31.5 C) 7.5 D) 程序出错 2. 设有宏定义:#define IsDIV(k,n) (k%n=1)?1:0)且变量m已正确定义并赋值,则宏调用 IsDIV(m,5)& IsDIV(m,7)为真时,所要表达的是() A)判断m是否能被5或者7整除 B) 判断m是否能被5和7整除 C) 判断m被5或者7整除是否余1 D) 判断m被5和7整除是否余1,以下程序运行的结果是() #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) 出错,4. 以下关于宏定义的叙述中,正确的是() A) 宏名必须用大写字母表示 B) 宏定义必须位于源程序中所有语句之前 C) 宏替换没有数据类型限制 D) 宏调用比函数调用耗费时间 5. 以下叙述中错误的是() A) 在程序开中凡是以“#”开始的语句都是预处理命令行 B) 预处理命令行的最后不能以分号表示结束 C) #define MAX 是合法的宏定义命令行 D) C程序对预处理命令行的处理是在程序执行的过程中进行的,有一个名为init.txt的文件,内容如下: #define HDY(A,B) A/B #define PRINT(Y) printf(“y=%dn”, Y) 以下程序的运行结果是() #include “intit.txt” main() int a=1, b=2, c=3,d=4, k; k=HDY(a+c, b+d); PRINT(k); A) 编译有错 B) 运行出错 c) y=0 D) y=6,8. 以下叙述中错误的是() A) C程序中的#include 和 #define行均不是C语句 B) 除逗号运算符外,赋值运算符的优先级最低 C) C程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 推动职业教育教学关键要素改革的策略及实施方案分析
- 推动城镇老旧小区升级改造计划
- 提升特殊教育质量的创新策略与实践路径
- 海洋能发展策略与实施路径探索
- 高校思想政治工作策略及实施路径方案
- 网络规划设计师考试的知识框架构建试题及答案
- 文明上网测试题及答案
- 激光工程师证书考试必考环节试题及答案
- 秧歌教师面试题及答案
- 从食物采集到食物生产-2023-2024学年高三历史二轮(专题训练)原卷版
- 店长劳务合同协议
- 2024年地理中考模拟考试地理(江苏泰州卷)(A4考试版)
- 乳腺癌诊治指南与规范(2025年版)解读
- 2024年上海嘉定区区属国有企业招聘真题
- 2025河北建投水务招聘29人易考易错模拟试题(共500题)试卷后附参考答案
- 常德辅警考试题库
- 基于核心素养的初中历史跨学科教学策略研究
- GB/T 18655-2025车辆、船和内燃机无线电骚扰特性用于保护车载接收机的限值和测量方法
- 2025年高压电工作业考试国家总局题库及答案(共280题)
- 2024年中国心力衰竭诊断和治疗指南2024版
- 2024年北京中考地理试卷
评论
0/150
提交评论