函数07 – 零基础入门学习C语言38
第七章:函数07
让编程改变世界
Change the world by program
局部变量和全局变量
局部变量
在一个函数内部定义的变量是内部变量,它只在本函数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。
不懂?看以下示例:
float f1(int a) // 函数f1
{
int b, c; // a, b, c 有效
}
char f2(int x, int y) // 函数f2
{
int i, j; // x, y, i, j 有效
}
void main() // 主函数
{
int m, n; // m, n 有效
}
有几点要说明
(1) 主函数中定义的变量(m,n)也只在主函数中有效,而不因为在主函数中定义而在整个文件或程序中有效。
主函数也不能使用其他函数中定义的变量。
(2) 不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
例如, 上面在f1函数中定义了变量b和c,倘若在f2函数中也定义变量b和c,它们在内存中占不同的单元,互不混淆。
(3) 形式参数也是局部变量。例如上面f1函数中的形参a,也只在f1函数中有效。
其他函数可以调用f1函数,但不能引用f1函数的形参a。
(4) 在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或“程序块”。
请再看下另一个示例!
void main()
{
int a, b;
{
int c;
c = a + b; // c 在此范围内有效,a,b 在此范围内也有效
}
}
全局变量
在函数内定义的变量是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。
全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
全局变量
实战演练: 分析源码!
题目一:输入正方体的长宽高l,w,h。求体积及三个面xy,xz,y*z的面积。
源码分析1:test1.c
题目二:有一个一维数组,内放10个学生成绩,写一个函数,求出平均分、最高分和最低分。
源码分析2:test2.c
建议不在必要时不要使用全局变量,原因如下:
① 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
② 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。
在各个函数执行时都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量。
③它使函数的通用性降低了,因为函数在执行时要依赖于其所在的外部变量。
如果将一个函数移到另一个文件中,还要将有关的外部变量及其值一起移过去。
但若该外部变量与其他文件的变量同名时,就会出现问题,降低了程序的可靠性和通用性。
一般要求把C程序中的函数做成一个封闭体,除了可以通过“实参——形参”的渠道与外界发生联系外,没有其他渠道。
变量的存储类别
动态存储方式与静态存储方式
前面已介绍了从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量。
那么从变量值存在的时间(即生存期)角度来分,又可以分为静态存储方式和动态存储方式。
所谓静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式。
而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
用户存储空间可以分为三部分:
- 程序区
- 静态存储区
- 动态存储区
在C语言中每一个变量和函数有两个属性:数据类型和数据的存储类别。
对数据型(如整型、字符型等)。存储类别指的是数据在内存中存储的方式。
存储方式分为两大类:静态存储类和动态存储类。
具体包含四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern)。
根据变量的存储类别,可以知道变量的作用域和生存期。
auto变量
函数中的局部变量,如不专门声明为static存储类别,都是动态地分配存储空间的(栈),数据存储在动态存储区中。
函数中的形参和在函数中定义的变量(包括在复合语句中定义的变量),都属此类,在调用该函数时系统会给它们分配存储空间,在函数调用结束时就自动释放这些存储空间。
因此这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。
int f( int a )
{
auto int b, c = 3;
}
关键字auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。
视频下载
技术, IT技术, 视频教程, C语言
风险提示及免责条款
市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!