auto,register,static分析

来源:互联网 发布:linux怎么删除目录 编辑:程序博客网 时间:2024/04/26 05:15

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变量。