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

来源:互联网 发布:plc编程软件通用版 编辑:程序博客网 时间:2024/04/29 23:13

       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变量已经过时了 ,尽量不用。

 

 

 

 

          

 

 

 

 

 

          

 

 

 

 

 

  

 

 

 

 

   

    

           

 

 

 

 

 

   

   

       

 

 

 

 

 

 

      

原创粉丝点击