第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
", &i);
29     printf("%p
", &k);
30     printf("%p
", &j);   // error
31     
32     for(i=0; i<5; i++)
33     {
34         printf("%d
", f1());
35     }
36     
37     for(i=0; i<5; i++)
38     {
39         printf("%d
", 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