目录
一、变量作用域问题
{ }内就是变量的作用域
局部变量: 作用域就是{}内
全局变量: 作用域是整个程序生命周期
- 优点:可以实现各个方法协同工作,有共同的接口
- 缺点:
- 全局变量在整个空间中都占用存储单元;
- 增加了函数之间的耦合性,不利于模块的设计开发,设计开发要求“高耦合,低内聚”
当全局变量和局部变量重名时,局部变量覆盖全局变量
二、变量的存储方式和生存期
存储方式: 静态存储和动态存储
内存分区:
- 程序区
- 静态存储区:存储全局变量、static变量
- 动态存储区:存储局部非static变量、函数形参、函数调用时现场保护和返回地址,用于PC寻址
三、存储类型
C语言中,每个变量和函数都具有两个数据:数据类型和存储类别
- 数据类型可以告诉编译器,需要多大的内存空间
- 存储类别告诉编译器,变量作用域和生存期
存储类别:
- auto, 非static局部变量都是static存储类别,是默认的类别,可以不用赋初值
- static, 变量值和存储单元使用后都不释放,存储在静态存储区,如果不赋初值,默认为0或’\0’。局部静态变量,虽然存储单元在,只能由本函数引用它
- register, 一般变量是存储在内存中,register可以将变量存储在寄存器中,提高访问速度
- 没有很大必要,编译系统会自动编译优化,将经常访问的变量自动加入寄存器中
- extern, 针对外部变量
- 将外部变量的作用域拓展到变量声明前
- 将当前文件的全局变量拓展到另一个文件中使用,声明此变量在其他文件中声明,可以直接使用
- 本质就是,我现在要使用这个变量,要么在本函数中后面定义了,要么在其他文件中定义了,否则报错
注意点:
- 如果使用static定义,那么其他文件的extern就无法访问
- 局部变量声明存储类型是指定存储区域和生存期问题
- 全局变量一定存储在静态存储区,声明存储类型只是对变量作用域的拓展而已