C语言 第7章 函数_第1页
C语言 第7章 函数_第2页
C语言 第7章 函数_第3页
C语言 第7章 函数_第4页
C语言 第7章 函数_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、1,1,第7章 函数,2,本章要点,函数的概念 函数的定义与调用 变量的作用域 函数的嵌套调用 函数的递归调用,本节内容,3,变量的作用域及存储类型,局部变量和全局变量 动态存储变量和静态存储变量 局部变量的存储方式 全局变量的存储方式,4,变量的存储方式和生存期,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。 从变量值的生存期(即存在的时间)角度来分,又可以分为静态存储方式和动态存储方式。,5,从变量的作用域来认识变量 局部变量和全局变量,可引用变量的范围,6,1、变量的作用域-局部变量和全局变量,在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本

2、函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。,7,1、变量的作用域-局部变量和全局变量,在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。,引例:局部变量的作用域举例交换两个变量的值,引例:全局变量的作用域举例分析下面程序运行结果,10,局部变量,局部变量定义: 定义在函数内或在 内的变量,称为局部变量。,有效范围:在所定义的函数、复合语句中。,变量的作用范围仅仅局限在从变量定义处开始、到变量定义所在的那个函数或复合语句结束。

3、 函数的形式参数为局部变量。,11,局部变量举例 float f1(int a) int b,c; int f2(int x,int y) int b,c,i,j; ,形参是局部变量 main函数的变量也是局部的; 不同函数中变量的名字可以相同; 复合语句内可以定义变量;,a,b,c有效,x,y,b,c,i,j有效,12,局部变量举例 int main() int m,n; int k .,形参是局部变量 main函数的变量也是局部的; 不同函数中变量的名字可以相同; 复合语句内可以定义变量;,m,n有效,k有效,13,例:,func(int a,char ch) int b = 1,c =

4、2; float f; .,a = 5,a = 3, int a,b = 3; a = b+c; printf(a = %dn,a); ,a = b+c; printf(a = %dn,a); ,Why?,14,全局变量,全局变量定义: 在函数之外定义的变量,称为全局变量。 全局变量又称为外部变量。,全局变量的作用范围: 从变量定义处开始到该源文件结束处。,输入2 ,5 ?,结论:全局变量在任何程序内可见,函数exch()改一下,结果如何?,输入2 ,5 ?,a = 3,b = 7?,如果函数中的局部变量和全局变量同名,在函数范围内,局部变量可见。,17,变量的作用域及存储类型,局部变量和全局

5、变量 动态存储变量和静态存储变量 局部变量的存储方式 全局变量的存储方式,18,从变量的存储角度认识变量 动态存储变量和静态存储变量,19,静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。 动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。,变量的存储方式和生存期,20,这个存储空间可以分为三部分: 1.程序区 2.静态存储区 3.动态存储区 在语言中每一个变量和函数有两个属性: -数据类型和数据的存储类别。,变量的存储方式和生存期,程序在内存中的分布区域,存放用户程序代码, 即程序中各个函数的代码。,程序区,静态存储区,动态存储区,存放程序的全局数据和静态数据

6、。 分配在静态存储区中的变量的生命期最长, 从程序开始执行到执行结束,这些变量始终 占用静态存储区中对应的存储空间,即程序 开始执行时分配存储单元,程序执行完毕后 释放。,存放动态数据。分配在动态存储区中的 变量只有在所定义的函数被调用时才分 配存储单元,函数结束时就释放。系统 对函数调用时的现场保护、返回地址等 也占用动态保 护区。,22,静态存储区,程序区,动态存储区,存放程序的全局数据 和静态数据,存放动态数据,程序开始执行时分配存储单元,程序执行完毕后释放,所定义的函数被调用时才分配存储单元,函数结束时就释放,存放用户程序代码,内存,23,变量的存储器类别,变量的存储器类别,寄存器,静

7、态存储区,内存,动态存储区,CPU,24,变量的存储方式 静态存储方式 动态存储方式,变量的存储四种存储类型: auto 自动变量 register 寄存器变量 static 静态变量 extern 外部变量(全局变量) 自动变量和寄存器变量属于动态存储方式 静态变量和外部变量属于静态存储方式,25,变量的作用域及存储类型,局部变量和全局变量 动态存储变量和静态存储变量 局部变量的存储方式 全局变量的存储方式,26,局部变量的存储类别,定义局部变量的存储类别时使用三个关键字:,说明:,局部变量的存储类别缺省是 auto,auto 自动变量,static 局部静态变量,register 寄存器变

8、量,27,局部变量存储类别的定义形式:,CPU,寄存器,内存,静态存储区,动态存储区,register int a;,auto float a; 或 float a;,static int a;,28, auto float a; 或 float a; 定义一个动态的局部变量; 意味着: 当a所在函数被调用时,系统为a分配空间,a 才真正存在; 在没有为a赋任何值之前,a中的值为随机值;如果存在赋初值语句,在函数每次被调用时,都将被执行一次。 a 随它所在函数的执行结束而消失。,29, static int a; 定义一个静态的局部变量 意味着: 编译时为a分配空间;在程序运行阶段,a一直存在

9、。不会随着函数的执行结束而消失。 如果不为a赋初值,系统会自动为它赋0。如果在函数中为它赋初值,则该赋值语句仅在编译时被执行一次。 每次函数中对它的改变都将被保留。,31,变量的作用域及存储类型,局部变量和全局变量 动态存储变量和静态存储变量 局部变量的存储方式 全局变量的存储方式,32,定义全局变量中关键字的使用,用 static 定义静态全局变量 若在源文件的开头有: static int a 意味着该变量就只能在本文件中使用。 若 static 缺省,则使用范围扩大到组成程序的所有C源文件。,用 extern 说明全局变量 若在源文件的开头有: extern int a 意味着该变量在其

10、它文件中定义,在本文件中被使用。,33,全局变量,外部变量是全局变量 静态外部变量(静态全局变量) 限定只能在本文件内使用的外部变量 用static声明 非静态外部变量(全局变量) 其作用域还可以推广到其它文件中使用,只需要在其它文件中对该外部变量进行说明即可。 不用static; 可以用extern声明外部变量,以扩展外部变量的作用域;,34,全局变量给程序设计带来诸多弊病:,(1) 降低程序的清晰度 (2) 降低函数的灵活性 (3) 降低存储空间的利用率,适当使用!,35,系统处理程序时:,(2) 动态局部变量分配在局部动态数据区,(3) void main函数是所有c程序的执行入口程序。

11、,(4) void main函数中的变量也是局部变量。,静态数据区,动态数据区,(1) 全局变量和静态局部变量分配在静态数据区;,36,存储类别小结,从作用域角度分,有局部变量和全局变量。它们采用的存储类别如下: 局部变量包括: 自动变量、 静态局部变量、寄存器变量。 形式参数可以定义为自动变量或寄存器变量 全局变量包括: 静态外部变量、外部变量,37,(2)从变量存在的时间来区分,有动态存储和静态存储两种类型。静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元。 动态存储 :自动变量、寄存器变量、形式参数 静态存储:静态局部变量、静态外部变量、外部变量,38,(3) 从变量值存放的位置来区分,可分为: 内存中静态存储区: 静态局部变量、静态外部变量、外部变量

温馨提示

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

评论

0/150

提交评论