1.自动变量
在函数中如果不加static,再函数调用结束则该变量自动释放,系统对其分配动态的储存空间,比如一个函数调用多次,其中的变量如果没有加static关键字那么每次调用变量的地址可能都不相同。如果再符合语句中定义,也会在符合语句结束后释放。复合语句(循环,+=)
2.静态局部变量static
1)如果在一个函数中加入static关键字,那么该变量为静态局部变量,在函数调用完后变量的值不施放, 内存空间仍然存在。 例如如下函数
#include<iostream>
using namespace std;
int fun()
{
static int a = 0;
int b = 0;
a++, b++;
return a + b;
}
int main()
{
for (int i = 0; i < 4; i++)
cout << fun() << endl;
// cout << a << endl; 语句报错,a的值不能被主函数访问,不在同一个作用域;
system("pause");
return 0;
}
打印结果为:
由此可以看出 a的值并没有被删除,而b在函数结束时初始化;
2)如果一个全局变量前加了static,在另一个文件中用extern将无法使用,只能在该文件中使用
3.extern 外部扩展变量的作用域
1).如果变量定义在了后面,而在之前需要使用则在变量前加extern
2).可以连接外部源程序,例如在一个源文件定义了A,在B中可定义A前加入extern这个关键字
注意不管在别的文件中定义 还是本文件的下方定义都只能出下一次 不然重定义
4.dregisrer寄存器变量,直接把这个变量放在寄存器中。提高运行效率不过目前编译器会自动识别,一般不需要我们自己写。
5.静态内存和动态内存的区别
1.静态内存是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始运行期间完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间。变量的分配与释放,都无须程序员自行考虑。如:基本类型,数组。
2.动态内存:用户无法确定空间大小,或者空间太大,栈上无法分配时,会采用动态内存分配。
3.二者区别:
a) 静态内存分配在编译时完成,不占用CPU资源; 动态内存分配在运行时,分配与释放都占用CPU资源。
b) 静态内存在栈(stack)上分配; 动态内存在堆(heap)上分配。
c) 动态内存分配需要指针和引用类型支持,静态不需要。
d) 静态内存分配是按计划分配,由编译器负责; 动态内存分配是按需分配,由程序员负责。
3.静态储存期和动态储存期
1.静态存储期:一般全局变量 已经有static修饰的变量
2.动态存储期:函数形式的参数,函数体中定义未加static的变量;函数调用的现场保护和返回地址等