蓝鸥iOS培训讲师推荐:在技术的领域里没有懒这么一说,没有学不会这么一说,只要你自己努力就没什么太大问题。
变量除了数据类型以外,还有3种属性:
1、存储类别 C++允许使用auto,static,register和extern 4种存储类别
2、作用域 指程序中可以引用该变量的区域
3、存储期 指变量在内存的存储期限
上面这介绍的这些3种属性是有关系的,程序设计者只能声明变量的存储类别,通过存储类别可以确定变量的作用域和存储期
但是大家一定要注意存储类别的用法auto, static和register 3种存储类别只能用于变量的定义语句中,如:
auto char c; //字符型自动变量,在函数内定义
static int a;//静态局部整型变量或静态外部整型变量
register int d; //整型寄存器变量,在函数内定义
extern int b;//声明一个已定义的外部整型变量
重点说明: extern只能用来声明已定义的外部变量,而不能用于变量定义,只要看到extern,就能够判断变量声明,而不是定义变量语句。
下面是不同角度的分析:
1、从作用域角度分,有局部变量和全局变量,它们采用的存储类别如下:
1)局部变量
自动变量,即动态局部变量(离开函数,值就消失)
静态局部变量(离开函数,值仍保留)
寄存器变量(离开函数,值就消失)
形式参数(可以定义为自动变量或寄存器变量)
2)全局变量
静态外部变量(只限本文件引用)
外部变量(即非静态的外部变量,允许其他文件引用)
2、从变量存储期(存在的时间)来区分,有动态存储和静态存储两种类型,静态存储是程序整个运行时间都存在,而动态存储则是在调用函数时临时分配单元。
1)动态存储
自动变量(本函数内有效)
寄存器变量(本函数内有效)
形式参数
2)静态存储
静态局部变量(函数内有效)
静态外部变量(本文件内有效)
外部变量(其他文件可引用)
3、从变量值存放的位置。可分为
1)内存中静态存储区
静态局部变量
静态外部变量(函数外部静态变量)
外部变量(可为其他文件引用)
2)内存中动态存储区: 自动变量和形式参数
3)CPU 中的寄存器: 寄存器变量
4、关于作用域和存储期的概念,从前面叙述可以知道,对一个变量的性质可以从两个方面分析,一是从变量的作用域,一是从变量值存在时间的长短,即存储期,前者是从空间的角度,后者是从时间的角度,二者有关系,但是有不同的意义,如下图:
作用域的示意图
存储期的示意图
如果一个变量在某个文件或函数范围内是有效的,那么这个文件或函数称为该变量的作用域,在该作用域内能够引用该变量的,所以又称变量在此作用域内“可见”,这种性质又称为变量的可见性,在“作用域的示意图”中变量a、b在函数f1中能看到。
如果一个变量值在某一时刻是存在的,那么就认为这一时刻属于该变量的存储期,或称该变量在此时刻“存在”
可以看到自动变量和寄存器变量在函数内的可见性和存在性是一致的,在函数外的可见性和存在性也是一致的,静态局部变量在函数外的可见性和存在性不一致,静态外部变量和外部变量的可见性和存在性是一致的。
5、static声明使变量采用静态存储方式,不过它对全局变量和局部变量有不同的作用,对局部变量而言,staic使动态存储方式改为静态存储方式,而对于全局变量而言,它又使变量局部化(局部于本文件),不过仍是静态存储方式,从作用域角度而言,只要是有static声明的,那么它的作用域都是局限的,可能只局限于本函数内(静态局部变量),也有可能局限于本文件内(静态外部变量)
本节课和大家说的有点多,不过理解起来应该不是很复杂,大家可以试着先理解一下,整理出来一个思路,如果有不懂的地方可随时沟通!