先上代码:
static int var1 = 10;
void staticTest(void);
void countMethod(void);
int main() {
@autoreleasepool {
staticTest();
}
}
void staticTest(void) {
countMethod();
countMethod();
extern int var1;
printf("%d\n",var1);
printf("%p\n",&var1);
}
void countMethod(void) {
static int var1 = 0;
var1++;
printf("%d\n",var1);
printf("%p\n",&var1);
}
输出结果:
1
0x102dce3c0
2
0x102dce3c0
10
0x102dce190
一、extern的作用
extern:引入全局变量,本文件中没有就从整个项目中引入,如果整个程序中都不存在,编译阶段将会报错。
重点:引入的是全局变量,而不是全局区的变量。全局区包括全局变量和静态变量。
例子:
代码中注释掉本段:
//static int var1 = 10;
运行以上代码将会报错:
extern
原因:
extern引入的是全局变量,而不是全局区的局部静态变量。
二、static修饰局部变量
static修饰局部变量的几个功能:
1.改变局部变量的生命周期,将局部变量从栈中存储到全局区,生命周期从函数/代码块执行完成后销毁延长到了:程序的开始到结束
2.不改变局部变量的作用域。
例子:
运行以上代码,前两次打印:
1
0x102dce3c0
2
0x102dce3c0
原因:
var1没有被销毁,存在整个程序的生命周期中。
三、static修饰全局变量
static修饰全局变量的几个功能:
1.不改变声明周期,全局变量的生命周期仍然是整个程序开始到结束;
2.改变了全局变量的作用域,由项目中任意文件都可以使用缩减成了只有在本文件中可以使用;
例子:
运行以上代码,最后一次打印:
10
0x102dce190
原因:
1.证明了两个var1虽然都是存储在全局区,但是却不是同一块内存,也就是说不是同一个变量;
2.extern引入的是全局变量,所以最后会打印10;
网友评论