当前课程知识点:C语言程序设计 >  第22讲 编程训练 >  编程训练 >  变量的作用域与生存期

返回《C语言程序设计》慕课在线视频课程列表

变量的作用域与生存期在线视频

返回《C语言程序设计》慕课在线视频列表

变量的作用域与生存期课程教案、知识点、字幕

这一讲讲一下变量的作用域与生存期

这是程序设计最基本的知识

必须掌握 变量的作用域

指在源程序中定义变量的位置及其能被读写访问的范围

分为局部变量和全局变量

局部变量指的是在函数内部或复合语句内部定义的变量

如果再仔细分的话它还可以包含两种情况

第一种是在函数内部定义的变量

在本函数范围内有效

在复合语句内定义的变量只在本复合语句范围内有效

我们这个例子看的是在函数内部定义的变量

这个程序是求两个数当中比较大的一个

当然这个是用函数实现的

其中上面的这个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

这个程序很好的就是能够看出来局部变量

静态局部变量以及全局变量的作用域与生存期

C语言程序设计课程列表:

第0讲 导言

-简单介绍课程性质等

-关于编程训练

第1讲 C程序框架

-C程序框架

-作业

第2讲 C程序编译环境

-C语言的编译环境

-作业

第3讲 顺序程序的几个例子

-顺序程序的几个例子

-作业

第4讲 常见的编译错误

-常见的编译错误

-作业

-编译错误探讨

第5讲 输入输出精要

-输入输出精要

-作业

-输入输出格式探讨

第6讲 选择结构的典型例子

-选择结构的典型例子

-作业

第7讲 选择结构常见错误

-选择结构常见错误

-作业

第8讲 排除程序错误的常规方法

-排除程序错误的常规方法

-排除错误探讨

第9讲 循环结构基础

-循环结构基础

-作业

-循环类型

第10讲 循环结构程序例子

-循环结构程序例子

-作业

-程序结构

第11讲 函数基础

-函数基础

-作业

第12讲 函数举例

-函数举例(上)

-函数举例(下)

第13讲 变量的作用域与生存期

-变量的作用域与生存期

-变量的使用

第14讲 数组基础

-数组基础

-作业

第15讲 数组应用举例

-数组应用举例(上)

-数组应用举例(下)

第16讲 数组参数传递

-数组参数传递(上)

-数组参数传递(下)

-作业

第17讲 指针变量

-指针变量(上)

-指针变量(下)

-作业

第18讲 字符串

-字符串(上)

-字符串(下)

-作业

第19讲 程序调试

-程序调试

-程序调试的重要性

-程序调试讨论

第20讲 结构体及其应用

-结构体及其应用(上)

-结构体及其应用(下)

第21讲 文件

- 文件(上)

-文件(下)

第22讲 编程训练

- 编程训练

变量的作用域与生存期笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。