一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
局部变量和全局变量
问题:在一个函数中定义的变量,在其他函数中能否被引用?在不同位置定义的变量,在什么范围内有效?
这就是变量的作用域问题。每一个变量都有一个作用域问题,即它们在什么范围内有效。
局部变量
定义变量可能有3种情况:
- 在函数的开头定义:在函数内定义的变量只在本函数范围内有效
- 在函数内的复合语句内定义:只能在本复合语句内才能引用它们
- 在函数的外部定义
全局变量
在函数内定义的变量是是局部变量,而在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
建议不在必要时不要使用全局变量,原因如下:
- 全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元
- 它使函数的通用性降低了,程序设计中,在划分模块时要求模块的“内聚性”强,与其他模块的“耦合性”弱
- 使用全局变量过多,会降低程序的清晰性
注意:
如果在同一个源文件中,全局变量与局部变量同名:在局部变量的作用范围内,局部变量有效,全局变量被“屏蔽”,即它不起作用
变量的存储方式和生存期
动态存储方式与静态存储方式
从上面可以了解到,从变量的作用域角度来观察,变量可以分为全局变量和局部变量。
还可以从变量值存在的时间(即生存期)来观察。变量的存储有两种不同的方式:静态存储方式和动态存储方式。
- 静态存储方式:是指在程序运行期间由系统分配固定的存储空间的方式
- 动态存储方式:是在程序运行期间根据需要进行动态的分配存储空间的方式
内存中供用户使用的存储空间的情况可以分为3部分:数据分别存放在静态存储区和动态存储区中。
- 程序区
- 静态存储区:全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
- 动态存储区:动态存储区中可以存放以下数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。
- 函数形式参数:在调用函数时给形参分配存储空间
- 函数中定义的没有用关键字static声明的变量
- 函数调用时的现场保护和返回地址等
每一个变量和函数都有两个数学:数据类型和数据的存储类别。
- 数据类型:整型、浮点型这种
- 存储类别:指的是数据在内存中存储的方式(如静态存储和动态存储)
C的存储类别包括4种:自动的(auto)、静态的(statis)、寄存器的(register)、外部的(extern)
- 为什么要用函数
- 怎样定义函数
- 调用函数
- 对被调用函数的声明和函数原型
- 函数的嵌套调用
- 函数的递归调用
- 数组作为函数参数
- 局部变量和全局变量
- 变量的存储方式和生存期
- 关于变量的声明和定义
- 内部函数和外部函数