1 C语言的变量属性
-
C语言中的变量可以有自己的属性
-
在定义变量的时候可以加上“属性”关键字
-
“属性”关键字指明变量的特有意义
-
语法:
property type var_name;
-
示例
int main() { auto char i; register int j; static long k; extern double m; return 0; }
2 auto 关键字
-
auto
即C语言中局部变量的默认属性 -
auto
表明将被修饰的变量存储在栈上 -
编译器默认所有的局部变量都是
auto
的 -
示例
void f() { int i; //局部变量默认属性为 auto auto int j; //显式声明 auto 属性 }
3 register 关键字
-
register
关键字指明将局部变量存储在寄存器中,而不是内存中 -
寄存器的访问速度比内存快
-
register
只是请求寄存器变量,但不一定请求成功 -
register
变量必须是 CPU 寄存器可以接受的值 -
不能用
&
运算符获取register
变量的地址,因为取地址符&
得到的地址是内存中的地址 -
示例
#include <stdio.h> register int g_v; // error:全局范围的声明不能包含此存储类 int main() { register char var; printf("0x%08X ",&var); // error:address of register variable 'var' requested return 0; }
4 static 关键字
-
static
关键字指明变量的“静态”属性 -
static
修饰的局部变量存储在程序静态区,栈 -> 静态数据区 -
static
关键字同时具有“作用域限定符”的意义static
修饰的全局变量的作用域只是声明的文件中static
修饰的函数的作用域只是声明的文件中
-
示例
#include <stdio.h> int g_v; //全局变量,程序的任意地方都能访问 static int g_vs; //静态全局变量,只有当前文件中可以访问 int main() { int var; //局部变量,在栈上分配空间 static int svar; //静态局部变量,在静态数据区分配空间 }
-
auto
,register
,static
对比分析#include <stdio.h> int f1() { int r = 0; r++; return r; } int f2() { static r = 0; r++; return r; } int main() { auto int i = 0; //显式声明auto属性,i为栈变量 static int j = 0; //局部变量k的存储区位于静态区,作用域位于main中 register int k = 0; //向编译器申请将j存储于寄存器中 //i,j的地址会相差很大 printf("&i = %p ", &i); printf("&j = %p ", &j); //printf("%p ", &k); //error for (i = 0; i < 5; i++) { printf("%d ", f1()); } for (i = 0; i < 5; i++) { printf("%d ", f2()); } return 0; } //数出结果 &i = 0xbfefa18c &j = 0x804a01c 1 1 1 1 1 1 2 3 4 5
5 extern 关键字
-
extern
用于声明“外部”定义的变量和函数extern
变量在文件的其他地方分配空间extern
函数在文件的其他地方定义
-
extern
用于“告诉”编译器用C方式编译-
C++编译器和一些变种C编译器默认会按“自己”的方式编译函数和变量,通过
extern
关键字可以命令编译器“以标准C方式进行编译” -
示例
extern "C" { int f(int a,int b){ return a + b; } }
-
-
static
和extern
的使用//main.c #include <stdio.h> extern int getI(); int main() { printf("%d ", getI()); return 0; } //g.c static int g_i = 1; //只能在当前文件中访问 int getI() { return g_i; }