总结C中关于存储的几个关键字,

*基本概念

---作用域,

一个标识符能产生作用的区域,如变量的作用域可以是代码块作用域,函数原型作用域,文件作用域.

---链接

说明一个标识符的可以被使用的范围.分为外部链接(external linkage),内部链接(internal linkage),空链接(no linkage).

如,代码块作用域和函数原型作用域具有no linkage,文件作用域具有external或internal linkage.

---存储时期,

定义了变量的生命周期.分类:

静态存储时期(static storage duration),在程序运行时期,一直存在的变量.如文件作用域的变量就是静态存储时期.

自动存储时期(automatic storage duration),如函数结束时,他内部的变量占用的内存被释放给其他变量使用

*存储类

---根据作用域,链接和存储其定义了5种存储类,如下图

storage 

*自动变量

---可以使用关键字auto显示声明,一般代码块和函数头定义的变量就自动变量

---不显示声明自动变量,则不会自动初始化

---内部变量覆盖外部变量的问题,如下

test_auto.c

例子说明2点,一是c99中for循环部分被看做代码块,二是作用域内同名变量时,代码块内变量优先级更加高.

*寄存器变量

---关键在register

---普通变量分配在内存中,寄存器变量可能被分配到CPU的寄存器或者高速的内存,这类变量的操作速度就更加快了.

---注意,

1)无法对寄存器变量使用&操作获取地址

2)只能用于部分类型,比如说寄存器可能无法容纳double类型

*代码块作用域的静态变量

---变量的可见范围是代码块内,但是他的值会一直保留至程序结束

---示例

test_static.c

*外部链接的静态变量

---定义方式:

在所有函数定义外定义的外部变量;

或者在函数内,显示声明关键字extern(表示引用关系);

---注意

1)默认初始化值为0(静态变量的特性,声明时即被创建),只能使用常量表达式初始化;

2)extern int i = 1的写法是错误的,因为extern表示这个变量引用自其它的地方,变量在最初声明时被初始化.

*内部链接的静态变量

---定义:

static修饰的在所有函数之外声明的变量

---与外部链接静态变量的区别

1)作用域,内部的只能在定义的文件内被使用;外部的可以被任何其它文件引用.

---示例

test_extern1.c

test_extern.c
posted on 2011-05-31 22:08  戴忠  阅读(271)  评论(0编辑  收藏  举报