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

实例:        


  
  1.     int main()
  2.             {
  3.                 auto char i;
  4.                 register int j;
  5.                 static long k;
  6.                 extern double m;
  7.                 return 0;
  8.             }

 

 

auto关键字

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

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

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

实例:   


  
  1. void f()
  2. {
  3.     int i; //局部变量默认属性为auto
  4.     
  5.     auto int j;//显示声明为auto属性
  6. }

 

register关键字

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

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

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

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


  
  1. #incliude <stdio.h>
  2. register int g_v;  //error
  3. int main ()
  4. {
  5.     register char var;
  6.     printf("0x%d08x",&var);  //error
  7.     
  8.     return 0;
  9. }

 

static关键字

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

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

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

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

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


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

 

 

实例1:auto    register    static  对比分析


  
  1. #include <stdio.h>
  2. int f1()
  3. {
  4.     int r = 0;
  5.    
  6.     r++;
  7.    
  8.     return r;
  9. }
  10. int f2()
  11. {
  12.     static int r = 0;
  13.    
  14.     r++;
  15.    
  16.     return r;
  17. }
  18. int main()
  19. {
  20.     auto int i = 0;       // 显示声明 auto 属性,i 为栈变量
  21.     static int k = 0;     // 局部变量 k 的存储区位于静态区,作用域位于 main 中
  22.     register int j = 0;   // 向编译器申请将 j 存储于寄存器中
  23.     printf("%p\n", &i);
  24.     printf("%p\n", &k);
  25.     printf("%p\n", &j);   // error
  26.    
  27.     for(i=0; i<5; i++)
  28.     {
  29.         printf("%d\n", f1());
  30.     }
  31.    
  32.     for(i=0; i<5; i++)
  33.     {
  34.         printf("%d\n", f2());
  35.     }
  36.    
  37.     return 0;
  38. }

 

extern关键字

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

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

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

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

 

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


  
  1. extern "C"
  2. {
  3.     int f(int a,int b)
  4.     {
  5.         return a+b;
  6.     }
  7. }

 

实例2:static和extern的使用


  
  1. #include <stdio.h>
  2. extern int getI();
  3. int main()
  4. {
  5.     printf("%d\n", getI());
  6.       
  7.     return 0;
  8. }

 

g.c文件


  
  1. static int g_i;  //缩小了作用域
  2. int getI()
  3. {
  4.     return g_i;
  5. }

 

小结:

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个月内不可修改。