• 第5课 变量属性


    1.C语言的变量属性

    (1)C语言中的变量可以有自己的属性

    (2)在定义变量的时候可以加上“属性”关键字

    (3)“属性”关键字指明变量的特有意义。语法:property type var_name;

    如: auto char i;
        register int j;
        static long k;
        extern double m;

    2. auto关键字

    (1)auto即C语言中局部变量的默认属性

    (2)auto表明将被修饰的变量存储于栈上

    (3)编译器默认所有的局部变量都是auto的

         示例:

    void f(){
       int i;        //局部变量默认属性为auto
       auto int j;//显示声明auto属性
    }

    3. register关键字

    (1)register关键字指明将局部变量存储于寄存器中

    (2)register只是请求寄存器变量,但不一定请求成功

    (3)register变量必须是CPU寄存器可以接受的值

    (4)不能用&运算符获取register变量的地址

    #include<stdio.h>
    
    register int g_v;   //error,只能是局部变量,因为全局变量的生存期长,占用寄
                        //存器,编译器直接报错。
    
    int main()
    {
        register char var;
        printf("0x%08X
    ", &var);//error,寄存器变量没有内存地址!因为存放在寄存器上。
    }

    4. static关键字

    (1)static关键字指明变量的“静态”属性——局部变量存储在程序静态区

    (2)static关键字同时具有“作用域限定符”

      ①static修饰的全局变量作用域只是声明的文件中

      ②static修饰的函数作用域只是声明的文件中

    【示例】

    #include <stdio.h>
    
    int g_v;                //全局变量,程序的任意地方均能访问
    static int g_vs;     //静态全局变量,只有当前文件中可访问
    
    int main()
    {
       int var;             //局部变量,在栈上分配空间
       static int svar;     //静态局部变量,在静态数据区分配空间
       
       return 0;
    }

    【编程实验】 auto、register、static对比分析

    #include<stdio.h>
    
    int f1()
    {
        int r = 0;
        r++;
    
        return r;
    }
    
    intf2()
    {
        static int r = 0; //静态局部变量,只被初始化一次
        r++;
    
        return r;
    }
    
    int main()
    {
        auto int i = 0;    //显式声明auto属性,i为栈变量
        static int k = 0;  //局部变量k的存储区位于静态区,作用域位于main中
        register int j = 0; //向编译器申请将j存储于寄存器中
    
        printf("%p
    ", &i);
        printf("%p
    ", &k);
        //printf("%p
    ", &j);  //error,寄存器变量没有内存地址,编译器直接报错。
    
     
        for (i = 0; i < 5; i++)
        {
            printf("%d
    ", f1());    //输出5个的1,因为使用的是局部变量。
        }
     
        for (i = 0; i < 5; i++)
        {
            printf("%d
    ", f2());    //输出1、2、3、4、5,因为使用的是静态局部变量
        }
    
        return 0;
    }

    5. extern关键字

    (1)extern用于声明“外部”定义的变量和函数

      ①extern变量在文件的其它地方分配空间

      ②extern函数在文件的其它地方定义

    (2)extern用于“告诉”编译器用C方式编译

    C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通用extern关键字可以命令编译器“以标准C方式进行编译”。

    extern “c”

    {

        int f(int a,int b)

        {

            return a + b;

         }

    }

    【编程实验】static和extern的使用

    例1:

    #include<stdio.h>
    
    extern int g_i;  //若不声明g_i为“外部”的,下面printf会找不到g_i;
    
    int main()
    {
        printf("%d
    ", g_i);  //编译器发现此时g_i未定义,可以是在g_i前
                              //用extern声明为在其他地方定义的。
        return 0;
    
    }
    
    int g_i = 0;

    例2:

    /**************************g.c文件**************/

    static int g_i;  //g_i只能在本文件中使用
    
    int getI()
    {
        return g_i;
    }

    /**************************main.c文件**************/

    #include<stdio.h>
    
    extern int getI(); //extern声明getI函数是在其他地方定义的。
    
    int main()
    {
        printf("%d
    ", getI());                       
    
        return 0;
    }

    6. 小结

    (1)auto变量存储在程序的栈中,为默认的属性

    (2)static变量存储在程序静态区中

    (3)register变量请求存储于CPU寄存器中

    (4)extern变量在文件的其它地方分配空间

    (5)extern能够指示编译器按照标准C方式编译程序

  • 相关阅读:
    Eclipse安装Hadoop插件
    (转)Ubuntu14.0.4中hadoop2.4.0伪分布模式配置
    Hadoop--DataNode无法启动
    启动与关闭hadoop
    hadoop中执行命令时发生错误
    strings命令
    Deriving data from ElasticSearch Engine
    elasticsearch data importing
    reading words in your computer and changing to female voice, linux festival text2wave saving wav files
    DDNS client on a Linux machine
  • 原文地址:https://www.cnblogs.com/5iedu/p/5317835.html
Copyright © 2020-2023  润新知