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;
      }
      
  • 相关阅读:
    HTML+CSS知识点总结
    消灭textarea中的神秘空格
    OAuth2.0
    C# task和timer实现定时操作
    C# 多线程task
    EF的使用
    支付宝支付开发
    Basic Auth
    C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别
    [转]CodeSite使用小结
  • 原文地址:https://www.cnblogs.com/bky-hbq/p/13582434.html
Copyright © 2011-2022 走看看