打印
[MM32生态]

C语言 静态局部变量的作用机制,及用法

[复制链接]
4265|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
两只袜子|  楼主 | 2024-5-24 15:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
静态局部变量
在之前介绍C语言的局部变量和全局变量的时候说过,C语言的作用域的内容其实是很多的,当时只是介绍了一般变量的作用域,这一节将介绍一下静态局部变量的作用和用法。而什么是静态局部变量呢?

可以这样理解,C语言中,静态局部变量一般就是指通过static定义的局部变量,而局部变量则一般是在特定作用域内可以访问的变量,比如函数体内、if条件判断代码块内、循环体内等等。

静态局部变量定义语法
static type varName = value;

静态局部变量的初始化
第一,C语言中,静态局部变量如果没有显式初始化,那么编译器会自动为其初始化为0或与0相关的值,比如如果是空字符则为'\0'。

第二,从程序开始执行到结束,静态局部变量的初始化通常只有一次——这该怎么理解呢?这就要说说静态局部变量的作用机制了。

静态局部变量的作用机制
首先,C语言的静态局部变量的内存是分配在静态存储区,而不是像其它的一般的普通变量那样存储在栈上,静态存储区上的静态变量的内存空间在程序整个执行期间都不会被释放,比如普通局部变量在函数调用完之后栈上的空间就会释放,而静态变量则不会,该类型的变量会在程序执行开始完成空间的分配,并在结束的时候自动释放;

其次,C语言的静态局部变量只会被初始化一次,即便之后在程序执行期间被修改了(比如在循环之中被修改了),也仍然不会再次被初始化;

C语言静态局部变量通常情况下虽然会在程序执行期间一直存在,但其仍然是局部变量,其作用域一般仍然会被限制在局部范围内,但就像之前数组返回值的时候介绍的,可以通过返回指针的方式,引用静态局部变量的内存地址;

静态局部变量的一些用法
如果有实际编程开发的经验(不仅限于C语言),那么应该就可以通过静态局部变量的作用机制来联想到一些可能的用法,比如:统计某些程序被调用执行的次数、统计递归的深度等等。除此之外,因为C语言是高性能的编程语言,且静态局部变量只初始化一次,因此,通过静态局部变量可以高效地为一些较大的数组或结构体进行初始化。

静态局部变量实例代码
通过静态局部变量来设计返回数组的函数的用法,在之前的章节中已经介绍过了(可参考上面的链接),这里就不再赘述了,这里主要展示一下在for循环中,静态局部变量只初始化一次的作用(如果不是静态局部变量,那么每一次都将被初始化,那么每一次输出的值都将是0),实例代码如下:

#include "stdio.h"

int main() {
    for(int i=0; i<5; i++){
        static int j = 0;
        printf("%d\n",j);
        j += 2;
    }
   
    return 0;

}
代码编译运行后,得到输出:

0
2
4
6
8
免责声明:内容仅供参考,不保证正确性。

使用特权

评论回复
沙发
l1uyn9b| | 2024-8-21 13:01 | 只看该作者
在C语言中,静态局部变量是一种特殊的变量类型,它具有局部作用域,但与普通局部变量不同的是,静态局部变量的生命周期是整个程序的运行期间,而不是仅限于其声明所在的函数调用期间

使用特权

评论回复
板凳
tax2r6c| | 2024-8-21 14:10 | 只看该作者
静态局部变量仅在其声明所在的函数内部可见,超出该函数的作用域就无法访问

使用特权

评论回复
地板
y1n9an| | 2024-8-21 15:15 | 只看该作者
一般来说,静态局部变量的生命周期从程序启动开始,直到程序结束。这意味着即使函数调用结束,静态局部变量的值也会被保留,下次调用函数时,该变量会保持上次调用结束时的值

使用特权

评论回复
5
lamanius| | 2024-8-21 16:20 | 只看该作者
其实静态局部变量在首次进入其声明所在的函数时被初始化,且只初始化一次。如果未显式初始化,静态局部变量会被自动初始化为0(对于数值类型)或空(对于指针类型)

使用特权

评论回复
6
w2nme1ai7| | 2024-8-21 17:28 | 只看该作者
我知道的是静态局部变量常用于需要在函数调用之间保持状态的场景

使用特权

评论回复
7
d1ng2x| | 2024-8-21 18:30 | 只看该作者
由于静态局部变量的值在函数调用之间保持不变,可能会影响代码的可读性和可维护性。因此,应谨慎使用,并确保其用途清晰。

使用特权

评论回复
8
lix1yr| | 2024-8-22 09:12 | 只看该作者
其实通过合理使用静态局部变量,可以在C语言中实现一些复杂的状态管理和缓存机制,提高程序的效率和灵活性

使用特权

评论回复
9
g0d5xs| | 2024-8-22 10:22 | 只看该作者
静态的话是一段时间内这个数据是不会被改变的呗

使用特权

评论回复
10
liu96jp| | 2024-8-22 13:00 | 只看该作者
主要是这个值会被保留,其实我觉得不如全局变量好用

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2034

主题

7335

帖子

10

粉丝