我也要学C语言-第十一章:自动变量,静态变量和寄存器变量
一:自动变量,静态变量和寄存器变量的定义:
根据变量存储位置不同,变量还可以分为自动变量,静态变量和寄存器变量自动变量:局部没有经过任何修饰的局部变量叫自动变量 (它存在于动态数据区——栈),这个区域内的数据随着程序的运行动态的生成和释放,函数返回就释放,函数要调用就生成。关键字:默认是atuo(一般不写).
自动变量的特点:当程序执行到自动变量的作用域的时候就分配,不是到了声明代码才分配哦!到了代码分配就晚啦!当定义自动变量的函数执行结束后,程序将释放该自动变量的存储空间,留给其他自动变量使用。事例:
#include <stdio.h>void add(int n){ auto int s = 0; s = s + 1; printf("No.%d: s=%d ", n, s);}void main(){ int i = 1; for(i; i<4; i++) { add(i); }}
输出为:
No.1: s=1
No.2: s=1
No.3: s=1从这个例子不难看出,自动变量的初始值在每次分配存储空间后都要重新赋值。
静态变量:静态变量其实也存在于数据区和全局变量是一样的。但是静态变量在编译器级别有所限制(编译器对于静态变量的访问做了限制(对内存空间的限制有两种级别,一种是编译器级别,这种访问限制其实是编译器在做语法检查;第二种情况是操作系统级别,这种情况,要是你强制访问,操作系统可能会蓝屏或者报警告错误!))。调试证明:
这个证明:静态变量其实也存在于数据区和全局变量是一样的.
再看这个例子:
这里为什么会编译错误呢!显示x没有定义。这当然大家都知道,但是为什么呢?!同样是数据区的东西为什么访问不了!我们再来看下下面的代码:
这里可以看到。0x88888888和0x12312312明明就是在一块的,为什么就不能访问呢。原因看下面的图(注意:下面是打开的.obj文件,也就是链接之前的那个文件):
我们把这些信息用注释的方式写到代码里看起来要好些:
我们从这里可以清楚的看到,静态变量被重新命名了,所以造成了无法访问的问题。注意看重命名的规则,它集成了它所在的函数信息,变量和函数绑定了。有一定的规则!不过这个在编译器内部规定,不同编译器的规则是不一样的。只要知道静态变量的原理即可。
静态变量生存周期:和全局变量一样,从可执行文件被加载到程序结束(它出生比main函数早,死亡比main函数晚)。
局部静态变量:它的存储区还是在数据区。
全局静态变量无法夸文件,也是编译器级别的控制。
静态变量的作用:实现私有。
寄存器变量:我觉得这个可以不用说了,因为我通过调试和实践发现寄存器变量分明就是鸡肋!不用管它!
补充:软件开发 , C语言 ,