C语言(static和extern)

                     Hi~!这里是奋斗的小羊,很荣幸各位能阅读我的文章,诚请评论指点,关注+收藏,欢迎欢迎~~     

                        💥个人主页:小羊在奋斗

                        💥所属专栏:C语言   

        本系列文章为个人学习笔记,在这里撰写成文一为巩固知识,二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣,望见谅。

        这一小节也是属于函数部分,如果与上篇文章写在一起篇幅过长,因此将本小节单独整理成一篇文章以便我们有更好的阅读体验。

                                一、static 和 extern

                                                1、static 修饰局部变量

                                                2、static 修饰全局变量

                                                3、static 修饰函数

一、static 和 extern

        static 和 extern 都是C语言中的关键字;

        static 是静态的意思,extern 是用来声明外部符号的;

        在学习 static 和 extern 之前,我们先来了解一下作用域和生命周期。

        1、作用域和生命周期

        作用域是程序设计概念,通常来说,一段程序代码中所有用到的名字并不总是有效(可用)的,而限定这个名字可用性的代码范围就是这个名字的作用域。

        (1)局部变量的作用域是变量所在的局部范围;

        (2)全局变量的作用是整个工程项目。

        我们先来通过示例理解一下(1):

        可以看到上面代码中第二个 printf()函数中的参数a是不可用的, 这是因为这个a不在我们创建的变量a的作用域内。

        再来看:

        当我们把变量a的创建放在小花括号外,这时我们创建的变量a的作用域就是整个主函数。 

 

        同样的,我们在主函数中定义的局部变量在其他自定义函数中也是不能用的。

        我们再来通过示例理解(2):

 

        相信通过上面的几个实验,我们已经能基本掌握上面的两句话。 

        再来说一下生命周期

        生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

        (1)局部变量的生命周期是:进入作用域变量创建,生命周期开始,出作用域变量销毁,生命周期结束。

        (2)全局变量的生命周期是:整个程序的生命周期。

        2、static 修饰局部变量

        我们来看下面两个代码有什么不同:

        可以看到在我们给创建 j 变量前加了一个 static 之后,打印的结果发生了变化,通过这个例子我们来猜测 static 的作用。 

        在没加 static 之前,我们在主函数中四次调用 print ()函数,每次进入 print ()函数时都会重新初始化一次变量 j ,因此每次 j++ 前 j 的值都为0,所以打印出了四个1;加上 static 之后,第一次进入 print()函数时初始化 j 为0,j++为1后打印,print()函数完成,第二次执行 print()函数后打印了2。

        我们来倒推一下,此时 j 为2,所以 j++之前 j 的值应该还是1,我们可以猜一下在第二次进入 print()函数的时候是不是就不执行初始化 j 这一条代码了,那么 j++之前 j 还是上次出 print()函数时 j 的值也就是1,j++后 j 为2再打印,以此类推。

        按照上面我们的猜测好像说的通,事实上我们已经大致猜出了 static 的作用。在第二次进入 print()函数时,确实不执行 static 修饰的这一条代码。

        总结:(1)static 修饰的局部变量在进入作用域前就存在,出作用域也不销毁,而且用的是上次留下来的值。

                   (2)编译器在编译代码的时候,就为静态变量(即 static 修饰的变量)分配了地址,而不是进入函数创建这种变量。

                   (3)static 修饰局部变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是一样的,生命周期就和程序的生命周期一样了,只有程序结束,变量才销毁,内存才回收。但是作用域是不变的

        关于局部变量和全局变量的存储我在这篇文章中有简单介绍过 —> 数据和变量

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

        3、static 修饰全局变量

        

        先来看上面的代码, 我们在 Add.c 文件中创建了一个全局变量a,如果我们想在 main.c 文件中使用这个a,因为全局变量默认是带有外部链接属性的,所以只需要用 extern 声明外部变量a即可使用。

        再来看:

        在我们使用 static 修饰全局变量a后, 在 main.c 文件中就不能正常使用了,为什么呢?

        总结:(1)static 修饰全局变量的时候,改变了全局变量的外部链接属性,使得外部链接属性变成了内部链接属性。

                (2)这种变量只能在自己所在的 .c 文件中使用,其他 .c 文件中无法使用。

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

        4、static 修饰函数

        

        上面的代码说明了一个问题,函数也是有外部链接属性的。 只要在其他的 .c 文件中正确声明,也是可以直接使用的。

        同样的,如果我们写的自定义函数不想被其他人使用,只要用 static 修饰函数即可。

        static 修饰函数,让函数的外部链接属性变成了内部链接属性,使得函数只能在自己所在的 .c 文件中使用,其他 .c 文件中无法使用。 

        其实 static 修饰函数和 static 修饰全局变量是一模一样的。

                                      点击跳转主页—> 💥个人主页小羊在奋斗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/2343.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【六十四】【算法分析与设计】699. 掉落的方块,离散化操作,线段树优化,区间查询sum+区间更新update

699. 掉落的方块 在二维平面上的 x 轴上,放置着一些方块。 给你一个二维整数数组 positions ,其中 positions[i] [left(i), sideLength(i)] 表示:第 i 个方块边长为 sideLength(i) ,其左侧边与 x 轴上坐标点 left(i) 对齐。 每个…

vuex数据永久存续

