一.什么是static
static是 C/C++中的关键字之一,是常见的函数与变量(C++中还包括类)的修饰符,它常被用来控制变量的存储方式和作用范围。 在众多高级语言中都有其作为关键字或函数出现。
二.static的作用
static修饰的对象:
1.局部变量
2.全局变量
3.函数
static修饰符的五条作用:
1️⃣:在函数中声明变量时, static 关键字指定变量只初始化一次,并在之后调用该函数时保留其状态。
2️⃣:在声明变量时,变量具有静态持续时间,并且除非您指定另一个值。
3️⃣ :在全局和/或命名空间范围 (在单个文件范围内声明变量或函数时) static 关键字指定变量或函数为内部链接,即外部文件无法引用该变量或函数。
4️⃣:static 关键字 没有赋值时,默认赋值为 05️⃣: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