当前课程知识点:高级语言程序设计 >  函数 >  7.6 变量的作用域和存储类型 >  变量的作用域和存储类型

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

变量的作用域和存储类型在线视频

变量的作用域和存储类型

下一节:字符串的存储及输入输出

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

变量的作用域和存储类型课程教案、知识点、字幕

本讲介绍变量的作用域和存储类型

先来看作用域

现在我们的程序

一般包含两个或多个函数

分别在各个函数内部定义变量

在一个函数体里定义的变量

在其它函数体中能否被引用

这就是变量的作用域问题

在程序中被花括号括起来的区域

叫做语句块 函数体是语句块

选择结构和循环结构里的复合语句也是语句块

变量的作用域规则是

每个变量仅在定义它的语句块内有效

并且拥有自己的存储空间

按变量在函数中定义的位置不同

可以分为全局变量和局部变量

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

就是局部变量 比如说

在一个函数内部定义的变量

只是在本函数范围内有效

在此函数之外是不能使用这些变量的

局部变量 在需要时建立

不需要时清除

经常的建立和清除看似麻烦

但它只是在建立它的函数或复合语句中有效

可以提高程序模块的清晰度

函数作用的独立性和专一性

为结构化程序设计提供了一个良好的手段

在函数之外定义的变量称之为外部变量

外部变量也称为全局变量

全局变量可以被本文件中其他函数共用

它的有效范围是从变量定义的位置开始

至本文件的结束

分析下面的程序段x y z是f1函数的局部变量

m n I j是f2函数的局部变量

m n是main函数的局部变量

两个函数的m n

类似于不同班的同名学生

P q c1 c2都是全局变量

但它们的作用范围不同

在main函数和函数f2中

可以使用全局变量p q c1 c2

但在函数f1中只能使用全局变量p q

而不能使用c1和c2

现在来看 有一个一维数组

内放10个学生成绩

写一个函数

当主函数调用此函数后

能求出平均值 最高分和最低分

一个函数只能返回一个值

现在要求一个函数计算出三个值

当然我们可以通过设置指针变量作函数的形参

返回多个运算结果

在这里我们采用全局变量的方法

解决这个问题

定义Max Min是全局变量

这是主函数

这里定义里一个float类型的数组score

输入10个实数

调用average函数

将返回值赋给变量ave

只有一个返回值

全局变量Max和Min

从程序运行开始起就占据内存

因此在程序运行期间的任何时候

在main函数内部和average子函数内部

都可直接访问全局变量Max和Min

我们在average子函数中计算Max和Min的值

在main函数中

输出Max和Min的值

全局变量使函数间的数据交换更容易 更高效

但建议尽量少用

因为谁都可改写它

所以很难确定是谁改写了它

而且这种错误往往防不胜防 很难控制

从程序设计方法的角度来讲

最根本的原因在于

各模块之间除了用参数传递信息外

还增加了许多意想不到的渠道

造成模块之间的联系太多

降低了模块的独立性

给程序设计 调试和维护造成困难

现在来看变量的存储属性

编译器为变量分配内存的方式

决定了变量的生存期

变量的存储类别关键字有4个

auto static extern register

内存提供用户使用的空间分为四个部分

代码区 常量区 静态存储区和动态存储区

从变量值存在的时间观察

有两种不同的方式

静态存储方式和动态存储方式

变量的存储类别

是指编译器为变量分配内存的方式

它决定变量的生存期

即决定变量何时“生” 何时“灭”

静态存储区中的变量

与程序 共存亡

动态存储区中的变量

与程序块 共存亡

寄存器中的变量

和同动态存储区是一致的

在C语言中每一个变量和函数都有两个属性

数据类型和存储类别

在定义变量时

存储类别声明符要放在数据类型的前面

先来看自动变量

由于自动变量极为常用

所以C语言把它设计成缺省的存储类别

以前我们定义的变量的存储类别都是auto

即auto可以省略不写

自动变量的“自动”体现在进入语句块时

自动申请内存

退出语句时自动释放内存

它仅能被语句块内的语句调用

在退出语句块以后不能再访问

因此 自动变量也称为动态局部变量

用关键字static进行声明的变量是静态变量

来看这个代码

我们可以用静态变量计算n的阶乘

大家来看 fact函数体里没有循环语句

只定义了里一个静态局部变量p

每次p乘以形参n

主函数里有循环语句

n次调用fact函数

依次输出1的阶层

2的阶层 3的阶层等

不是输出1 2 3等

这是因为p是静态局部变量

只被分配一次存储空间

并且仅被初始化一次

其占据的内存在退出函数后不会被释放

因此p的值可保持到下一次进入函数时

正是利用了这一记忆功能

才实现了累乘计算阶乘的值

大家可以将关键字static改为 auto

再次运行程序

会发现p的记忆功能消失了

因为自动变量是在动态存储区分配内存的

其占据的内存在退出函数后立即被释放了

在每次调用函数时都需要重新初始化

因此 自动变量的值

不能保持到下一次进入函数时

寄存器变量

