存储类型
【1】存储类型分为哪几种?
C/C++的存储类型从宏观可以分为两种:
一种是临时性的,即就是暂时的保存在栈中或者寄存器中的。 代表存储标识:auto, register
一种是永久性的,即就是在整个程序的运行期都存在的。代表存储标识:extern, static
一个变量或者函数只能具有一个存储类型,意味着也只能有一种生存期限。
【2】各种存储类型各有什么特点?
(1)auto
auto变量是用栈方式占用内存空间的。也就意味着所有的局部变量都是自动的。一般不显式标注存储类型的变量默认方式均为auto。
它们在函数被调用时创建,函数退出时自动销毁。作用域都为块作用域。
(2)register
register修饰符暗示编译程序相应的变量将将被频繁使用。如果可能的话,应将其保存在CPU的寄存器中,旨在加快其存取速度。
但是,凡事都有一个度的问题,使用 register修饰符也有几点限制:
<1>register变量必须是能被CPU寄存器所接受的类型,这通常意味着register变量必须是一个单个的值,并且其长度应小於或等於整型的长度。
当然,有些机器的寄存器也能存放浮点数。
<2>因为register变量可能不存放在内存中,所以不能用取址符运算符“ & ”来获取取址符运算符“ &” register变量的地址。
如果你试图这样做,编译时就会报告这是一个错误。
<3>只有局部变量和形参可以作为register变量,全局变量不行。
<4>80x86系列CPU最多可使用的register变量数目有限。
<5>静态变量不能定义为register。
(3)extern
默认情况下,"全局变量和全局函数"的存储类型是extern。能够被定义在它们之后的同一个编译单元内的函数所调用。
如果变量或者函数被显式加上extern声明,那么说明已经在其他编译单元实现了该变量或者函数的定义,在此单元中尽管调用它们即可。
(4)static
static的作用可以说有三方面,下面分别讨论:
<1>限制全局变量和函数的作用域。
我们知道,全局的变量或者函数一般都是公共的,那么公共的就比较讨厌了!因为谁想用谁就可以不择手段的使用了,这就成什么了?你说呢?
所以,为了限制这种不良的使用权限,我们使用static进行限制和约束。加修饰符static的全局函数或者变量,仅仅只可以被这个文件的其他函数使用。
加修饰符的局部变量,被保存在静态区域,而且只是第一次创建变量时进行一次赋值,以后的运算都是建立在此基础之上的。
1 #include<iostream>
2 using namespace std;
3
4 int fun(int a)
5 {
6 static int x=a;
7 x += 10;
8 cout<<x<<" ";
9 return x;
10 }
11 void main()
12 {
13 for(int i = 10; i > 0; --i)
14 {
15 fun(i);
16 }
17 }
18 //运行结果如下:
19 //20 30 40 50 60 70 80 90 100 110
20 //说明:在第一次给静态成员变量赋值以后,其值再不会改变!!!!
<2>保持变量内容的持久性
这点怎么理解呢?就上面的这个例子。完全可以说明这一点了,如果还没有看明白,反复继续........不用心研究,就不会学到知识。
<3>初始化默认值为零。
不论是全局的还是局部的变量,它如果在定义时没有被初始化。那么系统默认赋予的值均为0。