一、引言
C语言中数据存储的方式有多种,我们平时大多数时间默认使用的为auto型的存储方式。但当我们需要提高程序的模块化特性时,ststic就成为了我们一个不错的选择。
接下来,我们将来探讨一下static关键字的一些特性。
二、static的几个特性
1、默认初始化为"0"
由于static修饰的变量存储在静态数据区,所以对于static修饰的数据,其默认值都为0。免去了初始化为0的步骤。
int main(int argc, char *argv[]) { static int a; printf("a = %d\n", a); return 0; }
2、延长变量的生命周期
以下面代码为例:
/*=============================================================== * Copyright (C) 2022 All rights reserved. * * 文件名称:static1.c * 创 建 者:QiuCC * 创建日期:2022年08月19日 * 描 述: * * 更新日志: * ================================================================*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <strings.h> #define N 100 int add() { int a = 10; int b = 20; printf("a = %d\n", a); printf("b = %d\n", b); a--; b--; return a + b; } int main(int argc, char *argv[]) { int sum1 = add(); printf("sum1 = %d\n\n", sum1); int sum2 = add(); printf("sum2 = %d\n", sum2); return 0; }
从上述结果可以看出,a和b在第一次调用时虽然执行了减一的操作,但是,当函数结束时,a和b的资源释放,当第二次调用的时候,函数重新申请资源,所以再次打印,a和b的值依旧没变。
下面我们在a和b前加上static再次运行:
/*=============================================================== * Copyright (C) 2022 All rights reserved. * * 文件名称:static1.c * 创 建 者:QiuCC * 创建日期:2022年08月19日 * 描 述: * * 更新日志: * ================================================================*/ #include <stdio.h> #include <string.h> #include <stdlib.h> #include <strings.h> #define N 100 int add() { static int a = 10; static int b = 20; printf("a = %d\n", a); printf("b = %d\n", b); a--; b--; return a + b; } int main(int argc, char *argv[]) { int sum1 = add(); printf("sum1 = %d\n\n", sum1); int sum2 = add(); printf("sum2 = %d\n", sum2); return 0; }
此时我们发现,加上static之后,a和b与没有加static的结果相比,数值减了1。从上述结果就可表现出static存储方式可以让变量的生命周期延长到程序结束运行为止。
3、限制作用域
static修饰的变量只允许在本文件内部使用,以下代码为例
文件add.c
char str[N] = "hello"; int addr() { int a = 1, b = 2; return a + b; }
文件main.c
int main(int argc, char *argv[]) { extern char str[N]; puts(str); extern int addr(); int num = addr(); printf("num = %d\n", num); return 0; }
运行结果:
从上述结果来看,在不同文件中同时编译使用extern进行外部声明时是可以调用其它文件内部函数的。
我们加上static来限制add.c内部的函数
文件add.c
static char str[N] = "hello"; static int addr() { int a = 1, b = 2; return a + b; }
文件main.c
int main(int argc, char *argv[]) { extern char str[N]; puts(str); extern int addr(); int num = addr(); printf("num = %d\n", num); return 0; }
运行结果:
以上结果显示,我们在add.c文件内部定义变量或者函数时,其它文件内部将无法通过extern进行add.c文件内部的函数或者变量的调用。
好的,以上就是今天的内容啦!!!
欢迎大家参考、指正!!!