赞
踩
文章目录
语法:
property type var_name;
示例:
- int main()
- {
- auto char i;
- register int j;
- static long k;
- extern double m;
-
- return 0;
- }
示例:
- void f()
- {
- int i; //局部变量默认属性为 auto
-
- auto int j; //显示申明 auto 属性
- }
- #include<stdio.h>
-
- register int g_v; //eror
-
- int main()
- {
- register char var;
-
- printf("0x%08X",&var); //error
-
- return 0;
- }
- #include<stdio.h>
-
- int g_v; //全局变量,程序的任意地方均能访问
-
- static int g_vs; //静态全局变量,只在当前文件中可访问
-
- int main()
- {
- int var; //局部变量,在栈上分配空间
-
- static int svar; //静态局域变量,在静态数据区分配空间
-
- return 0;
- }
下面看一段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;
- }
下面为输出结果:
如果试图获取 register 变量 j 的地址,就会报如下错误:
另外,可以看到 i 和 k 的内存地址相隔很远,这是由于这两个变量一个在栈上,一个在静态区
C++ 编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过 extern 关键可以命令编译器“以标准C方式进行编译”,如:
下面看一段 static 和 extern 的使用代码:
g.c
- static int g_i;
-
- int getI()
- {
- return g_i;
- }
test.c
- #include <stdio.h>
-
- extern int getI();
-
- int main()
- {
- printf("%d\n", getI());
-
- return 0;
- }
下面为输出结果:
注意如果想要直接在 test.c 文件里获得 g_i 的值是不行的,因为static 修饰的全局变量作用域只是声明的文件中
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。