码迷,mamicode.com
首页 > 其他好文 > 详细

第5课 变量属性

时间:2018-08-25 11:31:54      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:erro   全局数据区   初始化   示例   打印   register   std   i++   class   

C语言的变量属性:

技术分享图片

 

auto关键字:

技术分享图片

 

register关键字:

技术分享图片

 

全局变量不能定义为register型的变量,因为它的生命周期是从程序开始到结束的,不可能让一个变量始终占据寄存器。

static关键字:

技术分享图片

 

示例程序:

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

第30行打印寄存器变量的地址,是错误的。

注释掉错误行,运行结果如下:

技术分享图片

 

f2中的r变量存储在全局数据区,只会被初始化一次。而且每次对它的改动都会被保留下来。

extern关键字:

技术分享图片

 

extern定义变量时是告诉编译器,这个变量是在其它文件分配存储空间的。

 示例如下:

技术分享图片

 

extern告诉编译器,g_i是在其它地方定义的,之后一定会找到它的,现在可以放心使用。

static和extern是互斥的,static将全局变量变为只在当前文件作用域。

在一个文件A中定义全局变量,定义为static修饰的,然后提供get和set函数,在另一个文件中用extern声明这些函数(声明函数时,编译器默认加上extern),然后在这个文件中就可以用这些函数来操作A文件中的“全局变量”了,但是不能直接操作这个变量,这就起到了隔离的作用,类似于C++中的类。

小结:

技术分享图片

第5课 变量属性

标签:erro   全局数据区   初始化   示例   打印   register   std   i++   class   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9532594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!