当前位置: 首页 > news >正文

C语言基础-静态变量(static)

在C语言中,static关键字有多种用途,主要与变量的存储期(lifetime)和可见性(visibility)有关。以下是static在C语言中的主要用途:

  1. 局部静态变量

    • 在函数内部定义的局部静态变量,它的存储期是整个程序的执行期间,而不是仅仅在函数被调用时。这意味着,即使函数执行结束,该变量的值也不会丢失,它会在下次函数调用时保持其值。
    • 局部静态变量只在其定义的函数内部可见。
    • 局部静态变量常用于需要在函数调用之间保持状态的场景,例如计数器或状态标志。
  2. 全局静态变量

    • 在函数外部定义的静态变量(即全局静态变量)具有文件作用域(file scope),而不是全局作用域(global scope)。这意味着,这个变量只在定义它的源文件内部可见,对其他源文件是不可见的。
    • 全局静态变量的存储期是整个程序的执行期间。
    • 全局静态变量常用于需要在多个函数之间共享数据,但又不想在其他源文件中暴露这个变量的场景。
  3. 静态函数

    • 当一个函数被声明为static时,它的可见性仅限于定义它的源文件。即使这个函数在头文件中有声明,其他源文件也不能链接到这个函数。
    • 静态函数通常用于只在特定源文件中使用的辅助函数,或者用于避免命名冲突(例如,当多个源文件都包含具有相同名称的函数时)。
  4. 静态局部变量在循环中的用途

    • 虽然不常见,但在某些情况下,可以使用静态局部变量在循环中保存状态。例如,你可以使用静态局部变量来跟踪循环的迭代次数,或者保存上一次迭代中的某些信息。
  5. 防止重复初始化

    • 当一个静态变量在函数内部被初始化时,这个初始化只会在程序开始时发生一次。后续的函数调用不会重新初始化这个变量。
  6. 内存管理

    • 由于静态变量的存储期是整个程序的执行期间,它们不会被频繁地创建和销毁,这有助于减少内存分配和释放的开销。
  7. 线程安全

    • 在多线程环境中,每个线程都有自己的静态局部变量副本,因此它们是线程安全的。但是,请注意,这并不意味着静态变量本身总是线程安全的;如果多个线程访问和修改同一个全局静态变量,则可能会出现问题。
  8. 代码优化

    • 由于静态变量的存储期长且可见性有限,编译器可能能够对其进行更优化的处理,例如将其存储在寄存器中或进行内联优化。但是,这种优化通常是自动的,并且可能因编译器和平台而异。

在C语言中,你可以在函数内部声明一个局部静态变量,通过在变量声明前加上static关键字来实现。局部静态变量在函数第一次被调用时初始化,并且其值在函数调用之间保持不变。即使函数返回,局部静态变量的值也不会丢失,下次函数调用时它仍然保持上次的值。

下面是一个简单的示例,展示了如何在C语言中声明局部静态变量:

#include <stdio.h>  void count_calls() {  static int call_count = 0; // 声明一个局部静态变量  call_count++;  printf("This function has been called %d times.\n", call_count);  
}  int main() {  count_calls(); // 输出:This function has been called 1 times.  count_calls(); // 输出:This function has been called 2 times.  return 0;  
}

在这个例子中,count_calls函数有一个局部静态变量call_count,它在函数第一次被调用时初始化为0。每次调用count_calls函数时,call_count的值都会递增,并输出到目前为止函数被调用的次数。由于call_count是静态的,它在函数调用之间保持了其值。

相关文章:

  • 在win10中自动删除文件夹中特定的文件
  • 算法训练营第三十六天 | LeetCode 1005 K次取反后最大化的数组、LeetCode 134 加油站
  • 影响Oracle数据库打开速度的因素
  • 【go从入门到精通】精通并发编程-使用扇入扇出提升多个通道之间传递数据的效率
  • 【三数之和】python,排序+双指针
  • MySQL 视图(1)
  • 10、SpringBoot 源码分析 - 自动配置深度分析三
  • Git系列:git init 深入理解及其使用技巧
  • vmware 安装系统提示无法启用3D加速的解决
  • Linux基础 -- perf工具使用及加载符号表
  • c语言:利用随机函数产生20个[120, 834] 之间互不相等的随机数, 并利用选择排序法将其从小到大排序后输出(每行输出5个)
  • 基于双向长短期记忆 Bi-LSTM 对消费者投诉进行多类分类
  • RS8751XF功能和参数介绍及PDF资料
  • springboot webservice接口一个配置文件配置两个接口路径
  • GBase 8s 检查是否是IP且转数值函数
  • 4个实用的微服务测试策略
  • Android单元测试 - 几个重要问题
  • CSS中外联样式表代表的含义
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Git初体验
  • IOS评论框不贴底(ios12新bug)
  • Javascript Math对象和Date对象常用方法详解
  • jquery cookie
  • js数组之filter
  • Less 日常用法
  • Mysql数据库的条件查询语句
  • MySQL主从复制读写分离及奇怪的问题
  • nginx 负载服务器优化
  • Unix命令
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • yii2中session跨域名的问题
  • 产品三维模型在线预览
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • # Panda3d 碰撞检测系统介绍
  • #laravel 通过手动安装依赖PHPExcel#
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • $ git push -u origin master 推送到远程库出错
  • $.each()与$(selector).each()
  • ${factoryList }后面有空格不影响
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)windows配置JDK环境
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (五)c52学习之旅-静态数码管
  • (一)appium-desktop定位元素原理
  • (一)u-boot-nand.bin的下载
  • (一)VirtualBox安装增强功能