C语言开发总结(二十四)

C 语言四大存储类型。&&C语言32大关键字


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


C语言32大关键字

所谓关键字也叫保留字,它是标识符的一种,标准规定它是编译器默认的某些类型,因此用户不可用它的一样的标识符去表示其他的东西。

  标准C有32个关键字:

   一  数据类型关键字 12 个:

   1 . char 

   2 . short

   3 . int 

   4 . long 

   5. enum

   6. float

   7. double

   8. signed

   9. unsigned

   10. struct

   11. union

   12.void

  二 控制类型关键字 12 个

   循环语句

    1.for 

    2.do

    3.while

    4. break

    5.continue

  条件语句

    6.if

    7.else

    8.goto

   开关语句

    9.switch

    10.case

    11.default

   返回语句

    12.return 

 

  三  存储类型 4个

   1. auto      //声明自动变量,一般不不用,局部变量默认都是auto型

   2.static   //声明静态变量

   3.extern //声明一个外部变量

   4.register  //声明寄存器变量

  四 其他关键字 4个

   1.const   //声明只读变量

   2.sizeof  //运算符, 计算数据占用内存

   3.typedef   //自定义类型

   4.volatile  //修饰的变量可能改变

 

     注意,不要把 define ,include当做关键字 ,它们只是预编译伪指令。。

  C99标准又增加了5个关键字,分别是

  restrict

    它只可以用于限定和约束指针,并表明指针是访问一个数据对象的唯一且初始的方式

    inline

    内联函数,在C++中用的多, 它是宏定义的一种优化实现方式

    _Bool

    unsigned int 型,在C99中被定义为布尔型,只可容纳0,1两个值

    _Complex

    复数类类型

    _Imaginary

    纯虚数类型

 

       C11 标准在C99的基础上又增加了一个关键字

    _Generic   泛型





你可能感兴趣的:(C语言开发总结(二十四))