C语言第8章函数与预处理命令.ppt

上传人:tia****nde 文档编号:6407559 上传时间:2020-02-24 格式:PPT 页数:34 大小:275.50KB
返回 下载 相关 举报
C语言第8章函数与预处理命令.ppt_第1页
第1页 / 共34页
C语言第8章函数与预处理命令.ppt_第2页
第2页 / 共34页
C语言第8章函数与预处理命令.ppt_第3页
第3页 / 共34页
点击查看更多>>
资源描述
1 第8章函数与预处理命令 华北电力大学计算机系 C语言程序设计 2 2 第8章函数与预处理命令 8 6变量的存储类别及变量的生存期8 7编译预处理8 8多文件程序的调试方法8 9指向函数的指针变量 3 8 6变量的存储类别及变量的生存期 8 6 1变量的生存期与变量的存储分类 变量的生存期 变量在内存中占据存储空间的时间 思考 1 何时为变量分配内存单元 2 将变量分配在内存的什么区域 3 变量占据内存的时间 生存期 动态存储变量 静态存储变量 4 8 6 2变量的存储类别 变量的属性 数据类型 intx 决定为变量分配内存单元的长度 数据的存放形式 数的范围 存储类别 staticintx 决定了变量的生存期 给它分配在哪个存储区 5 变量定义语句的一般形式 存储类别 数据类型变量名1 变量名n auto 自动的 register 寄存器的 static 静态的 extern 外部的 1 自动变量 auto类别 可以省略 局部变量可以定义为自动变量 6 内存分配调用函数或执行分程序时在动态存储区为其分配存储单元 函数或分程序执行结束 所占内存空间即刻释放 变量的初值定义变量时若没赋初值 变量的初值不确定 如果赋初值则每次函数被调用时执行一次赋值操作 生存期在函数或分程序执行期间 作用域自动变量所在的函数内或分程序内 自动变量 7 2 静态变量 static类别 除形参外 局部变量和全局变量都可以定义为静态变量 8 内存分配编译时 将其分配在内存的静态存储区中 程序运行结束释放该单元 静态变量的初值若定义时未赋初值 在编译时 系统自动赋初值为0 若定义时赋初值 则仅在编译时赋初值一次 程序运行后不再给变量赋初值 生存期整个程序的执行期间 作用域局部静态变量的作用域是它所在的函数或分程序 全局静态变量的作用域是从定义处开始到本源文件结束 静态变量 9 includeintfunc intn intf 1 f f n returnf voidmain inti n 5 for i 2 i n i printf d func i includeintfunc intn staticintf 1 f f n returnf voidmain inti n 7 for i 2 i n i printf d func i 运行结果 2 3 4 5 6 7 运行结果 2 6 24 120 720 5040 10 intc staticinta main floatx y chars f staticintb 1 3 外部变量 extern类别 在函数外定义的变量若没有用static说明 则是外部变量 外部变量只能隐式定义为extern类别 不能显式定义 11 内存分配编译时 将其分配在静态存储区 程序运行结束释放该单元 变量的初值若定义变量时未赋初值 在编译时 系统自动赋初值为0 生存期整个程序的执行期间 作用域从定义处开始到本源文件结束 此外 还可以用extern进行声明 以使其作用域扩大到该程序的其它文件中 外部变量 问题 全局静态变量的作用域可以扩展到本程序的其它文件吗 12 外部变量声明的一般格式 extern数据类型变量名1 变量名n 或extern变量名1 变量名n 注意 外部变量声明用关键字extern 而外部变量的定义不能用extern 只能隐式定义 定义外部变量时 系统要给变量分配存储空间 而对外部变量声明时 系统不分配存储空间 只是让编译系统知道该变量是一个已经定义过的外部变量 与函数声明的作用类似 13 intp 1 q 5 floatf1 inta externcharc1 c2 charc1 c2 charf2 intx inty main 思考 在f1函数中声明c1 c2的作用是什么 如何修改程序使所有函数都可以使用外部变量而又不需要声明 例8 24 在一个文件内声明外部变量 14 例8 25 在多文件的程序中声明外部变量 file1 c文件中程序如下 includeinti voidmain voidf1 f2 f3 i 1 f1 printf tmain i d i f2 printf tmain i d i f3 printf tmain i d n i voidf1 i printf nf1 i d i file2 c文件中程序如下 includeexterninti voidf2 inti 3 printf nf2 i d i voidf3 i 3 printf nf3 i d i 程序输出结果 f1 i 2main i 2f2 i 3main i 2f3 i 3main i 3 声明外部变量 定义外部变量 15 8 6 3归纳变量的分类 1 按照变量的作用域对变量分类 局部变量 全局变量2 按照变量的生存期对变量分类 静态存储变量包括 局部静态变量和全局静态变量 动态存储变量包括 自动变量 16 源文件 c 运行文件 exe 编译 编译 编译 目标文件 obj 连接 编译 连接 连接 编译预处理包括 宏定义文件包含条件编译 不讲 8 7编译预处理 17 define宏名字符串 宏定义的功能 在进行编译前 用字符串原样替换程序中的宏名这个替换过程称为 宏替换 或 宏展开 字符串也称为替换文本 命令的一般格式 8 7 1不带参数的宏定义 8 7编译预处理 续 18 8 7编译预处理 续 例如 definePI3 14voidmain floatr s c scanf f 替换 3 14 3 14 编译 19 8 7编译预处理 续 双引号中有与宏名相同的字符串不进行替换 已经定义的宏名可以被后定义的宏名引用 在预处理时将层层进行替换 说明 为了增加程序的可读性 建议宏名用大写字母 其他的标识符用小写字母 20 例7 29 不带参数的宏定义 源程序 definePI3 14 defineSPI r r defineV4 S r 3voidmain floatr printf nInputr scanf f 编译预处理后的程序 voidmain floatr printf nInputr scanf f S V S V 21 命令的一般形式 8 7 2带参数的宏定义 define宏名 形参表 字符串 功能 在编译预处理时 把源程序中所有带参数的宏名用宏定义中的字符串替换 并且用宏名后圆括号中的实参替换字符串中的形参 例如 defineMAX X Y X Y X Y 8 7编译预处理 续 22 8 7编译预处理 续 例8 30 带参数的宏定义 defineMAX x y x y x y voidmain printf d n a b MAX a b printf d n MAX a m b n 分两次替换 将宏名MAX a b 替换成字符串 x y x y 用实参a替换形参x 实参b替换形参y 程序中的两个printf语句被展开为 printf d n a b a b printf d n a m b n a m b n 23 8 7编译预处理 续 例8 31 分析下面程序运行后的输出结果 defineMA x x x 1 voidmain inta 1 b 2 printf d n MA 1 a b 分两次替换 MA 1 a b 用x x 1 替换 用1 a b替换x printf语句被展开为 printf d n 1 a b 1 a b 1 特别注意 由于替换文本中的x没有用括号括起 因此 1 a b也不能用括号括起 程序输出结果 8 24 8 7编译预处理 续 命令的一般形式格式1 include格式2 include 文件名 8 7 3文件包含 文件包含是将指定的某个源文件的内容全部包含到当前文件中 用include命令实现 用格式1 预处理程序仅在系统指定目录下查找指定文件 用格式2 预处理程序首先在当前目录中查找指定文件 若找不到再到 系统指定目录中查找 25 7 8编译预处理 续 例如 调用sin x 函数时 要在程序的开头使用如下命令 include在预处理时 用math h文件内容替换 include命令行 2 功能在预处理时 将include命令后指定文件的内容替换该命令行 26 8 8多文件程序的调试方法 操作步骤如下 在VC环境下先建立一个工程 再在工程中建立若干个源文件 其中只有一个文件中有主函数main 例如 文件内容如下 file1 cfile2 cfile3 c 依次对上述3个文件编译 编译通过之后 再运行即可 1 使用工程文件将多个文件连接成一个可执行文件的方法 例如 将file1 c file2 c和file3 c合并成一个可执行文件 27 8 8多文件程序的调试方法 续 file3 c include file2 c include file3 c file1 c A file2 c B C B C A file1 c 预处理前 预处理后 28 8 9指向函数的指针变量 前面我们已经学过用指针变量间接访问一般变量 一维数组元素和二维数组元素C语言允许用指针变量间接调用函数 使程序设计更加灵活方便指向函数的指针变量定义形式 函数类型 指针变量名 如 void p p welcome 函数名是函数的入口地址 p 等价于welcome 说明 welcome是一个已经定义好的无返回值和形参的函数 29 8 9指向函数的指针变量 续 如 int s intint s max f s 5 7 等价于f max 5 7 说明 max是一个已经定义好的返回值为整型和有两个int型参数的函数 用指针变量调用函数的形式 指针变量名 实参表 30 注意以下定义的都是什么指针变量int p q 5 f float int p 指针变量 可以存放一个整型变量的地址q 指针数组 有5个可以存放整型变量地址的指针变量f 指针变量 可以存放函数值是int 带有两个参数 一个是float的指针类型 另一个是int类型的函数的入口地址 31 Test cpp includeintfunc intn staticintf 1 f f n returnf voidmain inti n 7 int p int p func for i 2 i n i printf d p i 32 Test c includeintfunc intn staticintf 1 f f n returnf voidmain inti n 7 int p p func for i 2 i n i printf d p i 33 用指针变量调用函数 先定义指针变量让指针变量指向函数指针变量 函数名用指针变量调用函数形式 指针变量名 实参 等价于 函数名 实参 34 例题 include includedoublefunc double p double doublex doublez z 3 14159 x 180 将角度换算为弧度return p z voidmain printf sin 90 7 2f n func sin 90 printf cos 90 7 2f n func cos 90 运行结果 sin 90 1 00cos 90 0 00
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!