您的位置:首页 > 其它

第三章 数据 [C和指针]

2011-12-28 11:21 274 查看
看完这章,被链接属性、作用域、存储类型这几个概念弄得晕头转向,现梳理如下,如有不妥,还望指教。

//变量的存储类型

一旦定义了一个变量,编译系统就会根据定义的数据类型安排存放该变量的“地方”,而这个“地方”在计算机世界里有内存1(一般数据区)、内存2(堆栈区)和CPU寄存器。根据存储“地方”的不同,才有了存储类型。规范的说法如下:

自动型(auto) 内存堆栈区 系统默认内部变量为auto

寄存器型(register) CPU通用寄存器 一般在函数中定义,不解释

静态型(static) 内存数据区 在程序开始就分配了固定的内存,程序结束才释放内存

外部参照型(extern) ----- 专用于多个编译单位数据传送

注意:外部参照型变量不允许进行初始化,其它类型可以。

//链接属性

当组成一个程序的各个源文件分别被编译之后,所有的目标文件以及那些从一个或多个函数库中引用的函数链接在一起,形成可执

行程序。如果相同的标识符出现在几个不同的源文件中时,它们是表示同一个实体(变量)还是不同的实体(变量)呢?这个就取

决于标识符的链接属性(linkage)。要注意的是,标识符的作用域与链接属性有关,但这两个属性并不相同。

链接属性一共有3种:external(外部)、internal(内部)和none(无)。

1.没有链接属性的标识符(none)总是被当作单独的个体,也就是说该标识符的多个声明被当作独立不同的实体。

2.属于internal链接属性的标识符在同一个源文件内的所有声明中指同一个实体,但位于不同源文件的多个声明则属于不同的实体。使用static关键

字来声明一个internal类型的标识符。static只对缺省链接属性为external的声明才有改变链接属性的效果。static用于声明局部变量时,是使这个变

量成为静态变量,就是这个变量在程序的整个运行过程中总是存在的,直到程序结束。

3.属于external链接属性的标识符在其他语言术语中也称为全局实体(变量)无论声明多少次、位于几个源文件都表示同一个实体。当extern关键字用于源文件中一个标识符的第1次声明时,它指定该标识符具有external链接属性。但是,如果它用于该标识符的第2次或以后的声明时,它并不会更改由

// static的不同含义

当它用于函数或代码块之外的声明时,表示修改标示符的链接属性,从external到internal;不影响存储类型;

当它用于代码块内部变量声明时,表示修改变量的存储类型,从auto 到 static;不影响链接属性和作用域;

//注意几点

具有external链接属性的实体总是具有静态存储类型

局部变量有函数内部使用,默认为自动存储类型,这是出于两点考虑:1需要时才分配,减少内存需求总量;2在堆栈上分配存储可有效实现递归
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: