[深度解剖C语言] --关键字 static

2023-10-28

static ---最名不副实的关键字

目录

1.static修饰全局变量

2.static修饰函数

3.static修饰局部变量


static的作用:

1.static修饰全局变量

我们创建两个源文件,一个test.c,一个main.c

现在我们在test.c文件下定义一个全局变量

int g_val = 100;

我们在main.c下进行调用打印g_val我们能访问到g_val吗?

答案是可以的

如果给g_val加上static修饰我们还能再main.c下访问到吗?

static int g_val = 100;

这时候答案是不行的!

 因此我们得到了static的第一个结论

结论1:static修饰全局变量,该变量只在本文件内被访问,不能在其他文件被直接访问。

2.static修饰函数

 我们在test.c文件下写一个show()函数,请问在main.c文件能调用吗?

 

 答案是可以的。

那这时候给show()函数加上static,main.c下还能调用该函数吗?

 

 

答案是不可以的!因此我们可以得到第二个结论

结论2:static修饰函数,该函数只能在本文件内被访问,不能被其他文件访问,但是可以通过嵌套的方式调用,变相的封装的表现。

但是我们可以通过函数嵌套调用的方式调用show函数。

什么意思呢?就是在show函数的相同文件内创建一个新的函数,调用show函数,我们再在main.c文件下调用这个新的函数,已达到调用show()函数的目的。 

例:我们创建一个show_helper函数,来调用static修饰的show函数,我们再在main.c文件内调用show_helper函数。

 

 结果:

通过嵌套的方式调用,变相的封装的表现。

因此static项目维护,可以提供安全保护。被static修饰,主要限制的是作用域。

3.static修饰局部变量

void fun()
{
	int i = 0;
	i++;
	printf("i = %d\n", i);
}

int main()
{
	for (int i = 0; i < 10; i++)
	{
		fun();
	}
}

你知道这段代码,它的运行结果是什么吗?

通过结果我们发现他打印了10个1,其中,i是局部变量,具有临时性,函数调用时开辟空间并初始化,函数结束释放空间。

那么如果我们static修饰局部变量,即给int i  = 0;前static所修饰,结果还会一样吗?

void fun()
{
	static int i = 0;
	i++;
	printf("i = %d\n", i);
}

int main()
{
	for (int i = 0; i < 10; i++)
	{
		fun();
	}
}

 答案当然是不一样的, 我们发现,结果变成了1-10。因此我们可以得到第三个结论。

分析:

结论3:static修饰局部变量,更改该局部变量的生命周期。

生命周期:将临时变量的生命周期变成全局变量的生命周期。

作用域不变:作用域仍然是代码块内。

总结:

static:

结论1:static修饰全局变量,该变量只在本文件内被访问,不能在其他文件被直接访问。

结论2:static修饰函数,该函数只能在本文件内被访问,不能被其他文件访问。但是可以通过嵌套的方式调用,变相的封装的表现。

结论3:static修饰局部变量,更改该局部变量的生命周期。
生命周期:将临时变量的生命周期 -- 全局变量的生命周期。
作用域不变:作用域仍然是在本代码块内。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[深度解剖C语言] --关键字 static 的相关文章

