存储类型

【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。

 

 

posted @ 2012-12-30 15:57  kaizenly  阅读(856)  评论(0编辑  收藏  举报
打赏