C语言中变量的存储类别
文章目录
新学期跟着导师去学以前没修的linux 课程,发现以前学过的C语言中有些并不清楚,所以借此机会回顾一下。
C语言中每一个变量和属性有两个属性:数据类型与数据的存储类别。存储类别是指数据在内存中的存储的方式。即静态存储方式与动态存储方式。具体又包括:auto(自动的)、静态的(static)、寄存器的(register)。外部的(extern)。
按照变量值存在的时间可以分成 静态存储方式和动态存储方式。
静态存储方式是在程序运行期间分配固定的存储空间的方式,而动态存储刚好是是在程序运行期间根据需要进行动态的分配存储空间的方式。
内存中供用户使用的存储空间可以分成三部分:程序区、静态存储区、动态存储区。数据分别放在静态存储区与动态存储区。
静态存储方式
- 全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态的进行分配和释放。
动态存储方式
- 在动态存储区中存放:1. 函数形参 2 自动变量(未加static声明的局部变量)3.函数调用时的现成保护和返回地址。对于这些数据,函数调用开始时分配动态存储空间,函数结束时释放这些空间。
自动变量auto
- 不加static声明的函数中的局部变量。 auto int a= 3;
static 声明局部变量
- 静态局部变量: 函数中的局部变量在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次该函数调用时,该变量已经有值,就是上一次函数调用结束时的值。
- 静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序的整个运行期间都不释放。自动变量属于动态存储类别,占动态存储空间,函数调用结束后释放。
- 对静态局部变量是在编译时赋初始值的,即只赋初始值一次,在程序执行时它已经有初值。
如在定义局部变量时不赋初值的话,对于静态局部变量来说,编译时自动赋初始值为0 或者空字符(对于字符变量),而对于自动变量,若是不赋初始值则它的值是个不确定的值。
int fac(int n){ static int f=1; f = f*n; return f; } main(){ int i; for(i=1;i<=5;i++){ printf("%d! = %d\n",i,fac(i)) } }
用extern 声明外部变量
- 外部变量(即全局变量)是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。
- 在一个文件中声明外部变量:
- 如果某个函数想在变量定义之前使用该外部变量,应该先使用关键字extern对该变量进行声明 :extern A;
- 在多个文件的程序中声明外部变量:
- 如果一个程序包含两个文件,在两个文件中都要用到同一个外部变量Num,不能分别在两个文件中各自定义一个外部变量 Num,否则会在程序进行连接时出现“重复定义”的错误。
- 出现上面的情况,应该在其中一个文件进行定义,在另一个文件中使用extern对Num进行 外部变量声明。
用static 声明外部变量
- 某些外部变量只限于在本文件中使用,而不能被其他文件使用,这时可以在定义外部变量时加一个 static声明。
声明与是定义
- 进行空间分配的声明是定义,而不需要进行空间分配的声明是声明。