C 语言中 static 的作用

12 篇文章 0 订阅
8 篇文章 3 订阅

一、引言

        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文件内部的函数或者变量的调用。

好的,以上就是今天的内容啦!!!

欢迎大家参考、指正!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玖尾猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值