当前课程知识点:C语言程序设计 > 第22讲 编程训练 > 编程训练 > 变量的作用域与生存期
这一讲讲一下变量的作用域与生存期
这是程序设计最基本的知识
必须掌握 变量的作用域
指在源程序中定义变量的位置及其能被读写访问的范围
分为局部变量和全局变量
局部变量指的是在函数内部或复合语句内部定义的变量
如果再仔细分的话它还可以包含两种情况
第一种是在函数内部定义的变量
在本函数范围内有效
在复合语句内定义的变量只在本复合语句范围内有效
我们这个例子看的是在函数内部定义的变量
这个程序是求两个数当中比较大的一个
当然这个是用函数实现的
其中上面的这个max求出来a和b两个数中较大的一个返回
然后在主程序当中调用它
那我们看就说这个程序分为这样一个函数和这样一个函数
那么在max函数中有两个形参a和b
以及内部定义了一个变量m
变量a b m仅仅在这个函数内有效
出了这个函数
它们就消失不见了
在main函数当中
也定义了函数内部的三个变量m a b
它的作用范围也是在这个函数内
就说这儿的变量m a b
虽然与上面max当中的a b m三个变量同名
但相互完全没有关系
这大概就好比有两个班的同学
两个班有同名的同学
就比如说是1班有1个同学和2班有1个同学同名
虽然名字相同
但其实完全是2个不同的人
这是一个复合语句内变量的定义及其范围
那我们看这个程序是求1加2加到100的这样的一个程序
那我们在这个for语句当中定义了1个变量i
那么这个i仅仅在for循环内有效
出了for循环
就是到这个地方以后i就无效了
这个无效实际就是消失了
不能再用了
换句话说这个无效就是在出了这个范围以后在后面
你就不能再使用i这个变量了
因为它已经不存在了
全局变量是在函数外定义的变量
它有效范围是从定义变量的位置开始到程序结束
我们看这个a和b是在所有的函数的上边定义的两个变量
那么它的作用范围就是
在它定义位置的后面的所有的函数内它都是有效的
那么全局变量它的用处在哪里呢
就是当多个函数必须共享同一个或多个变量时
使用全局变量能使函数之间的数据交换更容易
更高效
这是一个使用全局变量的例子
这个例子也是求两个数当中比较大的一个数
只不过这使用了全局变量
我们看这里定义了1个全局变量m
然后在max函数当中它把a和b当中一个比较大的一个值赋值给m
然后在main函数当中调用这个max a b
调用以后呢
因为m是全局变量
在这也可以用
在这也可以用
调用了以后就会得到m的值
然后输出
这个例子大家和我刚讲的那个使用返回值的例子对比一下
看一下这个差别
那么使用全局变量其实不是一个好的办法
多数情况下通过函数返回值进行数据交流比共享全局变量更好
为什么 首先是全局变量谁都可以修改它
就是你在这个函数当中可以修改
在这个函数当中也可以修改
这个不能实现信息隐藏
所谓的信息隐藏
就是把尽量不需要对外的信息我就在这个函数的内部不外露
这样是有很多好处的
那你会在以后其他的课程当中会更深的理解这个东西
它是计算机科学当中很重要的一个特点
另外使用全局变量它的函数不是独立的
所以很难在其他程序中复用
怎么理解这句话呢
可以这样理解
现在这个函数max这个函数
那你要脱离开这个程序
就单独把它拿出来
放到其他程序当中
然后让别的程序别的函数去调用的时候
那因为这个地方牵扯到一个m
那你把它拿走了以后
那这个m怎么办呢
所以这个函数就和这个m存在着这样的这种联系
所以它很难复用
当然全局变量并不是一无是处
它在有些情况下使用让程序比较简洁
这是一个好处
但是切记使用时一定要小心
变量的生存期指变量存在的时间
由存储方式决定
变量的存储方式有两种
静态存储和动态存储
其中普通局部变量就是采取的是动态存储方式
变量与程序块 共存亡
也就是当进入程序块
就是进入函数或者语句块的时候系统自动申请内存
退出程序块的时候自动释放内存
那么这一点呢
其实我们前面多数程序都是这么实现的
只不过你可能没有意识到这点
那么对于静态存储来说
是静态的局部变量 就是局部变量前面加一个static
这种叫静态局部变量
与全局变量都采取的是静态存储
这两种类型的变量是与程序共存亡的
也就是程序启动的时候系统来申请这个变量的内存
程序退出的时候自动释放
注意这个生存期
这是程序范围的生存期
而这个普通变量呢它是程序块范围的生存期
我们把变量的生存期与作用域归纳一下
普通局部变量的生存期与作用域基本一致
那么它的生存期和作用域都在程序块
就是函数内或复合语句块内
全局变量的生存期与作用域也是基本一致的
那么它的生存期和作用域是在整个程序内
有差别的是静态的局部变量
它的生存期与作用域不一致
静态局部变量的生存期是整个程序
但是作用域在程序块内
好我们看下这个例子
这有2个函数main 和这个fun
然后再main函数当中调用这个fun函数
然后呢这有一个全局变量d
这有一个静态的局部变量c
我们来看看这个程序
这是一个for循环 循环3次
然后调用这个fun
把a这个参数给它传过去
然后完了以后再输出一下这个
我们通过程序运行来看一下
这是程序运行的结果
我们对照这个程序运行的结果来分析一下这个程序
我们先来看一下
这个地方当i等于0的时候
调用这个fun(a)
就把这个a等于2的值传过去
传过去了以后这个地方有个b=b+1
b这儿的值是0
加1以后变为1
这个c这个地方的值是3
加1以后变为4
那么d这在最初定义的一个全局变量
它没有赋初值
但是全局变量呢如果你没赋初值
它默认的初值就是0
所以这个地方d+1以后d等于1
然后这个返回a+b+c
那么我们看a的值刚才传过来是2
b是1 然后c是4
那么这加起来就是7
也就是说第一遍i等于0的时候这个调用这个输出的是7
然后i等于1时候
这再调用一遍
还是把2个值传过来
传过来以后
因为b是这个局部变量
所以当再次回来的时候
它这个b的值仍然是0
但是再次回来的时候
这个c的值
因为c是静态局部变量
所以它的值再进来的时候刚才那个就是加完以后它的值变成4了
所以再次进来之后呢这个c的值是4
就这一句它不再管了
那么这样b等于b+1
b的值变为1
c的值呢
4+1成了5
这个d再加1
前面是1
这个地方加完后变成了2
然后a+b+c这样得到值是8
然后这个i等于2的时候再调用一遍
跟刚才相比就是这个c值又变了
c现在是5
而d成了3
然后这个返回a+b+c
然后得到的结果是9
完了以后在这个地方输出a=
因为这个a它是在这的一个局部变量
它的值没有改变过
所以它的值是2
而这个d是全局变量
它在这个地方调用的时候加了3次
所以d的值是3
这个程序很好的就是能够看出来局部变量
静态局部变量以及全局变量的作用域与生存期
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-作业
-循环类型
-作业
-程序结构
-函数基础
-作业
-数组基础
-作业
-作业
-作业
-作业
-程序调试
- 文件(上)
- 编程训练