允许将局部变量的值放在CPU中的寄存器中

现在的计算机能够识别使用频繁的变量

从而自动地将这些变量放在寄存器中

而不需要程序设计者指定

extern关键字是对已经定义的变量

进行外部说明

注意不是定义

编译器并不对其分配内存

看这个例子

全局变量A B C是在主函数之后定义的

正常情况主函数是不能读写全局变量A B C的

但是如果在主函数之前加上extern声明语句

那么主函数中可以读写全局变量A B C了

对变量而言

一种是需要建立存储空间的称为变量的定义

另一种是不需要建立存储空间的

如extern int a

称为变量的引用性声明

若一个程序中包含多个文件

一个文件I中的全局变量

对另一个文件II来讲它是外部变量

如果想在文件II中访问文件I的全局变量

必须在文件II中

对所要引用的变量进行外部声明

最后 小结一下

从作用域角度分

有局部变量和全局变量

它们采用的存储类别如下

从变量存储的时间分

有动态存储和静态存储两种类型

静态存储是程序整个运行时间都存在

而动态存储则是在调用函数时

临时分配内存单元

本讲内容就是这些

谢谢大家

高级语言程序设计课程列表:

程序设计和C语言

-1.1 计算机程序和计算机语言

--计算机程序和计算机语言

--致敬先辈:伟大的C语言之父——丹尼斯·里奇 程序员

-1.2 C程序的构成

--C程序的构成

--当前主流程序设计语言各自都有什么优势?

-1.3 C语言编辑、编译、运行(VC++2010学习版)

--C语言编辑、编译、运行(VC++2010学习版)

-练习题

顺序结构程序设计

-2.1 变量的定义和使用

--变量的定义和使用

-2.2 数据类型

--数据类型简介

--整型数据

--实型数据

-2.3 格式输出和格式输入

--格式输出printf函数

--格式输入scanf函数

--单个字符的输入输出

-2.4 运算符和表达式

--运算符和表达式

-2.5 结构化程序设计入门

--结构化程序设计入门

-练习题

选择结构程序设计

-3.1 为什么要用选择结构解决问题

--为什么要用选择结构解决问题

-3.2 如何正确表示选择结构中的条件

--如何正确表示选择结构中的条件

-3.3 用if语句及if语句嵌套实现选择结构

--用if语句及if语句嵌套实现选择结构

-3.4 用switch语句实现选择结构

--用switch语句实现选择结构

-练习

循环结构程序设计

-4.1 循环的引入

-- 为什么要用循环结构解决问题

-4.1 循环的引入--作业

-4.2 用while语句实现循环

--用while语句实现循环

-4.3 用do-while语句实现循环

-- 用do-while语句实现循环

-4.4 用for语句实现循环

-- 用for语句实现循环

-4.4 用for语句实现循环--作业

-4.5 何时需要用循环的嵌套

--何时需要用循环的嵌套

-4.6 如何提前终止循环和提前结束本次循环

--如何提前终止循环和提前结束本次循环

-习题--作业

数组

-5.1 数组类型的引入

--数组类型的引入

-5.2 一维数组的定义和初始化

--一维数组的定义和初始化

-5.3 一维数组的使用

--一维数组的使用

-5.4 二维数组的定义和初始化

--二维数组的定义和初始化

-5.5 二维数组的使用

--二维数组的使用

-习题--作业

指针

-6.1 什么是指针

--什么是指针

-6.2 指针类型及相关概念

--指针类型及相关概念

-6.3 指针变量的定义、赋值与使用

--指针变量的定义、赋值与使用

-6.4 指针的运算

--指针的运算

-6.5 指针与一维数组

--指针与一维数组

-6.6 指针的指针

--指针的指针

-6.7 指针与二维数组

--指针与二维数组

-习题--作业

函数

-7.1 为什么要自定义函数

--为什么要自定义函数

-7.2 函数的定义

--函数的定义

-7.3 函数的调用

--函数的调用

-7.4 函数参数的传递

--函数参数的传递

-7.5 函数的嵌套调用和递归调用

--函数的嵌套调用和递归调用

-7.6 变量的作用域和存储类型

--变量的作用域和存储类型

-习题--作业

字符串

-8.1 字符串的存储及输入输出

--字符串的存储及输入输出

-8.2 系统字符串处理函数

--系统字符串处理函数

-8.3 自定义字符串处理函数

--自定义字符串处理函数

-习题--作业

结构体和共用体

-9.1 结构体类型的定义

--结构体类型的定义

-9.2 结构体变量及指针变量的定义及使用

--结构体类型变量和指针变量的定义和使用

-9.3 结构体变量和指针变量作函数的参数

--用结构体变量和指向结构体的指针作函数参数

-9.4 结构体数组的定义和使用

--结构体数组的定义和使用

-9.5 共用体类型和枚举类型

--共用体和枚举类型

-习题--作业

动态内存分配

-动态内存分配--习题

文件

-习题--作业

变量的作用域和存储类型笔记与讨论

也许你还感兴趣的课程:

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