【C语言】static关键字用法

目录

一、static修饰局部变量

二、static修饰全局变量

三、static修饰函数


一、static修饰局部变量

首先我们来看两段代码:

  • 代码1(不加static)

    #include <stdio.h>
    void test()
    {
    int i = 0;
    i++;
    printf("%d ", i);
    }
    int main()
    {
    int i = 0;
    for (i = 0; i < 5; i++)
    {
    test();
    }
    return 0;
    }

运行结果如下:

  • 代码2(加static)

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

运行结果如下:

对比以上两段代码,我们发现:

  • 代码1:运行结果分析可知,test函数的局部变量i在每次进入test函数的时候都会重新创建并赋值为0,出函数的时候销毁。
  • 代码2:运行结果可知,被static修饰过后的i,它的值是有累加效果的,在头一次进入test函数后,创建了i后,出函数是不会被销毁的。再次进入函数也不会重新创建变量,而是累积上次的数值继续计算。

出现结果2的原因:

  1. static修饰局部变量的时候,局部变量出了作用域是不会被销毁的。
  2. 不被销毁的原因是:static修饰的局部变量,本质上是改变了变量的存储位置。
  3. 存储位置的改变,实质上影响了变量的生命周期,生命周期变得跟程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。
  4. 但是变量i的作用域是不变的。

由上图可知:

  • 栈区的数据特点是:进作用域创建,出作用域销毁。
  • static修饰之后叫静态变量,静态变量是存放在静态区的,放在静态区的数据出了它的作用域不销毁,只有在整个程序结束的时候跟着一起销毁。
  • 一旦变量创建之后,在整个程序执行过程中,它是不会换位置的,不会重新开辟空间。只不过本来在栈区,static修饰就在静态区。

使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以使用static。

二、static修饰全局变量

全局变量的作用域是**整个工程,**它可以在另外源文件内部使用。

如下:

当用static修饰全局变量时,则会报错。如下:

出现错误的原因:

  1. 一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用,不能在其他源文件内使用。
  2. 本质原因是全局变量默认是具有外部链接属性的,在外部的文件中想使用,只要适当的声明就可以。
  3. 当static修饰全局变量时,外部链接属性就变成了内部链接属性,其他源文件(.c)即使声明了,也不能使用这个全局变量。
  4. 但是这个全局变量可以在自己的源文件中正常使用,比如在它自己的add.c文件就可正常使用。

使用建议:如果一个全局变量,只想在所在的源文件内部使用,不想被其他文件发现,就可以使用static修饰。

三、static修饰函数

我们先看一下下面两段代码

代码1(不加static)

该位置能够调用函数是因为:函数也默认具有外部链接属性,只要适当声明,就可以在整个工程都使用。

代码2(加static)

可以发现,当函数被static修饰之后,就发生了链接错误。

原因:

如果一个函数被static修饰,外部链接属性就变成了内部链接属性,其它源文件(.c)就不能再使用该函数,只能在自己所在的源文件内部使用。

使用建议:一个函数只想在所在的源文件内部使用,不想被其他源文件使用,就可以使用static来修饰。

相关推荐
CoovallyAIHub7 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
NAGNIP8 小时前
Serverless 架构下的大模型框架落地实践
算法·架构
moonlifesudo8 小时前
半开区间和开区间的两个二分模版
算法
moonlifesudo8 小时前
300:最长递增子序列
算法
CoovallyAIHub13 小时前
港大&字节重磅发布DanceGRPO:突破视觉生成RLHF瓶颈,多项任务性能提升超180%!
深度学习·算法·计算机视觉
CoovallyAIHub14 小时前
英伟达ViPE重磅发布!解决3D感知难题,SLAM+深度学习完美融合(附带数据集下载地址)
深度学习·算法·计算机视觉
聚客AI1 天前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v1 天前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工1 天前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农2 天前
【React用到的一些算法】游标和栈
算法·react.js