首先static作用有下:
1.延长局部变量的生命周期,
----从最近的{}结束延长到整个程序结束
#include <stdio.h>
void s1(){
int a = 1;
a++;
printf("a = %d\n", a);
}
void s2(){
//static 修饰的局部变量不存储在栈区 而是存储在 bss段 和 data段
//main函数执行之前就已经创建好了 并不是执行到这一行才创建
static int a = 10;//即使多次调用函数 也不会每次都给x赋值
a++;
printf("a = %d\n", a);
}
int main(int argc, const char *argv[]){
s1();//11
s1();//11
s1();//11
printf("------------------\n");
s2();//11
s2();//12
s2();//13
//a = 100; //错误的 static修饰的局部变量虽然生命周期被延长了
//但是作用域还是最近的{} 出了作用域就不能访问了
return 0;
}
2.限制作用域:static修饰的变量只能在当前文件中访问
通过做题又发现一个特点:
下述程序第二次的输出结果为( b )。
int main(void)
{
extern int a;
int b=0;
static int c;
a+=3;
other();
b+=3;
other();
}
int a=5;
other()
{
int b=3;
static int c=2;
a+=5; b+=5; c+=5;
printf("%d,%d,%d\n",a,b,c);
c=b;
}
A 13,0,13
B 18,8,13
C 13,8,13
D 18,8,0
这里两个函数中得static所定义得c虽然都延长了生命,但是不同所创建的c却不是同一个
验证如下:
#include<stdio.h>
void other(){
static int c=2;
printf("%p,%d\n",&c,c);
}
int main(int argc, const char *argv[])
{
other();
static int c;
printf("%p,%d\n",&c,c);
return 0;
}
结果:
0x55854f904010,2
0x55854f904018,0