存储方式其实就是如何在内存中存放我们的程序,这对于理解程序的运行机制是十分重要的。
1、从变量的作用域来分:变量分为局部变量和全局变量;如果从生存期(存储方式决定)来分,变量分为静态存储方式和动态存储方式。
2、考虑一下程序运行时期都要在内存中保存那些内容,首先程序是由一系列的指令序列组成,必须划分出一段内存空间来保存指令代码,程序运行过程中,有一些数据是一直需要的,即我们需要保存他们改变之后的值,所以也要划分出一段存储空间来保存这些一直都需要的数据,当然对于函数中的局部变量,由于他们的存在时间很短,我们通常也需要专门划分出一块空间来保存他们,以便在函数执行完之后释放他们所占用的空间。这些空间都是操作系统自动申请或释放的,在程序运行期间,也允许我们自己随意申请空间,自己去决定何时释放,对于这些内存也需要和之前的内存区域区分开来, 我们分别称上面四种情况所使用的内存为代码区,全局区(静态区),堆栈区,堆区。
3、静态变量和全局变量的区别:如果从生存期来看的话,他们是一样的,但由于他们定义的地方不同,也就导致了他们表面上的作用范围是不同的。不过我还是建议从内存的角度把他们理解为一样的就好。
4、C语言允许在定义变量时给定变量的存世方式,比如:auto,static,register,extern
其中auto 是自动的,也是编译器默认的,
static 就是静态存储(或叫全局存储)需要说明的是全局变量只会初始化一次,跟我们所看到的顺序执行流程有所不同(实际上是编译器把它给移动了)。另外static的作用有两点,1、函数内部声明的变量只能在函数内部使用,2、函数外声明的外部变量则只能在本文件中使用,不可以再用extern声明使用。
register寄存器存储,实际这只是我们的一种建议,因为寄存器的个数有限,我们不可能把全部的变量都保存为寄存器存储,不过用在关键的地方也可以提高很大效率的。
extern 外部全局变量的声明,也就是我们在引用其他源文件中定义的全局变量时,先进行声明,另外在定义之前使用的也需要外部声明,这一点跟函数声明一样。声明时,可以不写数据的类型,但如果是指针类型,需要加上*。
extern引发错误只会发生在连接阶段。
5、如果定义变量的时候给定存储类型,那么可以不写数据类型,编译器默认用字长来分配空间,也就是32位级就分配4个字节。通过观察VC6.0中的反汇编,可以发现,静态变量是在程序载入时就已进行了空间分配和初始化,并且每次分配的地址相同(逻辑地址),而auto变量则是在进入函数时才开始分配空间,并且每次分配的空间都是不同的。
6、内部函数和外部函数:
只能在本文件中使用的函数成为内部函数,可以在其他文件中使用的函数成为外部函数。
和变量类似,内部函数也只需要用static 修饰即可。eg: static void fun(void){},对应的外部函数就是用extern修饰的,编译器会默认添加extern 关键字。