




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机程序设计基础 刘宝林清华大学计算机系 2 数组作为函数的参数变量的存储类型及作用范围不同类型变量的初始化内部函数和外部函数 第八讲函数 3 函数间的参数传递 在函数被调用时才给形参分配存储单元 实参可以是常量 变量或表达式 实参类型必须与形参相符 传递时是传递参数值 即单向传递数组作为参数时的情况 数组元素作实参与单个变量一样 数组元素可以作为表达式的组成部分 计算机软件技术基础 4 数组名作函数参数数组名代表地址 因此传递的是一个地址值 voidmain inta 10 f a intf intx 10 计算机软件技术基础 5 说明 1 应该在主调函数和被调用函数中分别定义数组 2 实 形参数组类型要一致 如不一致 结果将出错 3 实参数组与形参数组的大小可以一样 也可以不一样 C编译系统对形参数组的大小不作检查 只是将实参数组的首地址传递给形参数组 如果要求形参数组得到实参数组的全部元素值 则应指定实参数组与形参数组的大小一样 4 数组名作函数参数时 不是值传递 不是单向传递 而是把实参数组的首地址传递给形参数组 这样两个数组就共占同一段内存单元 计算机软件技术基础 6 例1比较数组的大小比较的原则如下 若A数组中的元素大于B数组中相应元素的数目多于B数组中元素大于A数组中相应元素的数目 则认为A数组大于B数组如a i b i 8次 b i a i 3次 则A数组大于B数组 include stdio h voidmain intlarge int int inta 10 b 10 i n 0 m 0 k 0 printf enterarraya n for i 0 i 10 i scanf d 初始化数组a 初始化数组b 7 for i 0 ib i dtimes na i b i dtimes na i k printf arrayaislargerthanarrayb n elseif n k printf arrayaissmallerthanarrayb n elseprintf arrayaisequaltoarrayb n 演示7 1 intlarge intx inty intflag if x y flag 1 elseif x y flag 1 elseflag 0 return flag 8 例2有一个一维数组score 内放10个学生成绩 求平均成绩 average 为形参数组 score 为实参数组 存有10个学生成绩 arraynameasaparameter floataverage floatarray 10 演示7 2 inti floataver floatsum array 0 for i 1 i 10 i sum sum array i aver sum 10 return aver include stdio h voidmain floatscore 10 aver inti printf input10scores n for i 0 i 10 i scanf f 9 局部变量和全局变量 局部变量 在函数内部定义的变量 它只在本函数范围内起作用 floatf1 inta 函数f1 intb c a b c有效 charf2 intx inty 函数f2 inti j x y i j有效 voidmain 主函数 intm n m n有效 10 说明 1 主函数中定义的变量也只在主函数中有效 2 不同函数中可以使用相同名字的变量 它们代表不同的对象 互不干扰 3 形式参数也是局部变量 4 在一个函数内部 可以在复合语句中定义变量 这些变量只在本复合语句中有效 voidmain inta b a b在此范围内有效 intc c a b c仅在此范围内有效 11 全局变量 在函数之外定义的变量 它的作用范围是从定义变量的位置开始到本源文件结束 intp 1 q 5 外部变量 floatf1 inta 函数f1 intb c charc1 c2 外部变量 charf2 intx inty 函数f2 inti j voidmain 主函数 intm n 12 例3有一个一维数组 内放10个学生成绩 求平均成绩 最高分和最低分 floatmax 0 min 0 floataverage floatarray intn inti floataver sum array 0 max min array 0 for i 1 imax max array i elseif arry i min min arry i include stdio h sum sum array i voidmain aver sum n floatave score 10 return aver inti for i 0 i 10 i scanf f 全局变量 可利用全局变量得到一个以上的返回值 13 例4 外部变量定义与外部变量说明 intmax intx inty intz if x y z x elsez y return z include stdio h voidmain externinta b printf d max a b inta 13 b 8 外部变量说明 在函数外部定义 在函数内部可使用 外部变量定义 在函数之外只能定义一次 1 删去extern 有何结果 2 把inta 13 b 8 移到程序的顶部 有何不同 14 注意 1 全局变量在程序的全部执行过程都占用内存 2 考虑程序的模块性 通用性 可读性 应少用全局变量 3 全局变量太多 当程序长且大时 往往难以清楚地判断出各个瞬时各个外部变量的值 4 如果在函数块中使用到一个本函数前没有定义过的参数 则要用extern作外部变量说明 5 如果在同一个源文件中 外部变量与局部变量同名 则在局部变量的作用范围内外部变量不起作用 15 动态存储变量与静态存储变量 从变量作用范围的角度来分 1 全局变量2 局部变量从变量存在时间的角度来分 1 静态存储变量2 动态存储变量静态存储方式 是指在程序运行期间分配固定的存储空间的方式 动态存储方式 是指在程序运行期间根据需要进行动态的分配存储空间的方式 每一个变量和函数有两个属性 数据类型和数据的存储类别 16 变量的存储类别 auto自动的存放在动态存储区中 属一时性存储 其存储空间可以被若干变量多次覆盖使用 static静态的存放在内存静态存储区中register寄存器的存放在CPU的通用寄存器中extern外部的 计算机软件技术基础 17 局部变量的存储方式对函数中的局部变量 如果未加static说明的 都是动态分配存储空间的 存储在动态存储区中 这类局部变量称为自动变量 用auto说明 intf inta 定义函数f和形参a autointb c 定义b c为自动变量 b 2 c 3 用static加以说明的变量称为局部静态变量 在函数调用结束后 其占用的存储单元不释放 变量的值不消失而保留原来的值 计算机软件技术基础 18 例5打印1到5的阶乘值 intfac intn staticintf 1 f f n return f include stdio h voidmain inti for i 1 i 5 i printf d d n i fac i 何时需用局部静态变量1 需要保留函数上一次调用时的值 2 变量初始化后 只被引用而不改变其值 3 函数中的数组要初始化时必须用局部静态变量 局部静态变量 19 例6本程序说明 auto 和 static 的不同 include stdio h intf inta autointb 0 staticintc 3 printf b d c d b c b b 1 c c 1 return a b c voidmain inta 2 i for i 0 i 3 i printf i d f a d n i f a 演示7 3 static 将保留最后一次的计算结果 而 auto 却不能 20 寄存器变量用关键字register作说明 registerinta b 存取数数注意 寄存器变量不放在内存中 函数执行完释放 寄存器数目有限局部静态变量不能定义为寄存器变量registerstaticinta b 非法 21 全局变量的存储方式全局变量是在函数外部定义的 编译时分配在静态存储区 全局变量可以为程序中各个函数所引用 有两种情况 1 允许其它文件中的函数引用2 只被本文件中的函数引用file1 cfile2 cinta 3 externinta voidmain f printf d a 22 23 对一个数据的定义 需指定两种属性 数据类型和存储类别 分别用两个关键字进行定义 staticinta 静态内部变量或静态外部变量 autocharc 自动变量 在函数内定义 registerintd 寄存器变量 在函数内定义 externintb 说明b是一个已被定义的外部变量 1 从作用域角度区分局部变量 1 自动变量 即动态局部变量 离开函数 值就消失 2 静态局部变量 离开函数 值仍保留 3 寄存器变量 离开函数 值就消失 4 形式参数可以定义为自动变量或寄存器变量 24 全局变量 1 静态外部变量 只限本文件引用 2 外部变量 非静态外部变量 允许其它文件引用 2 从变量存在时间来区分动态存储 1 自动变量 本函数内有效 2 寄存器变量 本函数内有效 3 形式参数静态存储 1 静态局部变量 本函数内有效 2 静态外部变量 本文件内有效 2 外部变量 其它文件可引用 25 3 从变量值存放的位置区分内存中静态存储区 1 静态局部变量 2 静态外部变量 2 外部变量 其它文件可引用 内存中动态存储区 自动变量和形式参数CPU中的寄存器 寄存器变量4 作用域与生存期作用域 从空间的角度生存期 从时间的角度 26 不同类型变量的初始化 1 auto和register变量若被初始化 则每当进入该程序块后 都执行该变量的初始化赋值功能 2 没有进行初始化的auto和register变量 其初值不定 不能直接在程序中使用 3 static和全局变量若不初始化 自动赋0 4 static和全局变量初始化时必须用常量为其赋初值 auto和register变量初始化时可以用常量或变量赋初值 5 static型局部变量的初始化仅执行一次 6 extern型的变量不能进行初始化 计算机软件技术基础 27 例7 a为外部变量 b为静态外部变量 inta staticintb include stdio h voidmain voidnext a 30 b 100 printf a db d n a b next printf a db d n a b voidnext a a b Result a 30b 100a 130b 100 28 例8 静态变量与全局变量之间的不同 inti 1 include stdio h voidmain voidother staticinta registerintb 10 intc 0 printf i da db dc d n i a b c c c 8 other printf i da db dc d n i a b c i i 10 other voidother staticinta 2 演示8 0 staticintb intc 10 a a 2 i i 32 c c 5 printf i da db dc d n i a b c b a 29 内部函数和外部函数 内部函数只能被本文件中其它函数所调用定义形式 static类型标识符函数名 形参表 不同文件中同名内部函数互不干扰外部
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年哈尔滨石化分公司春季高校毕业生招聘模拟试卷附答案详解(模拟题)
- 2025国家电网内蒙古新正产业发展有限公司高校毕业生招聘41人(第三批)模拟试卷及答案详解(典优)
- 2025年宁德市供电服务有限公司招聘30人模拟试卷及答案详解(夺冠系列)
- 2025年上半年山东铁投集团校园招聘、社会公开招聘165人模拟试卷带答案详解
- 2025年金华东阳市人民医院招聘编外人员8人考前自测高频考点模拟试题有完整答案详解
- 2025年城步苗族自治县事业单位公开选调工作人员模拟试卷完整答案详解
- 2025年合肥长丰县部分单位招聘39人考前自测高频考点模拟试题及一套完整答案详解
- 2025年10月全国企业管理咨询自考试题及答案
- 2025吉林省地震局第二批次事业单位开招聘1人考前自测高频考点模拟试题附答案详解(模拟题)
- 2025福建莆田市荔城区事业单位定向招考未就业随军家属1人模拟试卷有答案详解
- 2025年党的理论知识考试试题以及答案
- 《中国类风湿关节炎诊疗指南》(2025版)
- 辽宁省沈文新高考研究联盟2025-2026学年高二上学期开学测试英语试卷
- 《英国下午茶文化》课件
- 2025-2030太极拳教学市场细分领域及渠道布局与竞争战略分析报告
- 虚拟商品消费行为-洞察及研究
- 2 中国人首次进入自己的空间站 公开课一等奖创新教案 统编版语文八年级上册
- 2025年广告设计师职业技能竞赛(省赛)参考试题(附答案)
- 美业服务能力提升培训课件
- 基孔肯雅热科普宣传学习课件
- 2025年北京市专业技术人员公需科目培训答案
评论
0/150
提交评论