变量属性
变量属性#
C语言的变量属性##
- C语言中的变量可以有自己的属性
- 在定义变量的时候加上“属性”关键字
- 属性关键字指明变量的特有意义
auto关键字###
- auto即C语言中局部变量的默认属性
- auto表明将被修饰的变量存储在栈上
- 编译器默认所有的局部变量都是auto的
register关键字###
- register关键字指明局部变量存储在寄存器中
- register只是请求寄存器变量,但不一定请求成功
- register变量的必须是CPU寄存器可以接受的值
- 不能用&运算符获取register变量的地址
#include <stdio.h>
register int g_val ; // error
int main()
{
register char var;
printf("0x%08x",&var); // error
return 0;
}
static关键字
- static关键字指明变量的“静态”属性
- static关键同时具有“作用域限定符”的意义
- static修饰的全局变量作用域只是声明的文件中
- static修饰的函数作用域只是声明的文件中
#include <stdio.h>
int g_var; // 全局变量,程序的任意地方都能访问
static int g_vs; // 静态全局变量,只有当前文件中可以访问
int main()
{
int var; // 局部变量,在栈上分配空间
static int s_var; // 静态局部变量,在静态数据区分配空间
return 0;
}
例子:
#include <stdio.h>
int f1()
{
int r = 0;
r++;
return r;
}
int f2()
{
static int r = 0;
r++;
return r;
}
int main(int argc, char const *argv[])
{
auto int i = 0;
static int k = 0;
register int j = 0;
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;
}
结果:
extern 关键字
- extern 用于声明“外部”定义的变量和函数
- extern 变量在文件的其他地方分配空间
- extern 函数在文件的其他地方定义
- extern 用于“告诉”编译器用C语言方式编译
extern "C"
{
int f(int a,int b)
{
return a + b;
}
}
static 和extern
#include <stdio.h>
extern int g_i;
int main()
{
printf("%d\n",g_i);
}
int g_i;
总结:
- auto变量存储在程序的栈中,默认属性
- static 变量在程序静态区中
- register变量请求存储于CPU寄存器中
- extern变量在文件的其它地方分配空间
- extern 能够指示编译器按照标准C方式编译程序