• 第5课 变量属性


    C语言的变量属性:

    auto关键字:

    register关键字:

    全局变量不能定义为register型的变量,因为它的生命周期是从程序开始到结束的,不可能让一个变量始终占据寄存器。

    static关键字:

    示例程序:

     1 #include <stdio.h>
     2 
     3 int f1()
     4 {
     5     int r = 0;
     6     
     7     r++;
     8     
     9     return r;
    10 }
    11 
    12 int f2()
    13 {
    14     static int r = 0;
    15     
    16     r++;
    17     
    18     return r;
    19 }
    20 
    21 
    22 int main()
    23 {
    24     auto int i = 0;       // 显示声明 auto 属性,i 为栈变量
    25     static int k = 0;     // 局部变量 k 的存储区位于静态区,作用域位于 main 中
    26     register int j = 0;   // 向编译器申请将 j 存储于寄存器中
    27 
    28     printf("%p
    ", &i);
    29     printf("%p
    ", &k);
    30     printf("%p
    ", &j);   // error
    31     
    32     for(i=0; i<5; i++)
    33     {
    34         printf("%d
    ", f1());
    35     }
    36     
    37     for(i=0; i<5; i++)
    38     {
    39         printf("%d
    ", f2());
    40     }
    41     
    42     return 0;
    43 }

    第30行打印寄存器变量的地址,是错误的。

    注释掉错误行,运行结果如下:

    f2中的r变量存储在全局数据区,只会被初始化一次。而且每次对它的改动都会被保留下来。

    extern关键字:

    extern定义变量时是告诉编译器,这个变量是在其它文件分配存储空间的。

     示例如下:

    extern告诉编译器,g_i是在其它地方定义的,之后一定会找到它的,现在可以放心使用。

    static和extern是互斥的,static将全局变量变为只在当前文件作用域。

    在一个文件A中定义全局变量,定义为static修饰的,然后提供get和set函数,在另一个文件中用extern声明这些函数(声明函数时,编译器默认加上extern),然后在这个文件中就可以用这些函数来操作A文件中的“全局变量”了,但是不能直接操作这个变量,这就起到了隔离的作用,类似于C++中的类。

    小结:

  • 相关阅读:
    hasCode in Java
    如何区分同一Class的不同实例对象
    如何构建XML文件
    Spring <context:property-placeholder/>的作用
    关于List的几个方法
    Java 中那些不常用的关键字
    设计模式
    Java源代码阅读-Object.toString()
    修复启动项
    centos关闭防火前
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9532594.html
Copyright © 2020-2023  润新知