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:…

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

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

类之间的关系

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

目标检测——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…

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

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

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

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

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

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

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

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

【java】27:java绘图

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

HTML使用jQuery实现两个点击按钮,分别控制改文本字体颜色和字体大小

jQuery 简介 jQuery 是一个广泛使用的 JavaScript 库&#xff0c;旨在简化对 HTML 文档的操作、事件处理、动画效果和 AJAX 等操作。 案例源码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name&q…

毕业撒花 流感服务小程序的设计与实现

目录 1.1 总体页面设计 1.1.1 用户首页 1.1.2 新闻页面 1.1.3 我的页面 1.1.5 管理员登陆页面 1.1.6 管理员首页 1.2 用户模块 1.2.1 体检预约功能 1.2.2 体检报告功能 1.2.4 流感数据可视化功能 1.2.5 知识科普功能 1.2.6 疾病判断功能 1.2.7 出示个人就诊码功能 …

【笔试强训】day9

1.添加逗号 思路&#xff1a; 没思路 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> #include<algorithm> using namespace std;int main() {string a;cin >> a;string ans;int p 1;for (int i a.si…

J8 inceptionv1

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 卷积神经网络大家族中有很多经典的网络&#xff0c;前面已经学习resnet,densenet相关网络&#xff0c;今天学习一种更久远的一种网络GoogLenet 网络结构…

【Java--数据结构】模拟实现ArrayList

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 LIst 顺序表ArrayList 顺序表优点 IList接口 ArrayList中定义要操作的数组 在MyArrayList中 重写接口方法 新增元素 在指定位置插入元素 pos不合法异常 判断和查找元素…

二维码相册怎么做?图片转换为二维码的方法

二维码现在可以用来承载大量的内容&#xff0c;通过扫描二维码即可通过扫描设备获取信息。图片生成二维码之后&#xff0c;用户可以在不保存图片直接扫码来查看图片&#xff0c;这种方式可以有效的提高图片的安全性&#xff0c;防止图片信息泄露。 怎么用二维码来作为相册展现…

STM32F401RCT6电子元器件芯片LQFP64 32位微控制器MCU单片机

STM32F401RCT6微控制器具有丰富的外设接口和较高的处理能力&#xff0c;适用于多种嵌入式应用。以下是一些典型的STM32F401RCT6应用案例&#xff1a; 1. 机器人控制&#xff1a;STM32F401RCT6可以用于制作自动导航机器人、遥控机器人等&#xff0c;负责处理传感器数据、控制电…