第七章 变量的存储 预处理.ppt_第1页
第七章 变量的存储 预处理.ppt_第2页
第七章 变量的存储 预处理.ppt_第3页
第七章 变量的存储 预处理.ppt_第4页
第七章 变量的存储 预处理.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1 第七章变量存储及预处理 变量是对程序中数据的存储空间的抽象 编译或函数调用时为其分配内存单元 10 程序中使用变量名对内存操作 变量的属性数据类型 变量所持有的数据的性质 操作属性 存储属性 存储器类型 寄存器 静态存储区 动态存储区生存期 变量在某一时刻存在 静态变量与动态变量作用域 变量在某区域内有效 局部变量与全局变量变量定义格式 存储类型 数据类型变量表 例 intsum externinta b c registerinti staticfloatx y 3 变量的作用域 变量的作用域 变量有效的范围 语言中所有的变量都有自己的作用域 变量说明的方式不同 其作用域也不同 语言的变量 按作用域范围可分为两种 局部变量和全局变量 4 局部变量 内部变量 定义 在函数内定义 只在本函数内有效说明 main中定义的变量只在main中有效不同函数中同名变量 占不同内存单元形参属于局部变量可定义在复合语句中有效的局部变量 5 例 不同函数中同名变量 main inta b a 3 b 4 printf main a d b d n a b sub printf main a d b d n a b sub inta b a 6 b 7 printf sub a d b d n a b 运行结果 main a 3 b 4sub a 6 b 7main a 3 b 4 6 全局变量 外部变量 定义 在函数外定义 可为本文件所有函数共用 有效范围 从定义变量的位置开始到本源文件结束 及有extern声明的其它源文件 应尽量少使用全局变量 因为 全局变量在程序全部执行过程中占用存储单元降低了函数的通用性 可靠性 可移植性降低程序清晰性 容易出错 定义声明次数 只能1次可声明多次位置 所有函数之外函数内或函数外分配内存 分配内存 可初始化不分配内存 不可初始化 外部变量声明 extern数据类型变量表 外部变量定义与外部变量声明不同 若外部变量与局部变量同名 则外部变量被屏蔽 7 inta 3 b 5 max inta intb intc c a b a b return c main inta 8 printf max d max a b 例 外部变量与局部变量 运行结果 max 8 例 外部变量定义与声明 externinta b intmax intz z a b a b return z main printf max d max inta 13 b 8 外部变量定义及初始化 外部变量声明 运行结果 max 13 8 externcharc1 c2 externcharc1 c2 9 voidmain voidgx gy externintx y printf 1 x d ty d n x y y 246 gx gy voidgx externintx y x 135 printf 2 x d ty d n x y intx y voidgy printf 3 x d ty d n x y 例 用extern扩展外部变量作用域 运行结果 1 x 0y 02 x 135y 2463 x 135y 246 10 引用其它文件中的外部变量 11 变量的存储类型 内存用户区 12 动态变量与静态变量存储方式静态存储 程序运行期间分配固定存储空间动态存储 程序运行期间根据需要动态分配存储空间 生存期静态变量 从程序开始执行到程序结束动态变量 从包含该变量定义的函数开始执行至函数执行结束 变量的存储类型auto 自动型register 寄存器型static 静态型extern 外部型 13 变量存储类型 局部变量默认为auto型register型变量个数受限 且不能为long double float型局部static变量具有全局寿命和局部可见性局部static变量具有可继承性extern不用于变量定义 可扩展外部变量作用域 14 例 文件file1 cinta main f2 f1 f1 autointb f2 f2 staticintc 15 main voidincrement void increment increment increment voidincrement void intx 0 x printf d n x 例 局部静态变量值具有可继承性 运行结果 111 main voidincrement void increment increment increment voidincrement void staticintx 0 x printf d n x 运行结果 123 16 例 变量的寿命与可见性 includeinti 1 main staticinta registerintb 10 intc 0 printf MAIN n printf i da d b dc d n i a b c c c 8 other printf MAIN n printf i da d b dc d n i a b c i i 10 other other staticinta 2 staticintb intc 10 a a 2 i i 32 c c 5 printf OTHER n printf i da d b dc d n i a b c b a Main i 1a 0b 10c 0 Other i 33a 4b 0c 15 Main i 33a 0b 10c 8 Other i 75a 6b 4c 15 8 4 33 15 4 43 6 75 15 6 17 includeinti 10 intmain inti 1 printf d t i inti 2 pritnf d t i externi i 1 printf d t i printf d t i printf d n i 运行结果为 121132 例 18 内存动态申请和释放 void malloc unsignedintsize 在动态存储区分配长度为size的连续空间 并返回指向该空间起始地址的指针 若分配失败 系统不能提供所需内存 则返回空指针 NULL 例 int p int malloc sizeof int length voidfree void ptr 释放ptr指向的内存空间 ptr是malloc 函数返回的值 例 free p 19 内部函数和外部函数 函数一旦定义后就可被其它函数调用 但当一个源程序由多个源文件组成时 在一个源文件中定义的函数能否被其它源文件中的函数调用呢 语言把函数分为两类 内部函数外部函数 20 内部函数 如果在一个源文件中定义的函数只能被本文件中的函数调用 而不能被同一源程序其它文件中的函数调用 这种函数称为内部函数 定义内部函数的一般形式是 static类型说明符函数名 形参表 例如 staticintf inta intb 内部函数也称为静态函数 但此处静态static的含义已不是指存储方式 而是指对函数的调用范围只局限于本文件 21 外部函数 外部函数在整个源程序中都有效 其定义的一般形式为 extern类型说明符函数名 形参表 例如 externintf inta intb 如在函数定义中没有说明extern或static则隐含为extern 在一个源文件的函数中调用其它源文件中定义的外部函数时 应用extern说明被调函数为外部函数 22 小结 可从三个方面对变量分类 即变量的数据类型 变量作用域和变量的存储类型 在第二章中主要介绍变量的数据类型 本章中介绍了变量的作用域和变量的存储类型 变量的作用域是指变量在程序中的有效范围 分为局部变量和全局变量 变量的存储类型是指变量在内存中的存储方式 分为静态存储和动态存储 表示了变量的生存期 23 作用 对源程序编译之前做一些处理 有助于提高程序的可移植性 灵活性及编译效率 主要有 宏定义 define文件包含 include条件编译 if else endif等格式 开头占单独书写行语句尾不加分号 预处理概述 24 宏定义 一 不带参数宏定义 一般形式 define宏名 宏体 功能 用指定标识符 宏名 代替字符序列 宏体 宏体可缺省 表示宏名定义过或取消宏体 如 defineYES1 defineNO0 definePI3 1415926 defineOUTprintf Hello World 25 如if x YES printf correct n elseif x NO printf error n 展开后 if x 1 printf correct n elseif x 0 printf error n 宏展开 预编译时 用宏体替换宏名 不作语法检查 定义位置 任意 一般在函数外面 作用域 从定义命令到文件结束 undef可终止宏名作用域格式 undef宏名 宏定义可嵌套 不能递归 例 defineMAXMAX 10 引号中的内容与宏名相同也不置换 例 definePI3 14159printf 2 PI f n PI 2 宏展开 printf 2 PI f n 3 14159 2 宏定义中使用必要的括号 例 defineWIDTH80 defineLENGTHWIDTH 40var LENGTH 2 宏展开 var 80 40 2 26 二 带参数宏定义一般形式 define宏名 参数表 宏体 例 defineS r PI r r相当于定义了不带参宏S 代表字符串 r PI r r 宏展开 形参用实参换 其它字符保留宏体及各形参外一般应加括号 例 defineS a b a b area S 3 2 宏展开 area 3 2 不能加空格 例 definePOWER x x xx 4 y 6 z POWER x y 宏展开 z x y x y 一般写成 definePOWER x x x 宏展开 z x y x y 27 defineMAX x y x y x y main inta b c d t t MAX a b c d 宏展开 t a b c d a b c d intmax intx inty return x y x y main inta b c d t t max a b c d 例 用宏定义和函数实现同样的功能 28 带参数宏与函数的区别 29 文件包含 功能 一个源文件可将另一个源文件的内容全部包含进来一般形式 include 文件名 或 include 处理过程 预编译时 用被包含文件的内容取代该预处理命令 再对 包含 后的文件作一个源文件编译 直接按标准目录搜索 先在当前目录搜索 再搜索标准目录 文件名可指定路径 30 被包含文件内容源文件 c 头文件 h 宏定义数据结构定义函数声明等 文件包含可嵌套 调用库函数加强类型检查提高程序可读性 31 文件包含举例 32 条件编译 按不同的条件去编译不同的程序部分 产生不同的目标代码文件 三种形式 ifdef标识符程序段1 else程序段2 endif ifndef标识符程序段1 else程序段2 endif if常量表达式程序段1 else程序段2 endif 33 条件编译举例 defineDEBUG ifdefDEBUGprintf x d y d n x y endif 小结 预处理功能是 语言特有的功能 它是在对源程序正式编译前由预处理程序完成的 程序员在程序中用预处理命令来调用这些功能 宏定义是用一个标识符来表示一个字符串 这个字符串可以

温馨提示

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

评论

0/150

提交评论