C语言学习第6篇---变量属性剖析

举报
CodeAllen 发表于 2021/10/29 23:00:55 2021/10/29
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取   C语言的变量属性 1.C语言中的变量可以有自己的属性 2.在定义变量的时候可以加上“属性”关键字 3.“属性”关键字指明变量的特有意义 语法:    &nb...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》,有兴趣的朋友可以看我置顶文章获取

 

C语言的变量属性

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

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

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

语法:

        property type var_name

实例:        


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

 

 

auto关键字

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

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

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

实例:   


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

 

register关键字

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

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

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

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


      #incliude <stdio.h>
      register int g_v;  //error
      int main ()
      {
          register char var;
          printf("0x%d08x",&var);  //error
          return 0;
      }
  
 

 

static关键字

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

   ---static修饰的局部变量存储在程序静态区

2.static关键字同事具有"作用域限定符"的意义

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

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


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

 

 

实例1:auto    register    static  对比分析


      #include <stdio.h>
      int f1()
      {
          int r = 0;
          r++;
          return r;
      }
      int f2()
      {
          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\n", &i);
          printf("%p\n", &k);
          printf("%p\n", &j);   // error
          for(i=0; i<5; i++)
          {
              printf("%d\n", f1());
          }
          for(i=0; i<5; i++)
          {
              printf("%d\n", f2());
          }
          return 0;
      }
  
 

 

extern关键字

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

   ---extern变量在文件的其他地方分配空间

   ---extern函数在文件的其他地方定义

2.extern用于“告诉”编译器使用C语言编译

 

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


      extern "C"
      {
          int f(int a,int b)
          {
              return a+b;
          }
      }
  
 

 

实例2:static和extern的使用


      #include <stdio.h>
      extern int getI();
      int main()
      {
          printf("%d\n", getI());
          return 0;
      }
  
 

 

g.c文件


      static int g_i;  //缩小了作用域
      int getI()
      {
          return g_i;
      }
  
 

 

小结:

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

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

3.register变量请求存储于产品CPU寄存器中---有可能失败

4.extern变量早文件的其他地方分配空间

5.extern能够只是编译器按照标准C语言方式进行编译

 

 

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/78848646

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。