C语言中的变量可以有自己的属性
在定义变量的时候可以加上“属性”关键字
“属性”关键字指明变量的特有意义
auto即C语言中局部变量的默认属性,并且只能修饰局部变量;
编译器默认所有的局部变量都是auto的;
auto指明申明的变量在程序的栈上分配空间的
static指明变量的“静态”属性;
static同时具有“作用域限定符”的意义;
static另一意义是文件作用域标示符;
static修饰的全局变量,即静态全局变量,其作用域仅限于变量被定义的文件中;其他文件即使用extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern *** 。恶心吧?要想不恶心,很简单,直接在文件顶端定义。
static修饰的局部变量,即静态局部变量,在程序的静态区分配空间,因为在函数体里面定义的,就只能在这个函数里面用了,同一文件中其他函数用不了。由于被static修饰的局部变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值也不会被销毁,函数下次使用时仍然能用到这个值。
static修饰的函数作用域仅限于申明的文件中(所以又称内部函数),此处static无存储方式含义。
static int j;
void fun1 (void )
{
static int i = 0;
i ++;
}
void fun2 (void )
{
j = 0;
j++;
}
int main()
{
for(k=0; k<10; k++)
{
fun1();
fun2();
}
return 0;
}
i和j的值分别是什么?
i = 10 j = 1,因为i在静态数据区分配空间,调用fun1()后,i不会被释放,对于静态局部变量,只会被初始化一次,第一次调用fun1()时初始化,以后每次调用fun1(),都会跑到静态区看i是否被初始化,就不管i了程序往下继续走,以后每次调用fun1()都一样。
register指明将变量存储于寄存器中,不能修饰全局变量;
register只是请求寄存器变量,只是尽量的将它作为寄存器变量来设置,但不一定成功。
register变量必须是CPU寄存器可以接受的值。
register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register 变量可能不存放在内存中,所以不能用取址运算符“& ”来获取register 变量的地址。
register变量用于非常讲究系统实时性能当中,当一个函数被频繁调用,对运行的效率要求非常高的时候,就应该使用register变量。