zoukankan      html  css  js  c++  java
  • 第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方式编译程序

  • 相关阅读:
    转载:一句代码改变Swing难看的字体
    生产者消费者问题c语言实现
    水题~~~~HDU 4788
    html中dom居中的5种方式
    scss中的三角函数
    nuxt基础Ⅱ
    nuxt基础Ⅰ
    win10软件安装出现错误代码2503/2502
    npm淘宝镜像安装
    axios的使用
  • 原文地址:https://www.cnblogs.com/5iedu/p/5317835.html
Copyright © 2011-2022 走看看