【C语言】static关键字

一.什么是static

static是 C/C++中的关键字之一,是常见的函数与变量(C++中还包括类)的修饰符,它常被用来控制变量的存储方式和作用范围。 在众多高级语言中都有其作为关键字或函数出现。

二.static的作用

static修饰的对象:

1.局部变量

2.全局变量

3.函数

static修饰符的五条作用:

1️⃣:在函数中声明变量时, static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态。
2️⃣:在声明变量时,变量具有静态持续时间,并且除非您指定另一个值。
3️⃣ :在全局和/或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,即外部文件无法引用该变量或函数。
4️⃣:static 关键字 没有赋值时,默认赋值为 0 

5️⃣:static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。

在下面会结合具体案例分析。

1.static修饰的局部变量

static关键字修饰局部变量不改变作用域,但是生命周期变长。

下面基于案例分析static对局部变量作用1️⃣5️⃣

1️⃣:在函数中声明变量时, static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态。

5️⃣:static修饰局部变量时,会改变局部变量的存储位置,从而使得局部变量的生命周期变长。

原代码:

#include <stdio.h>
#include <stdlib.h>
void test()
{
    int x = 0;
	x++;
	printf("%d ", x);
}
int main()
{
    int i = 0;
	printf("%d\n", i);
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

输出:1 1 1 1 1 1 1 1 1 1

接着我们用上static关键字来修饰  test()函数中的局部变量 x:

#include <stdio.h>
#include <stdlib.h>
void test()
{
    static int x = 0;
	x++;
	printf("%d ", x);
}
int main()
{
    int i = 0;
	while (i < 10)
	{
		test();
		i++;
	}
	return 0;
}

结果:

1 2 3 4 5 6 7 8 9 10

原因:  

static修饰了局部变量x,令局部变量x变成静态的,且只能初始化一次,使得每次test()函数结束时局部变量x都不销毁,再次进入test()函数时则保留原有数值运行,因此x++数值越来越大

总结:

本质上,static关键字修饰局部变量,改变了局部变量的存储位置,因为存储位置的差异,使得执行效果不一样。普通的局部变量放在栈区,这种局部变量进入作用域创建,出作用域释放。局部变量被static修饰后成为静态局部变量,这种变量放在静态区,创建好后,直到程序结束后才释放。

(同时静态变量存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0x00。所以静态变量无需手动初始化。默认为0)

2.static修饰的全局变量与函数

全局变量用static修饰改变了作用域,没有改变生存周期

下面基于案例分析static对全局变量和函数的作用3️⃣

3️⃣ :在全局和/或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,即外部文件无法引用该变量或函数。

补充:

1. 首先说一下全局变量,全局变量的作用域十分的广,只要在一个源文件中定义后,这个程序中的所有源文件、对象以及函数都可以调用,生命周期更是贯穿整个程序。文件中的全局变量想要被另一个文件使用时就需要进行外部声明(以下用extern关键字进行声明)。-----也即是说全局变量既可以在源文件中使用,也可以在其他文件中使用(只需要使用extern外部链接以下即可)

2. static修饰全局变量和函数时,会改变全局变量和函数的链接属性-------变为只能在内部链接,从而使得全局变量的作用域变小。

test.c

test2.c

运行结果:

下面在全局变量和函数之前用 static进行修饰

会发现生成错误,无法解析外部符号a和PrintfHello()等,全局变量a和PrintfHello()不能被test.c文件调用了。所以我们可以很容易看出static修饰后让全局变量a和PrintfHello()的作用域变小了,令全局变量a和PrintfHello()无法被其他文件调用。

总结:

作用:

1. 全局变量和函数本身是具有外部链接属性的,在Hello.c文件中定义的全局变量和函数,在test.c文件中可以通过【链接】来使用;

2. 但如果全局变量被static修饰,那这个外部链接属性就会被修改成内部链接属性此时这个全局变量就只能在自己的源文件中使用;

作用应用:

   如果加了 static,就会对其它源文件隐藏。例如在 a 和 printHello 的定义前加上 static,main.c 就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。static 可以修饰函数和变量,将其对其他源文件隐藏起来,从而避免命名冲突。对于函数来讲,static 的作用仅限于该隐藏功能



3.在模块化编程中的应用

  • 在 C 语言的模块化编程中,static关键字发挥着重要作用。一个大型程序可能会由多个源文件(.c文件)和头文件(.h文件)组成。通过使用static关键字,可以将模块内部的变量和函数封装起来,使得模块的接口更加清晰。
  • 例如,一个简单的数学计算模块可能包含一些内部辅助函数,这些函数只在模块内部用于计算过程,不需要被其他模块访问。可以将这些函数声明为static,将内部变量也声明为static,这样就可以有效地隐藏模块的内部实现细节,提高程序的可维护性和可扩展性

最后:

static的作用可以总结为最基本的两条:

1️⃣.改变了生命周期;就是一个变量、函数从分配内存去表示到回收内存的过程
2️⃣.改变了作用域;就是可以在哪些文件里可以使用该函数

原文链接:https://blog.csdn.net/weixin_45031801/article/details/134215425

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值