c语言学习笔记(static)

static(静态关键字) 修饰变量和函数

静态局部变量:当函数第一次被调用时,函数中的静态局部变量被初始化,再次调用这个函数,这个static变量也不会再次被初始化,仍是保存的前一次函数调用时的结果(作用域不变,生存期改变)

什么意思呢?

void fun()
{
	int a = 0;
	int b = 0;
	a += 1;
	b += 1;
	printf("a = %d b = %d\n", a, b);
}
int main()
{
	int n = 5;
	for (int i = 0; i < n; i++)
	{
		fun();
	}
	return 0;
}

输出结果为:

在加上static后

void fun()
{
	int a = 0;
	static int b = 0;  //加了static
	a += 1;
	b += 1;
	printf("a = %d b = %d\n", a, b);
}
int main()
{
	int n = 5;
	for (int i = 0; i < n; i++)
	{
		fun();
	}
	return 0;
}

 输出结果为:

为什么会这样呢?

从主函数执行时,不会把栈全部分给主函数,而是把栈的一部分给主函数,这一部分空间大小就称为栈帧

i < n时,会调动fun函数,给fun函数也分配栈帧,当打印完a,b后又会回到主函数,给fun函数分配的栈帧会回收,a,b就相当于还给系统了

重新循环,调用fun函数,又会分配栈帧,然后重复这样

当函数被调用时,给形参分配空间,在栈区分配空间,而函数的代码在代码区,并不在栈区,而加static后 

调用fun函数时,给a开辟空间,而static存放在数据区。因此b的值不会消失,而只在函数第一次调用时初始化

当程序被加载,代码放在代码区,全局变量会放到数据区,当函数被调用,给函数在栈区分配空间,调用完,空间回收,而当整个程序结束后,代码区、数据区、堆区、栈区统统消失。

因此加了static后,生存期变长而作用域不变

对于static的全局变量,当未给初始值时,默认为0

在c语言中无法把变量给静态局部变量

static int b = x;  // 在这里编译不通过

void fun (static int x)

形参最好不要修饰为static

在创建时给值为初始化,而在定义后给值叫赋值

static对于全局变量或函数

全局变量:static 说明的全局变量只可以在当前c程序中使用(作用域受到限制,生存期不变)

函数:static说明的函数只可以在当前c程序文件中使用(作用域受到限制,生存期不变)

如果全局变量加了static,那么这个全局变量只能在本文件中使用,而不能在其他文件中使用

//test.c文件中
int g_max = 10;  //还在.data区
void Print()
{
	int x = 100;
	g_max += 10;
	printf("Print :: g_max %d\n", g_max);
}
//hello.c文件中
extern int g_max;
extern void Print();
int main()
{
	int a = g_max;
	Print();
	return 0;
}

上面函数中加了静态关键字后,下面的文件中就不能引用g_max了

static void fun()

用static修饰fun函数,使fun函数只在该文件中使用,但生存期没有变,仍然在.data区

但如果加上const 也会导致全局变量只能在本文件中使用

const int max = 100;

如果你想让这个常变量在其他文件中使用,要加上extern

extern const int max = 100;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值