随机推荐

  • List接口及其实现类

    List接口 鉴于Java中数组用来存储数据的局限性 我们通常使用List替代数组 List集合类中元素有序 且可重复 集合中的每个元素都有其对应的顺序索引 List容器中的元素都对应一个整数型的序号记载其在容器中的位置 可以根据 序号存取
  • Linux无法连通外网情况下缺少依赖(CentOS7环境)

    在有外网的情况下 可以用yum很容易的完成服务及其相关依赖的安装 而由于客户要求 导致生产服务器上无法连通外网 于是在搭建生产环境的时候 由于外网不通 导致缺少依赖的问题频频出现 现将解决此类问题的方法归纳如下 直接下载 此方法适用于缺少单
  • GD32F103调试小记(二)之USART(接收中断、接收空闲中断+DMA、发送DMA)

    前言 上篇文章摸完了GD32F103调试小记 一 之ADC DMA 接下来摸下GD32的USART DMA 数据的搬运工 CPU的好助手 USART 一种串行通信协议 说白了就是让两根线按照一定的规律去切换高低电平 根据一个单位时间内高低电
  • Linux基础—系统结构介绍(一)

    一 系统结构由内核 shell 文件系统 应用程序一起组合而成的文件操作系统 它们使得用户可以运行程序 管理文件 资源调度 计算 1 Linux 内核由如下几部分组成 SCI 层系统调用接口 虚拟文件系统 内存管理 进程管理 设备驱动程序
  • Ubuntu下 Hyperledger Farbic 环境配置

    Hyperledger Farbic Hyperledger作为IBM旗下主推的区块链 是首个面向企业的开放区块链技术的重要探索 现阶段也推出了1 0稳定版本 虽然IBM也有相关的配置文档 并且完善度十分高 但是依旧有些坑点 配置目录 以下
  • 人脸检测算法YuNet再次提升,参数量降至54K

    我们的人脸检测项目libfacedetection是2015年创建的开源项目 算法模型为YuNet 已经持续维护8年至今 在GitHub上已经获得11 7K星 欢迎大家三连 使用 反馈和建议 2022 2023年我们对训练部分进行了大幅改进
  • 让安全动起来

    山石网科带你 分分钟拿下靶标 一 信息收集 信息收集是整个攻击流程当中最重要的一步 从 web 入手 首先需要收集子域名 可以通过枚举的方式收集子域名 例如经典的 layzer子域名挖掘机 另外还可以通过搜索引擎收集子域名 例如 fofa
  • js对数据进行加密(账户密码加密)@莫成尘

    先看代码 复制使用即可 这是一个比较常用的场景我们借助了 crypto es gt vue3 crypto es gt vue2 库 如您满意请给莫成尘点个star 将他封装为单独的js文件 import CryptoJS from cry
  • Fabric CA国密版本的一种替代方案--使用cryptogen工具增加新用户

    在Fabric超级账本中 如果我们想动态增加用户发行证书 一般会使用Fabric CA或者其它CA 然而在国密改造场景中 当前缺乏可用的开源的Fabric CA国密版本 因此 笔者研究了一下 发现了一种可不使用CA直接使用cryptogen
  • 7-2 交换最小值和最大值 (15分)

    7 2 交换最小值和最大值 15分 本题要求编写程序 先将输入的一系列整数中的最小值与第一个数交换 然后将最大值与最后一个数交换 最后输出交换后的序列 注意 题目保证最大和最小值都是唯一的 输入格式 输入在第一行中给出一个正整数N 10 第
  • Chapter5 --Clocks(时钟及虚拟时钟)

    文章目录 5 3 create clock 5 3 1 Specifying Clock Period 5 3 2 Identifying the Clock Source 5 3 3 Naming the Clock 5 3 4 Spec
  • 操作系统处理机调度及常见的调度算法

    处理机调度的层次 高级调度 高级调度又称为作业调度或长程调度 其主要功能是根据某种算法 把外存上处于后备队列中的那些作业调入内存 也就是说 它的调度对象是作业 中级调度 又称为中程调度 引入中程调度的目的是为了提高内存利用率和系统吞吐量 中
  • IDEA与IDEA(2020.1版本)的安装

    DEA简介 IDEA 全称 IntelliJ IDEA 是 Java 语言开发的集成环境 IntelliJ 在业界被公认为最好的 Java 开发工具之一 IDEA 是 JetBrains 公司的产品 这家公司总部位于捷克共和国的首都布拉格
  • elementUI中的el-date-picker日期月份时间选择器禁用

    1 时间选择器禁用 当开始时间已经选择时 结束时间不能小于开始时间 即禁用结束时间选择器中开始时间前 反之亦然 template内容
  • 【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)

    关键字 音频编码 管道模式 createEncoder 写在前面 在使用API6开发HarmonyOS应用时 如何将pcm源文件进行编码并写入文件 最后生成aac文件 本文直接附上主要代码开发步骤供大家参考 主要功能代码 import oh
  • 现阶段项目介绍及电脑网络/RFID/NFC概述

    现阶段项目介绍及电脑网络 RFID NFC概述 文章目录 现阶段项目介绍及电脑网络 RFID NFC概述 1 现阶段项目介绍和行业前景 2 RFID 1 RFID概述 2 应用 3 技术及性能参数 4 使用风险 3 NFC 1 概述 2 工
  • A*算法解八数码问题

    1 问题描述 1 1什么是八数码问题 八数码游戏包括一个33的棋盘 棋盘上摆放着8个数字的棋子 留下一个空位 与空位相邻的棋子可以滑动到空位中 游戏的目的是要达到一个特定的目标状态 标注的形式化如下 1 2 3 4 5 6 7 8 1 2问
  • [转]vue3中使用vueQuill富文本编辑器详细教程,图片上传-图片压缩

    vueQuill是支持vue3的富文本编辑器组件 使用简单方便 官方网址 https vueup github io vue quill 效果图 1 安装 在官网有详细的安装教程 npm或者yran下载 npm install vueup
  • k8s 以statefulset方式部署zookeeper集群

    k8s 以statefulset方式部署zookeeper集群 参考 k8s官网zookeeper集群的部署 数据挂着方式改成通过本地方式创建的pv https kubernetes io docs tutorials stateful a
  • [深度解剖C语言] --关键字 static

    static 最名不副实的关键字 目录 1 static修饰全局变量 2 static修饰函数 3 static修饰局部变量 static的作用 1 static修饰全局变量 我们创建两个源文件 一个test c 一个main c 现在我们