读书人

C 语言四大储存类型。

发布时间: 2013-02-24 17:58:56 作者: rapoo

C 语言四大存储类型。。。

 1。 extern, 从其英文意思外部的就能看出,这个表示引用一个外部变量。。

C语言程序编译时是以每个.c 文件为单位的,最后再把它们链接在一起,所以每个文件中的全局变量对于其他文件是可见的,所以可以在一个文件中引用其他文件中的变量和函数。

extern 关键字就是用来表示引用别的单元的变量。。。

比如。。file1.c 中

int main()

{

extern int c ; //引用外部变量。。。

exten int sum(int a, int b);

scanf("%d",&c);

printf("%d ",c);
}

在 file2.c中

int c ;

====================================================================================

所以 file1.c可以用其他变量。。

如果 file2.c 中并没有定义变量c ,那么此用法将是错误的。。

同理,函数也可以用此方式。。

如果外部文件中的全局变量定义为 static ,则也不能extern操作。

2 。。 static

上文提到了static

static 有两重功能, 第一是修饰全局变量,和函数,这样的效果是其他文件不能引用static修饰了的变量和函数。

比如:

file1.c

int main()

{

extern int a ; // 引用错误

extern int sum(int ,int ) // 错误。。

.....

}

file2.c

static int a;

static int sum(int a, int b);

因此。。

static 的第一个功能是当其修饰全部变量和函数时,能限定变量和函数的作用域在此文件,而不被其他文件所见。

第二。 当static 修饰局部变量时。。

众所周知,函数中局部变量是自动分配在栈中的,当函数结束时会自动销毁栈中的数据。。

如果用static 修饰时:

int fun( )

{

static int count = 0;

return count ++;

}

int main()

{

int i;

for (i = 0; i<10 ; i++)

fun();

}

由于 fun()中的 count 为static修饰。 所以它被分配在内存中的静态存储区, 而不是栈中, 因此它的生命周期伴随着整个程序而不是函数,它不会随着函数的结束而销毁, 但是在函数外部也不能引用它,只能在每次进入函数后操作。

每次for 循环时,count 会 自加1 。。。

静态局部变量只初始化一次,如果没有初始化,那么会自动初始化为0 。。

因为内存中的静态存储区会被自动初始化为 0;

因此可以 static char str[100] ;

这时str 被初始化为0,而不用去手动初始化,这也是一种方法。。

static 和 auto 变量是不同的。

3 。 auto 变量

C语言中默认的数据存储类型都是auto 变量,即自由变量,它在定义的位置被自动任意分配到内存中 ,所以当到它的作用域之外时,会自动被OS 销毁。。

注意: 全部变量不是auto 型,它是在静态存储区的。。

一个变量不能同时用 static 和 auto 修饰,比如 static auto int a ;

这样定义是相互矛盾的。。

所以 对于 auto 变量, 必须在使用时初始化, 或者赋给值,否则它的值是无效值。

4 register

rigister 为寄存器变量, 由于某些数据CPU 要经常读取,为了读取快捷,编译器会把这些数据放寄存器中,而不放在内存中,这样CPU 便可以直接从其寄存器中读取数据。。

但是 寄存器的数量毕竟有限,并不是所有定义的register变量都存储在寄存器中 。。

register 变量的数据类型必须符合cpu寄存器支持的数据类型 ,一般为整型和浮点型,现在的CPU寄存器也基本支持浮点型。

register 变量的数据长度必须小于等于寄存器所支持的最大数据长度。

register 变量有可能没有存储在内存中, 所以不要用& 取其地址。

现在的CPU 速度已足够运算了,所以register变量已经过时了 ,尽量不用。

读书人网 >编程

热点推荐