第5课 - 变量属性
1. C语言变量的属性
C语言中的变量可以拥有自己的属性。在定义变量时可以加上属性关键字,用来指明变量的特有意义。
语法:
property type var_name;
示例:
1 auto char i; 2 register int j; 3 static long k; 4 extern double m;
2. auto关键字
(1)auto属性关键字将被修饰的变量存储在栈上
(2)C编译器默认所有的局部变量都是auto属性的(auto是局部变量的默认属性),即局部变量存储在栈上
示例:
1 void f(){ 2 int i; // 局部变量默认属性为auto 3 auto int j; // 显式声明局部变量为auto属性 4 }
3. register关键字
(1)register关键字请求编译器将局部变量存储于寄存器中,而不是内存中,以加快其存取速度,多用于修饰需要频繁使用的局部变量
※※ register不能修饰全局变量
(2)不能使用 & 运算符获取register变量的地址,因为寄存器是没有地址的,只有内存才有地址
1 #include<stdio.h> 2 3 // register int g_v; // 全局变量的生命周期从程序运行到程序结束,那么在整个过程中都要占用寄存器,但CPU寄存器的数量是有限的,长时间占用会影响CPU工作 4 // 因此不允许register修饰全局变量,register修饰全局变量编译器会直接报错,error! 5 int main() 6 { 7 register char var; 8 // printf("0x%08X ", &var); // 寄存器变量没有地址,编译报错,error! 9 10 return 0; 11 }
(3)register只是请求寄存器变量,但不一定请求成功
(4)由于register修饰的变量存储在寄存器中,因此该变量必须是CPU寄存器可以接受的值
下面是libevent中一个拷贝字符串的函数,使用了register关键字
1 size_t event_strlcpy_(char *dst, const char *src, size_t size) 2 { 3 register char *d = dst; 4 register const char *s = src; 5 register size_t n = size; 6 7 /* Copy as many bytes as will fit */ 8 if (n != 0 && --n != 0) { 9 do { 10 if ((*d++ = *s++) == 0) 11 break; 12 } while (--n != 0); 13 } 14 15 /* Not enough room in dst, add NUL and traverse rest of src */ 16 if (n == 0) { 17 if (size != 0) 18 *d = '