4 变量属性

1 C语言的变量属性

  • C语言中的变量可以有自己的属性

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

  • “属性”关键字指明变量的特有意义

  • 语法:property type var_name;

  • 示例

    int main()
    {
        auto char i;
        register int j;
        static long k;
        extern double m;
        
        return 0;
    }
    

2 auto 关键字

  • auto 即C语言中局部变量的默认属性

  • auto 表明将被修饰的变量存储在栈上

  • 编译器默认所有的局部变量都是 auto

  • 示例

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

3 register 关键字

  • register 关键字指明将局部变量存储在寄存器中,而不是内存中

  • 寄存器的访问速度比内存快

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

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

  • 不能用 & 运算符获取 register 变量的地址,因为取地址符 & 得到的地址是内存中的地址

  • 示例

    #include <stdio.h>
    
    register int g_v;  // error:全局范围的声明不能包含此存储类
    
    int main()
    {
        register char var;
        printf("0x%08X
    ",&var);  // error:address of register variable 'var' requested
        
        return 0;
    }
    

4 static 关键字

  • static 关键字指明变量的“静态”属性

  • static 修饰的局部变量存储在程序静态区,栈 -> 静态数据区

  • static 关键字同时具有“作用域限定符”的意义

    • static 修饰的全局变量的作用域只是声明的文件中
    • static 修饰的函数的作用域只是声明的文件中
  • 示例

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

    #include <stdio.h>
    
    int f1()
    {
    	int r = 0;
    	r++;
    	return r;
    }
    
    int f2()
    {
    	static r = 0;
    	r++;
    	return r;
    }
    
    int main()
    {
    	auto int i = 0;  //显式声明auto属性,i为栈变量
    	static int j = 0;  //局部变量k的存储区位于静态区,作用域位于main中
    	register int k = 0;  //向编译器申请将j存储于寄存器中
    
            //i,j的地址会相差很大
    	printf("&i = %p
    ", &i);
    	printf("&j = %p
    ", &j);
    	//printf("%p
    ", &k);  //error
    
    	for (i = 0; i < 5; i++) {
    		printf("%d
    ", f1());
    	}
    
    	for (i = 0; i < 5; i++) {
    		printf("%d
    ", f2());
    	}
    
    	return 0;
    }
    
    //数出结果
    &i = 0xbfefa18c
    &j = 0x804a01c
    1
    1
    1
    1
    1
    1
    2
    3
    4
    5
    

5 extern 关键字

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

    • extern 变量在文件的其他地方分配空间
    • extern 函数在文件的其他地方定义
  • extern 用于“告诉”编译器用C方式编译

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

    • 示例

      extern "C"
      {
          int f(int a,int b){
              return a + b;
          }
      }
      
  • staticextern 的使用

    //main.c
    #include <stdio.h>
    
    extern int getI();
    
    int main()
    {
    	printf("%d
    ", getI());
    
    	return 0;
    }
    
    //g.c
    static int g_i = 1;  //只能在当前文件中访问
    
    int getI() {
    	return g_i;
    }
    
原文地址:https://www.cnblogs.com/bky-hbq/p/13582434.html