Static声明该类型属于静态类型不允许外部文件访问,如果是在一个函数内部声明一个静态变量则说明该变量只能在函数内部使用,其他函数不能调用。
C语言可以通过static来实现私有化,面向对象不是一种语言而是一种思想。
Extern声明表示该变量或者函数可以被其他文件调用。
Static void getnum();
Int temp()
{
getnum()
}
void getnum()
{
}
则外部不能直接调用getnum函数,因为该函数已经声明了为静态全局函数,只有通过函数temp来进行间接访问,好处,方便多文件编程的管理,调用者不用去关心函数内部如何实现只需要调用函数接口就行。
1:静态局部变量的管理方式和控制机制
静态局部变量的实现原理是名称粉碎,在编译时将定义的静态局部变量改为其他名字,修改后的名字信息包含了其作用域,变量类型等信息。
void function(int );
int a=255;
void main()
{
function(a);
}
void function(int num)
{
int address;
static int test=num;
address=(int)&test;
printf("test的值%d\n",test);
printf("test的地址%p\n",address);
}
把OBj拖进winhex
_?test@?1??function@@YAXH@Z@4HA————test变量嵌套在function函数中,嵌套一层
静态局部变量只允许初始化一次是在编译器层面来说的,我们可以通过下标访问的方法去随意修改它的值。如下图所示
第二次通过下标修改后的值
静态局部变量存放区还是在全局变量区,只是其作用域不同,其生命期跟随进程。
变量类型 | 生命周期 | 作用域 | 存储地方 |
全局变量 | 从进程开始到进程结束 | 进程作用域 | 数据区 |
全局静态变量 | 从进程开始到文件结束 | 文件作用域 | 数据区 |
局部静态变量 | 从定义开始到进程结束 | 局部作用域 | 数据区 |
局部变量 | 从定义开始到函数结束 | 局部作用域,块作用域 | 栈 |
寄存器变量 | 用完就收回 | 随机 | 寄存器 |