在C语言中根据变量存储位置的不同,把C语言中的变量分为三种,静态变量、动态变量以及寄存器变量。
变量存储位置不同生命周期不同
存储位置 | 变量类型 | 生命周期 |
普通内存 | 静态变量 | 存储在静态内存中,所有的全局变量都是静态变量,被static修饰的局部变量也是静态变量,生命周期发生改变,但是并没改变它的作用域,在程序运行前分配内存,在程序整个运行期间都存在,在程序运行结束后销毁和Java中的静态变量不一样,Java中的静态变量通过类名访问,在程序中放在一个静态的代码块中最先分配内存 |
运行时堆栈(自动分配,自动销毁) | 自动变量 | 在函数中声明的时候被创建,在函数块结束后,就会销毁,函数被重新调用,都会被重新创建随机分配内存地址 |
硬件寄存器 | 寄存器变量 | 函数调用时,占用寄存器,调用完成后,释放寄存器给其他寄存器变量使用 |
默认情况所有的局部变量都是自动变量
void test(){ int i=10; auto int i=10; //auto可以省略 }; |
void testSum(){ int a=0; a++; static int b=0; //虽然改变了b的生命周期,但是并没改变b的作用域 b++; printf("a的值是%i,b的值是%i\n",a,b); } int main(int argc, const char * argv[]) { for (int i=0; i<5; i++) { testSum(); } return 0; } 执行结果; a的值是1,b的值是1 a的值是1,b的值是2 a的值是1,b的值是3 a的值是1,b的值是4 a的值是1,b的值是5 |
寄存器变量,存储在硬件中也就是电脑CPU中,容量有限,高速存储,效率比内存更高,用register修饰的自动变量,
int main(int argc, const char * argv[]) { register int k=10; return 0; } |
注意:register不能修饰static变量,因为静态变量放在静态内存中,而且只能用定义int char 指针类型(void*),存储器有限,不能使用太多寄存器,如果频繁调用,就使用寄存器变量,如果寄存器饱和,那么定义的寄存器变量就会变成普通的自动变量 |