变量的存储类别
存储方法分为静态存储和动态存储两大类。具体包含4种:自动的、静态的、寄存器的、外部的。
一、自动变量auto
动态存储区,动态存储方式【局部变量+函数形参缺省时即时auto】
二、用static声明静态局部变量
1.函数中的局部变量的值在函数调用结束后不消失而保留原值,即占用的存储单元不释放。(常考:求该代码的运行结果)
2.存在静态存储区。
3.静态局部变量赋初值是在编译时进行的,即只赋初值一次,以后每次调用函数时不再重新赋初值只是保留上次调用结束时的值;定义静态局部变量不赋初值的话,编译时自动赋0(数值类变量)或空字符(字符型变量)【自动变量不赋初值的话,其是一个不固定的随机值。】
4.虽然其在函数调用后仍然存在,但其它函数不能引用它,即对其他函数不可见。
三、用register声明寄存器变量
一般,变量存在内存中。当程序需要用到哪个变量的值时,控制器发出指令将内存中该变量的值送到CPU中的运算器。经过运算器进行运算,如果需要存数,再从运算器将数据送到内存存放。
为提高执行效率,C++允许将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,对寄存器的存取速度远大于对内存的存取速度,因此这样做可以提高执行效率。
当今的优化编译系统能识别使用频繁的变量,从而自动地将这些变量放在寄存器中,因此实际上用register声明是不必要的。
四、用extern声明外部变量
存在静态存储区。
1. 在一个文件内声明全局变量
即引用/使用在定义之前,故用extern关键字作提前引用声明,以扩展其作用域。
2. 在多文件的程序中声明外部变量
若一个程序包含两个文件,两个文件中都要用到同一个外部变量num,不能分别在两个文件中分别定义一个外部变量,否则在进行程序的连接时出现“重复定义”的错误。
file1.cpp
extern int a.b;
int main(){
……
}
flie2.cpp
int a = 3, b = 4;
正确的做法:在任一个文件中定义外部变量num,在另一个文件中用extern对num作外部变量声明:extern int num;
编译系统现在本文件中找有无外部变量num,若有,则将其作用域扩展到本行开始(如1所述);若无,则在程序连接时从其他文件中找有无外部变量num,若有,则把在另一个文件中定义的外部变量num的作用域扩展到本文件,使本文件可以合法引用该外部变量num。
注:执行一个文件中的函数时,可能会改变了该全局变量的值,从而影响到另一个文件中的函数执行结果。
五、用static声明静态外部变量
让某些外部变量只限于被本文件引用,不能【或者说防止~】被其他文件引用。
如:
file1.cpp
static int a = 3;
int main(){
……
}
file2.cpp
extern int a;
int func(){
a++;
}
file1中这种加上static声明的只能用于本文件的变量称为静态外部变量。
虽然file2用了extern int a;,但是仍无法使用file1中的a。
在程序设计中,常有若干人分别完成各个模块,各人就可以独立在各自文件中使用而互不相干。更可以对本文件中所有全局变量都加上static,以免被其他文件误用。
注意:
1、全局变量包括:静态外部变量、外部变量(即非静态的)
2、静态存储有:全局变量、静态局部变量!
3、extern只能用来声明已定义的外部变量,不能用于变量的定义!
内部函数和外部函数
内部函数:只能被本文件中其他函数所调用,格式如:static int fun(int a, int b)
外部函数:可供其它文件调用。定义函数时省略,默认为外部函数;调用时,要用extern声明所用函数是外部的。