第一步下载 vuex 并创建store下js文件 第二步 npm install vuex-persistedstate 第三步 引用 vuex-persistedstate 配置 plugins 项 import createPersistedState from vuex-persistedstateplugins:[createPersistedState({//存储方式:localStorage\sessionStor…

【Linux】开关机命令和服务管理类命令

一般Linux是不会经常进行关机的,关机的正确流程是: sync->shutdown->reboot->poweroff sync: 将内存中的数据同步到硬盘中poweroff: 关闭系统,等同于shutdown -h nowreboot: 重启系统,等同于 shutdown -r nowshutdown[选项] [时间] shutdown命令常见用法: shutdown:…

Vue CLl中的 ref props mixin plugin scoped

ref 属性 ref 被用来给元素或子组件注册引用信息(id的替代者) 应用在 html 标签上获取的是真实 DOM元素 ,应用在组件标签上获取的是组件实例对象 vc。 1、如果给普通的dom元素使用,引用指向的是dom元素。 2、如果是给子组件使用,引用指向的…

Gbase数据库的强大审计日志功能-可以无缝记录所有sql脚本

Gbase数据库的强大审计日志功能 Gbase数据库是一个功能强大的数据库系统,其中的审计日志功能能够记录所有操作的SQL语句。通过开启审计日志,你可以详细跟踪数据库中发生的各种操作。下面我将介绍如何开启、关闭审计日志,并导出日志到文本文件…

Vue 3 中 Props 传值的完整指南

一、定义 Props 类型 首先,我们需要定义一个接口来描述我们的props类型。这通常在一个专门的类型声明文件中完成,例如types/index.ts: // types/index.ts export interface Parent {id: number;title: string; } export type ParentArray …

锂电池3.7V-4.2V降3.3V2.8V同步降压WT6015

锂电池3.7V-4.2V降3.3V2.8V同步降压WT6015 WT6015 是一款高效单片同步步降稳压器,采用恒定频率和电流模式架构。该设备提供可调节版本,适应不同的应用需求。在无负载条件下,其电源电流仅为40微安,而在关断状态下,电流…

类之间的关系

文章目录 一、横向关系复合(组合)委托(聚合)依赖关联 二、纵向关系(继承)继承下构造析构执行的顺序继承方法继承中的作用域多重继承 总结 一、横向关系 复合(组合) 包含与被包含黑色…

《AI聊天类工具之十一——​ MChat》

一.简介 官网:孟子生成式大模型(孟子 GPT) | 澜舟科技-业界领先的认知智能公司 MChat是一款简约的社交聊天软件,具有端到端安全加密的特性,确保用户信息的安全。它支持多种平台,包括Android、iPhone、iPad、iPod touch等,适用于个人和团队协作。在MChat上,用户可以单…

目标检测——YOLOv6算法解读

论文:YOLOv6: A Single-Stage Object Detection Framework for Industrial Applications (2022.9.7) 作者:Chuyi Li, Lulu Li, Hongliang Jiang, Kaiheng Weng, Yifei Geng, Liang Li, Zaidan Ke, Qingyuan Li, Meng Cheng, Weiqiang Nie, Yiduo Li, Bo …

1212332

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行&am…

HBase在大数据集群的安装部署及整合Phoenix

HBase 前提:需要保证三台虚拟机hadoop102-104已经部署好基本配置。未完成的可以参考:https://blog.csdn.net/weixin_73195042/article/details/135886619 安装 上传HBase安装包到/opt/software文件夹内 tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/m…

MybatisPlus笔记:无废话实践代码纯享版

条件构造器Wrapper 概述 我们在实际操作数据库的时候会涉及到很多的条件。所以MP为我们提供了一个功能强大的条件构造器 Wrapper 。使用它可以让我们非常方便的构造条件。 在其子类AbstractWrapper中提供了很多用于构造Where条件的方法。AbstractWrapper的子类QueryWrapper则…

手机号码携号转网查询API接口是什么

手机号码携号转网查询API接口又叫运营商携号转网查询API接口,是指通过手机号精准查询该号码转网前及转网后所归属运营商。运营商携号转网查询API接口多用于营销场景,如运营商业务办理、客户信息查询、携号转网、电话营销等,接下来我们聊一聊怎…

【技巧】Git 版本控制工具没有图标提示怎么办?

Git 版本控制工具在日常开发中使用率是非常高的,多数情况下会安装 TortoiseGit 之类的插件,让文件夹显示图标,方便观察文件的状态。但是有时装完插件之后发现,文件夹/文件并没有图标显示,可以按照以下思路进行排查&…

【计算机毕业设计】药品销售系统产品功能介绍——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

手把手教数据结构与算法:有序线性表设计

问题描述 设计一个有序线性表类,要求完成初始化,插入和遍历功能,使得表内元素实现有序排列(从小到大)。同时实现合并功能,使得两个线性表能够合并为一个线性表(可能存在重复元素)。…

使用nacos的好处

1. 使用docker 发布项目时,如果要修改配置文件就要重新打包发布比较麻烦,但用nacos远程配置后,不需要重新打包发布,就可以修改配置文件,减少了重新发布所消耗的时间,提高了效率。 2. Nacos支持集群部署&am…

【java】27:java绘图

坐标体系 - 介绍: 下图说明了Java坐标系。坐标原点位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点个像素;第二个是y坐标,表示当前位置为垂直方向…