局部变量使用static修饰
- 局部变量被static修饰后,我们称为静态局部变量
- 对应静态局部变量在声明时未赋初值,编译器也会把它初始化为0
- 静态局部变量存储于进程的静态存储区(全局性质),只会被初始化一次,即使函数返回,它的值也会保持不变
void fn_static(void) {
static int n = 10; //静态局部变量, 放在静态存储区,全局性质空间
printf("\nstatic n=%d\n", n); // 10
n++; // n = 11
printf("\nn++=%d\n", n); // 11
}
int main(void) {
/* fn();
printf("--------------------\n");*/
fn_static();
printf("--------------------\n");
/* fn();
printf("--------------------\n");*/
fn_static();//只初始化一次,所以n++会输出12
}
第二次调用fn_static()函数,不会再将n初始化为10,因为只能初始化一次,所以最后的结果是12
void fn(void) {
int n = 10; //普通变量, 每次执行都会初始化,n 在栈区
printf("n=%d\n", n);
n++;
printf("n++=%d\n", n);
}
void fn_static(void) {
static int n = 10; //静态局部变量, 放在静态存储区,全局性质空间
printf("\nstatic n=%d\n", n); // 10
n++; // n = 11
printf("\nn = %d\n", n); // 11
}
int main(void) {
fn();
printf("--------------------\n");
fn_static();
printf("--------------------\n");
fn();
printf("--------------------\n");
fn_static();//只初始化一次,所以n++会输出12
getchar();
return 0;
}
n=10
n++=11
——————–static n=10
n = 11
——————–
n=10
n++=11
——————–static n=11
n = 12
全局变量使用static修饰
- 普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。之后,其他文件不能再定义一个与其相同名字的变量了,静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响
- 定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用
函数使用static修饰
- 函数的返回方式与全局变量类似,在函数的返回类型前加上static,就是静态函数
- 非静态函数可以在另一个文件中通过extern引用
- 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
- 不同的文件可以使用相同名字的静态函数,互不影响
int num = 10;//普通全局变量
static int num2 = 20;//静态全局变量,只能在本文件中使用,而不能在其他文件使用
#include <stdio.h>
void fun1(void) {//普通函数(非静态函数)
printf("hello from fun1.\n");
}
static void fun2(void) {//静态函数, 它只能在本文件中使用
printf("hello from fun2.\n");
}
#include<stdio.h>
//在一个文件中,使用另一个文件的全局变量,使用extern引用即可
extern int num;
//extern int num2;
int num2 = 60;
extern void fun1(void);
void main() {
printf("file02文件中num的值为%d\n", num);
printf("file02文件中num2的值为%d\n", num2);
fun1();
getchar();
}
值得注意的是extern int num2编译过程中会出错,static修饰的静态变量只能在当前文件中使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/83265.html