zoukankan      html  css  js  c++  java
  • 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;
      }
      
  • 相关阅读:
    gitea (git服务器), 修改配置,更换IP地址
    使用ffmpeg裁剪和合并视频
    linux/windows/Mac平台生成随机数的不同方法
    Android源代码同步脚本(增加设置线程参数)
    小米2S Mk6.0.1 [只能做测试体验,不能使用]
    MultiROM for the XIAOMI MI2S/2C/2! (Kexec HardBoot Enabled with Kexec HardBoot Patch!)
    [PATCH] UBUNTU: SAUCE: (no-up) apparmor: Sync to apparmor3
    [转载]起动service保存android系统log( logcat服务)
    小米2S TWRP 3.0.2-0 最新中文版本Recovery
    centos 64位编译安装 glibc-2.14
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13582434.html
Copyright © 2011-2022 走看看