存储类别、链接
1.0
从硬件来看,被存储的每个值都占用一定的物理内存,C语言把这样一块内存称为对象。对象可以存储一个或多个值。
1.1 作用域
作用域描述程序中可访问标识符的区域。一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域、或文件作用域。
块作用域:定义在块中的变量具有块作用域,块作用域变量的可见范围是从定义处到包含该定义的块的末尾。同时,函数的形参声明虽在左花括号之前,但它也具有块作用域属于函数体这个块。声明在内层块中的变量,其作用域仅局限在该声明所在的块。C99把块的概念扩展到for循环、 while循环、 do while循环和if语句所控制的代码,即使这些代码没用花括号括起来,也算块的一部分。在上述循环或语句中声明的变量,仅在其块内可用,一旦程序离开,响应变量就不能再访问。
函数作用域:仅用于goto语句便签。
函数原型作用域:用于函数原型中的形参名(变量名),范围是形参定义处到原型声明结束。这意味着,编译器在处理函数原型中的形参时只甘心它的类型,而形参名通常无关紧要。
文件作用域:定义在函数外面的变量。范围从它的定义处到该定义所在的文件末尾。由于这样的变量可用于多个函数,所以,文件作用域变量也称为全局变量。
1.2 链接
C变量有3中链接属性:外部链接、内部链接、无链接。
无链接变量:具有块作用域、函数作用域、或函数原型作用域的变量。意味着这些变量属于定义它们的块、函数、函数原型所私有。
外部链接或内部链接:具有文件作用域的变量。外部链接变量可以在多文件程序中使用,内部链接变量只能在一个翻译文件(.c 文件和其.h文件)中使用。
如何知道文件作用域变量是内部链接还是外部链接?可查看外部定义是否使用了存储类型说明符static:
int giants=5; // 文件作用域,外部链接
static int dod =3; //文件作用域,内部链接
int main()
{
} 该文件和同一程序的其他文件都可以使用变量giants,而变量dod属文件私有,该文件中的任意函数均可使用它。
1.3 存储期
C对象有4种存储器:静态存储期、线程存储期、自动存储期、动态分配存储期。
静态存储期:文件作用域变量具有。若对象具有静态存储期,那么它在程序的执行期间一直存在。注意:对于文件作用域变量,关键字static表明其连接属性,而非存储期。以static声明的文件作用域变量具有内部链接。但无论是内部链接还是外部链接,所有的文件作用域变量都具有静态存储期。
线程存储器:用于并发程序设计。
自动存储期:块作用域通常具有。当程序进入定义这些变量的块时,为这些变量分配内存,当退出这个块时,释放刚才为变量分配的内存。然而,块作用域变量也能具有静态存储期,为创建这样的变量,要把变量声明在块中,且在声明前面加上关键字static,
void more(int number)
{
int index;
static int ct =0;
}这里ct储存在静态内存中,它从程序被载入到程序结束期间都存在,但它的作用域定义在more函数体内,只有在执行该函数时,程序才能访问他所指向的对象。
| 存储类别 | 存储期 | 作用域 | 链接 | 声明方式 | ||||||||||||||||||||
| 自动 | 自动 | 块 | 无 | 块内 | ||||||||||||||||||||
| 寄存器 | 自动 | 块 | 无 | 块内,使用关键字register | ||||||||||||||||||||
| 静态外部链接 | 静态 | 文件 | 外部 | 所有函数外 | ||||||||||||||||||||
| 静态内部链接 | 静态 | 文件 | 内部 | 所有函数外,使用关键字static | ||||||||||||||||||||
| 静态无链接 | 静态 | 块 | 无 |
块内,使用关键字static |
1.4 自动变量
属于自动存储类别的变量具有自动存储期、块作用域且无链接。默认情况下,声明在块或函数头中的任何变量都属于自动存储类别。为清楚表达意图可显式使用关键字auto.
浙公网安备 33010602011771号