目录
在C语言中:
static是用来修饰变量和函数的
- 修饰局部变量 -- 称为静态局部变量
- 修饰全局变量 -- 称为静态全局变量
- 修饰函数 -- 称为静态函数
修饰局部变量
代码1(无static修饰)---- 输出结果为10个1
#include<stdio.h>
void test() {
int i = 0;
i++;
printf("%d", i);
}
int main() {
int i = 0;
for (i = 0; i < 10; i++) {
test();
}
return 0;
}
代码2(有static修饰)---- 输出结果为12345678910
#include<stdio.h>
void test() {
static int i = 0; //static修饰局部变量
i++;
printf("%d", i);
}
int main() {
int i = 0;
for (i = 0; i < 10; i++) {
test();
}
return 0;
}
结论:
- 普通的局部变量是放在内存的栈区上的,进入局部范围,变量创建,除了局部范围变量销毁。
- 当static修饰局部变量时,局部变量是在静态区开辟空间的,这时局部变量出了作用域,变量不销毁,下次进去作用域使用的是上一次遗留的数据,改变了存储位置(由栈区到静态区),使得变量的生命周期发生了变化。
修饰全局变量
代码1 (无static修饰)
//分别建立两个源文件
//add.c 源文件1
int g_val = 2022;
//test.c 源文件2
extern int g_val //声明外部符号
int main() {
printf("%d\n", g_val);
return 0;
}
代码2 (有static修饰)
//分别建立两个源文件
//add.c 源文件1
static int g_val = 2022;
//test.c 源文件2
extern int g_val //声明外部符号
int main() {
printf("%d\n", g_val);
return 0;
}
代码1正常,代码2在编译时会出现连接性错误。
结论:
- 全局变量是具有外部链接属性的,如果全局变量被static修饰,外部链接属性就变成了内部链接属性,其他源文件就无法通过链接找到这个符号。
修饰函数
代码1(无static修饰)
//建立两个源文件
//Add.c 源文件1
int Add1(int x, int y) {
return x + y;
}
//test.c 源文件2
extern int Add1(int, int); //声明外部符号
int main() {
printf("%d\n", Add1(2, 3));
return 0;
}
代码2(有static修饰)
//建立两个源文件
//Add.c 源文件1
static int Add1(int x, int y) {
return x + y;
}
//test.c 源文件2
extern int Add1(int, int); //声明外部符号
int main() {
printf("%d\n", Add1(2, 3));
return 0;
}
代码1正常,代码2在编译时候会出现连接性错误
结论:
- 函数具有外部链接属性,其他源文件想使用函数,需要正确的声明就可以。
- 但被static修饰,外部链接属性就变成了内部链接属性,这个时候函数只能在自己所在的.c文件内部使用,不能在外部使用。