存储类别、链接

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.

      

    

posted on 2020-06-07 11:04  执念笃行  阅读(105)  评论(0)    收藏  举报

导航