第5课 变量属性

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++中的类。

小结:

转载于:https://www.cnblogs.com/wanmeishenghuo/p/9532594.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值