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://xiahunao.cn/news/2980074.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车

Midjourney是什么 OpenAI发布的ChatGPT4引领了聊天机器人的竞争浪潮,随后谷歌推出了自己的AI聊天机器人Bard,紧接着微软推出了Bing Chat,百度也推出了文心一言,这些聊天机器人的推出,标志着对话式AI技术已经达到了一个…

TCP相关问题总结

文章目录 TCP连接建立过程1. TCP三次握手2. TCP四次挥手3. TCP为什么是三次握手4. TCP为什么是四次挥手 TCP流量控制TCP拥塞控制1. 为什么需要拥塞控制2. 控制手段 TCP连接建立过程中出现丢包 TCP连接建立过程 1. TCP三次握手 首先client端发出连接请求,并且请求同…

RAG:智能图书馆员引领AI的知识之旅

想象一下,你是一个法官,面对一个复杂的案件,你需要查阅大量的法律文献来找到相关的案例和法律条文。在AI的世界里,也有一个类似的“法官”——大型语言模型(LLMs)。它们能够回答各种问题,但有时…

【大模型系列】预训练

数据 数据预处理 预处理流程: 原始语料库—>质量过滤(语种过滤、统计过滤、关键词过滤、分类器过滤)—>敏感内容过滤(有毒内容、隐私内容PII)—>数据去重(句子级别、文档级别、数据集级别&#…

文件读取和写入

1、with open 和 open close 的对比 with open 的优点 1、自动关闭文件:with 语句会在代码块执行完毕后自动关闭文件,无需显式调用 close() 方法。 2、异常安全:如果在代码块中发生异常,with 语句仍然会确保文件被正确关闭。 3、…

2024大连化工展|中国(大连)国际化工产业展览会

2024大连化工展|中国(大连)国际化工产业展览会 时间:2024年7月24-26日 地点:大连世界博览广场 大会主题:共谋新发展 共创新机遇 大连作为东北地区最具活力和发展潜力的城市,同时也是我国重要的化工产业基…

上网行为管理软件怎么选 三款好用的上网行为管理软件

上网行为管理软件怎么选 三款好用的上网行为管理软件 一款优秀的上网行为管理软件可以满足企业的多种需求,帮助企业有效监督员工的行为,提升工作效率和企业效益,但是这些软件差异较大,选择的时候需要考虑这些因素。 1、明确需求 …

(2024)Visual Studio的介绍、安装与使用

Visual Studio介绍 1.Visual Studio是什么? Visual Studio是微软公司推出的一款开发工具包系列产品,它是一个基本完整的开发工具集,为软件开发者提供了整个软件生命周期中所需的大部分工具。 2.Visual Studio的定义 Visual Studio是美国微软公…

kerberos:介绍

文章目录 一、介绍二、kerberos框架1、名词解释2、框架 三、优缺点四、其他认证机制1、SSL2、OAuth3、LDAP 一、介绍 Kerberos是一种计算机网络授权协议,主要用于在非安全网络环境中对个人通信进行安全的身份认证。这个协议由麻省理工学院(MIT&#xff…

C语言 | Leetcode C语言题解之第40题组合总和II

题目: 题解: int** ans; int* ansColumnSizes; int ansSize;int* sequence; int sequenceSize;int** freq; int freqSize;void dfs(int pos, int rest) {if (rest 0) {int* tmp malloc(sizeof(int) * sequenceSize);memcpy(tmp, sequence, sizeof(int…

【QT学习】9.绘图,三种贴图,贴图的转换,不规则贴图(透明泡泡)

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统,可以使用相同的 API 在屏幕和绘图设备上进行绘制,它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作,其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

Jmeter04:关联

1 Jmeter组件:关联 概括:2个请求之间不是独立的,一个请求响应的结果是作为另一个请求提交的数据,存在数据交互 1.1 是什么? 就是一个请求的结果是另一个请求提交的数据,二者不再是独立 1.2 为什么&#x…

docker容器内彻底移除iptables服务的实现方法

背景 我创建的容器使用的是centos6的标准镜像,所以内置了iptables服务。容器启动后iptables服务默认就启动了。iptables设置的规则默认是所有流量都无法通行。而对于服务器的管理使用的是宿主机的防火墙。这样就导致在实现用iptables动态给容器添加端口映射时不成功…

RocketMQ快速入门:group、topic、queue、tag等基本概念(四)

0. 引言 上一节,我们说明了rocketmq中的4个核心组成以及他们之间的工作关系。但其中穿插的topic, queue等概念,如果未接触过mq的同学可能会有些迷糊,所以本节,我们重点针对rocketmq中的基本概念进行讲解,之前学习过其…

中北大学软件学院操作系统实验二进程调度算法

实验时间 2024年 4 月13日14时至16时 学时数 2 1.实验名称 实验二进程调度算法 2.实验目的 (1)加深对进程的概念及进程调度算法的理解; (2)在了解和掌握进程调度算法的基础上,编制进程调度算法通用程序,将调试结果显示在计算机屏幕上&am…

第九章 进程和计划任务管理【☆】

一个进程可以创建多个子进程,子进程之间相互独立,速度较慢,但是互不影响。线程是共享资源,速度快,但一个线程崩掉其他线程同时崩掉。 一、查看进程信息 1. 查看静态的进程统计信息——ps命令 主要进程状态 R(runnin…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下:GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

BBS前后端混合项目--03

展示 static/bootstrp # bootstrap.min.css /*!* Bootstrap v3.4.1 (https://getbootstrap.com/)* Copyright 2011-2019 Twitter, Inc.* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)*//*! normalize.css v3.0.3 | MIT License | github.com/n…

OSPF大型实验

OSPF大型实验 实验拓扑图 实验思路 1、R4为ISP,其上只配置IP地址;R4与其他所直连设备间均使用公有IP; 2、R3-R5、R6、R7为MGRE环境,R3为中心站点; 3、整个OSPF环境IP基于172.16.0.0/16划分;除了R12有两…

2013-2021年各省经济韧性相关测度指标面板数据

2013-2021年各省经济韧性相关测度指标面板数据 1、时间:2013-2021年 2、指标:城镇化率 %、财政科学技术支出(亿元)、万人高等教育在校人数(万人)、财政教育支出(亿元)、第三产业占…