企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
#### 变量存储类别 #### C语言**根据变量的生存周期**来划分,可以分为**静态存储方式和动态存储方式。** **静态存储方式:**是指**在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量**。 **动态存储方式**:是指**在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。** C语言中**存储类别**又分为四类:**自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。** * 1、**用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式**。如: ![](http://img.mukewang.com/54995b8c0001df9003570077.jpg) **自动变量就是存储在栈中的变量,这些变量一般在块中定义,当执行时,系统自动为这些变量分配内存,当块结束时,系统自动回收这些变量占用的内存,因此叫做自动变量。** **函数的形式函数,函数块中点故意的变量,复合语句块中定义的变量,都是自动变量** * 2、**用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量**。**如下为静态局部变量:** ![](http://img.mukewang.com/54995d1e0001a1bc04020299.jpg) **注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。** > **静态变量是指存储在静态区的变量,这些变量从定义开始就占用着内存,直到程序结束,因此它的内存地址固定不变,静态变量可以局部定义,这样的变量叫做静态局部变量;静态变量可以在全局定义,这样的变量叫做静态全局变量。** **静态局部变量** **静态局部变量和局部变量的区别:局部变量不会一直占据着内存,当函数结束时,局部变量所占用的内存就会被释放,但是静态局部变量会一直占据着内存,直到程序结束,因此当程序调用结束后,局部变量的值有可能被其他值所覆盖,而静态局部变量的值仍然保存着,并作为下次调用该函数时该静态局部变量的初始化值,静态局部变量第一次初始化的值并不是一直不变,再次调用该函数,初始化值为上一次程序结束时,函数返回的静态局部变量的值。** #include <stdio.h> void show() { static int x=4; printf("%d\n",x); x++; } int main() { show(); show(); return 0; } **假如不给静态局部变量赋一个初值,那么编译时自动赋初值为0.** #include <stdio.h> int add(int n) { static int x=1;//因为每次要保存相乘的结果,所以要用到静态局部变量x, x=x*n; return x; } int main() { int i,n; printf("请输入一个整数:"); scanf("%d",&n); for(i=1;i<=10;i++) printf("%d的%d次幂为:%d\n",n,i,add(n)); return 0; } > 上述程序为何不用全局变量来实现,因为全局变量作用域较大,会带来一些隐患,如容易造成名字污染,而且全局变量的值也容易被修改,因此尽量避免使用全局变量。 **静态全局变量** #include <stdio.h> static int x; int main() { printf("%d",x); return 0; } **静态全局变量与全局变量区别:** **静态全局变量的作用域仅局限于他所处的文件中,其他的文件即使使用extern声明也不能访问它;全局变量的作用域是整个工程,在工程的一个文件内定义的全局变量,在该工程的另一个文件中,通过extern声明,就可以使用全局变量。全局变量与静态全局变量的存储区域相同,都是存储在静态区。** * 3、**为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”**,用**关键字register作声明**。例如: ![](http://img.mukewang.com/54995ed300014b2a03570078.jpg) **注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。** #include<stdio.h> int main() { register int i,sum=0;//寄存器变量保存在寄存器中,节省了从内存读到寄存器的郭志诚,因此循环提速不少 for(i=1;i<=100;i++) { sum=sum+i; } printf("%d",sum); return 0; } **寄存器是CPU的一部分,是一个有限容量的高速存储部件,可用来暂存指令、数据和地址。寄存器的读取速度很快,一般用它来给CPU传输数据,想内存或硬盘等的外部存储器里的数据都是先读到寄存器再送给CPU的,而寄存器变量则直接进入寄存器;由于寄存器容量有限,因此不能将一直占用内存的变量定义为寄存器变量;现在的编译系统都很智能,因此基本不用关键字register来声明寄存器变量;寄存器变量不在内存中,所以不能取地址符来取它的地址。** * 4、**用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量**。如: ![](http://img.mukewang.com/5499605c0001a4a204210141.jpg) > **关键字extern来暗示其后的变量是在当前文件的后面或其他文件中定义的,告诉编译器,该变量将稍候定义或者在其他文件中定义,编译器将根据该变量的类型,从当前文件后面或者其他文件中找到该变量。** 1.c文件中的代码 #include <stdio.h> extern int x; int main() { printf("%d",x); return 0; } 2.c文件中的代码 ``` int x=4; ```