C语言/什么是static/C语言关键字static是什么/static修饰局部变量/static修饰全局变量/static修饰函数/static的作用

本文详细探讨了C语言中static关键字如何影响局部变量的生存周期、全局变量的外部调用限制以及函数的跨文件调用。通过实例揭示了static修饰的内存位置变化和其对代码行为的影响。

static是C语言中的关键字,它的作用大致分为3种:

  1. 修饰局部变量
  2. 修饰全局变量
  3. 修饰函数

1.修饰局部变量

例如:

当局部变量a未被static修饰时,

void test();

int main()
{
	int i;
	for (i = 0;i < 10;i++)
	{
		test();
		
	}
	return 0;
}

void test()
{
	int a = 0;
	a++;
	printf("%d", a);
}

输出结果为:1111111111

而当a被static修饰以后,

void test();

int main()
{
	int i;
	for (i = 0;i < 10;i++)
	{
		test();
		
	}
	return 0;
}

void test()
{
	static int a = 0;
	a++;
	printf("%d", a);
}

输出结果为:12345678910

原因是当static修饰局部变量a之前,变量a在每次进入test函数之前都会重新赋值,test函数执行完后变量a被自动销毁,下一次循环又重新赋值,所以每次打印的结果都为1;而当变量被static修饰以后,变量a第一次进入test赋值以后,执行完test函数之后不会销毁,所以下一次循环进入test函数时a的值为上一次test执行的结果。

本质原因:用以下表格表示内存空间:

内存区域存储内容
栈区局部变量
函数的参数
堆区动态内存分配
……
静态区全局变量
static修饰的局部变量

当static修饰局部变量之后,局部变量由之前的存放在栈区变为存放在静态区,生命周期与全局变量的生命周期相同。

2.static修饰的全局变量

​C语言常量与变量在这篇文章中说过,如若要使用同一工程中其他源文件中的全局变量,需用关键字exten声明,即可调用。但如若该被调用的全局变量被static关键字修饰了,则无法进行调用。例如在第一个源文件中,定义全局变量a,但此时全局变量被static修饰:

#inclue <stdio.h>

static int a=100;

int main()
{
    printf("%d",a);
    return 0;
}

 当在第二个源文件调用时:

#include <stdio.h>

int main()
{
    extern int a;
    printf("%d",a);
    return 0;
}

 此时会报错无法执行,原因是全局变量a被static修饰之后只能在本身所在的源文件中使用,本质原因是外部链接属性被static修饰之后变为内部链接属性。

3.static修饰函数

函数与全局变量一样,在跨源文件调用时,也需要用extern函数提前声明,例如:

在第一个源文件中定义函数:

void Add(int x,int y)
{
    printf("%d",x+y);
}

在第二个源文件中调用Add函数,需要预先声明:

extern void Add(int,int)

int main()
{
	int a = 1, b = 2;
	Add(a, b);
}

但是当函数在第一个源文件中被static修饰以后,该函数只能在第一个源文件中使用,在第二个源文件中无法调用。

static void Add(int x,int y)
{
    printf("%d",x+y);
}

 此时若在第二个源文件中调用,程序无法执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值