• 变量属性


    变量属性#

    C语言的变量属性##

    • C语言中的变量可以有自己的属性
    • 在定义变量的时候加上“属性”关键字
    • 属性关键字指明变量的特有意义

    auto关键字###

    • auto即C语言中局部变量的默认属性
    • auto表明将被修饰的变量存储在栈上
    • 编译器默认所有的局部变量都是auto的

    register关键字###

    • register关键字指明局部变量存储在寄存器中
    • register只是请求寄存器变量,但不一定请求成功
    • register变量的必须是CPU寄存器可以接受的值
    • 不能用&运算符获取register变量的地址
    #include <stdio.h>
    register int g_val ; // error
    int main()
    {
        register char var;
        printf("0x%08x",&var); // error
         return 0;
    }
    

    static关键字

    • static关键字指明变量的“静态”属性
    • static关键同时具有“作用域限定符”的意义
      • static修饰的全局变量作用域只是声明的文件中
      • static修饰的函数作用域只是声明的文件中
    #include <stdio.h>
    int g_var; // 全局变量,程序的任意地方都能访问
    static int g_vs; // 静态全局变量,只有当前文件中可以访问
    int main()
    {
        int var;  // 局部变量,在栈上分配空间
        static int s_var; // 静态局部变量,在静态数据区分配空间
        return 0;
    }
    

    例子:

    #include <stdio.h>
    int f1()
    {
        int r = 0;
        r++;
        return r;
    }
    int f2()
    {
        static int r = 0;
        r++;
        return r;
    }
    int main(int argc, char const *argv[])
    {
        auto int i = 0;
        static int k = 0;
        register int j = 0;
    
        printf("%p
    ",&i);
        printf("%p
    ",&k);
        // printf("%p
    ",&j); // error
    
        for(i=0;i<5;i++)
            printf("%d
    ",f1());
        for(i=0;i<5;i++)
            printf("%d
    ",f2());
        return 0;
    }
    

    结果:

    extern 关键字

    • extern 用于声明“外部”定义的变量和函数
      • extern 变量在文件的其他地方分配空间
      • extern 函数在文件的其他地方定义
    • extern 用于“告诉”编译器用C语言方式编译
    extern "C"
    {
        int f(int a,int b)
        {
            return a + b;
       }
    }
    

    static 和extern

    #include <stdio.h>
    extern int g_i;
    int main()
    {
        printf("%d
    ",g_i);
    }
    int g_i;
    

    总结:

    • auto变量存储在程序的栈中,默认属性
    • static 变量在程序静态区中
    • register变量请求存储于CPU寄存器中
    • extern变量在文件的其它地方分配空间
    • extern 能够指示编译器按照标准C方式编译程序
  • 相关阅读:
    Eclipse + Gradle + TestNG environment setup troubleshooting
    石家庄市教育局人才市场
    js技巧小记
    转 Browserhacks – 史上最全 CSS & JS Hack 手册
    【聊聊并发】【转】
    【深入理解Java内存模型】【转】
    Awk基本入门[1] Awk Syntax and Basic Commands
    Sed基本入门[6] Sed MultiLine Commands and loops
    Awk基本入门[2] Awk Builtin Variables
    SuperMap IS.NET 如何发布数据库型工作空间
  • 原文地址:https://www.cnblogs.com/yanyun888/p/6061235.html
Copyright © 2020-2023  润新知