register关键字请求编译器尽可能地将变量存在CPU内部寄存器中,而不是通过内存寻址访问以提高效率。
使用register修饰符有几点限制:
(1)因为register变量可能不存放在内存中,所以不能用“&”来获取register变量的地址。
void main()
{
register int a = 0;
int *p = &a; //错误
}
(2)只有局部自动变量和形式参数可以作为寄存器变量,其它(如全局变量、结构体、共用体内部变量)不行。特别地,静态局部变量不能定义为寄存器变量。
struct _STRUCT_NAME_
{
register int a; //错误
};
union _UNION_NAME_
{
register int b; //错误
};
register int c; //错误
void main()
{
register static int d = 0; //错误
}
(3)由于寄存器的数量有限,不能定义任意多个寄存器变量,任何多余的register修饰符都将被编译程序所忽略。
参考博文:浅析C语言的一个关键字——register