———————————–
测试环境:linux
开发语言:c
编译工具:gcc
———————————–
static
顾名思义是静态、静止的意思 个人理解的含义是私有、静态
私有就是隐藏->
1.static函数只能声明后的本文中调用
2.static全局变量只能声明后的本文中调用
3.static局部变量只能声明后的本函数调用
静态就是一直存在,相对于每次调用动态分配而言->
1.static函数(未验证是否每次调用代码地址都是一致的)
2.static全局变量生命周期到程序或进程结束;
3.static局部变量生命周期到程序或进程结束;
c语言中static可以用来修饰变量和函数,像以下例子:
1.修饰函数
#include <stdio.h>
static void FunFir(){ // static 修饰函数FunFir()
printf("print from static void FunFir!\n");
}
int main(){
FunFir();
}
2.修饰全局变量
#include <stdio.h>
static int num = 0; /* static 修饰全局变量num */
void FunFir(){
printf("print from FunFir %d \n", num);
num++;
printf("print from FunFir after ++ %d \n", num);
}
int main(){
num += 25;
printf("print from main %d \n", num);
FunFir();
printf("print from main after FunFir %d \n", num);
num -= 1;
printf("print from main after -1 %d \n", num);
}
3.修饰局部变量
#include <stdio.h>
void FunFir(){
static int num = 0; //static修饰局部变量num
printf("print from FunFir %d \n", num);
num++;
printf("print from FunFir after ++ %d \n", num);
}
int main(){
int i = 0;
for(;i<10;i++){
printf("print from main [%d] times\n", i);
FunFir();
}
}
其中对函数、全局变量的修饰强调私有性,就是说这个函数、变量只在这个文件中有效(从声明的地方到文件结束)
对局部变量的修饰是指这个变量在这段代码加载到内存到失效这段时间内它的值是不随函数调用结束而改变的
关于作用域
1.static函数
/* 代码文件开始 */
// ...
static void FunA() //----开始----
//... // |
int FunB(){ // |
//... // |
} //----结束----
// 从函数声明开始,到这段代码文件结束,都可以调用这个函数。
// 声明前、其他代码文件中不能调用该函数。
/* 代码文件结束 */
2.static全局变量
/* 代码段开始 */
static int num = 0; //-----开始------
void FunA(){ // |
//... // |
} // |
int FunB(){ // |
//... // |
} //-----结束------
// 从变量声明开始,到这段代码文件结束,都可以调用这个变量。
// 可以被重新初始化、赋值。
/* 代码段结束 */
3.static局部变量
/* 代码段开始 */
void FunA(){
static int num = 0; //-----开始------
//... // |
} //-----结束------
int FunB(){
//...
}
// 从变量声明开始,到该函数结束,都可以调用这个变量。
// 可以被重新初始化、赋值。
// 变量值保存在静态存储器,直到程序结束才会回收。
// 其他函数不能访问这个变量
/* 代码段结束 */
关于内存布局
- 全局静态变量
内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) - 局部静态变量
内存中的位置:静态存储区
初始化:未经初始化的局部静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
3Static修饰的函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件中可见,不能被其他文件所用。
总结
static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
1.static可以保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
2.static变量默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。