19.《C语言》——【如何理解static和extern?】


🎇开场语

亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优秀的程序员。如果你有任何疑问或建议,请随时在评论区留言,让我们一起成长进步!现在,让我们开始这场知识之旅吧!


在这里插入图片描述

🕷️ 个人主页:FEN03
🕸️ 收入专栏:C语言


文章目录

  • 🎇开场语
  • 🎇文章前言
  • 🕸️作用域 和 生命周期
  • 🕸️1. extern
    • 🕷️1.1 extern
  • 🕸️2. static
    • 🕷️2.1 static 修饰局部变量
    • 🕷️2.2 static 修饰全局变量
    • 🕷️2.3 static 修饰函数
  • 🕸️结束语


🎇文章前言

staticextern 都是C语言中的关键字,对于这两个的理解和运用是如何的呢?本章就让我们来探讨吧▶️


🕸️作用域 和 生命周期


在此之前,我们需要大概先了解作用域和生命周期 ,有助于我们更好的了解后续!

  1. 作用域:是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
    1.1 局部变量的作用域是变量所在的局部范围。
    2.2 全局变量的作用域是整个工程。

  2. 生命周期: 指的是变量创建到变量的销毁之间的时间段
    2.1 局部变量的生命周期是:进入作用域变量创建,生命周期开始,出了作用域生命周期结束。
    2.2 全局变量的生命周期:整个程序的生命周期。


🕸️1. extern


🕷️1.1 extern


extern 是用来声明外部符号的,如果一个全局的符号在A文件中定义,在B文件中想要使用,就可以使用extern进行声明,然后使用。

在这里插入图片描述


🕸️2. static


  1. static是静态的意思,可以用来:
    1.1 修饰局部变量
    1.2 修饰全局变量
    1.3 修饰函数

🕷️2.1 static 修饰局部变量


为了更好的了解,我们看一段代码:

代码1:

//代码1
#include <stdio.h>
void test()
{int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 5; i++){test();}return 0;
}

代码2:

// 代码2
#include <stdio.h>
void test()
{//static修饰局部变量static int i = 0;i++;printf("%d ", i);
}
int main()
{int i = 0;for (i = 0; i < 5; i++){test();}return 0;
}

代码1和代码2的运行结果比较;

在这里插入图片描述

分析:

  1. 对比代码1和代码2的运行结果,可以看到代码2中static的修饰局部变量的意义。
    1.1 代码1中的test函数中的局部变量 i 是每一次进入test函数先创建,初始值为0,随后进行i++,输出 i 的值。但是,当再次进入函数执行代码,输出的值还是一样,这是因为,进入函数是生命周期的开始,出了函数,生命周期就结束了。
  2. 代码2中,变量 i 被static修饰,所以每一次执行test函数,i 的值都会被累计,这是因为static修饰局部变量,局部变量的生命周期被改变,只有当工程结束,生命周期才结束。

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

在这里插入图片描述


🕷️2.2 static 修饰全局变量


我们看代码:

这是在项目A中的代码:

int a = 100;

这是在项目B中的代码:

#include<stdio.h>
extern int a; 
int main()
{printf("%d\n", a); return 0; 
}

因为我们合理的声明,运行结果是没问题的:

在这里插入图片描述

但是如果项目A中的代码,经过static修饰,结果会是怎样❓

项目A中的代码,被static修饰

static int a = 100;

项目B中的代码:

#include<stdio.h>
extern int a; 
int main()
{printf("%d\n", a); return 0; 
}

运行结果是报错,提示无法解析外部连接符号

在这里插入图片描述

所以,当我们不想B项目使用A项目时,可以给A项目代码中使用static修饰,相当于上锁,这样B项目就不能够使用。


🕷️2.3 static 修饰函数


static修饰函数我们可以通过一段代码就能够理解:

这是项目A中的代码:

int Add(int x, int y)
{return x + y; 
}

这是项目B中的代码:

extern int Add(int, int); #include<stdio.h>
int main()
{int ret = Add(3, 5);  printf("%d\n", ret); return 0;
}

运行结果:

在这里插入图片描述

我们观察到,我们合理的声明,代码的运行是完全没问题,如果我们加上static会怎样?

项目A中的代码加上static :

static int Add(int x, int y)
{return x + y; 
}

项目B中的代码:

extern int Add(int, int); #include<stdio.h>
int main()
{int ret = Add(3, 5);  printf("%d\n", ret); return 0;
}

运行结果:

我们看到了A项目中的代码,被static修饰后,B项目是无法去使用的,所以得出结论,当使用函数时,A项目中的代码不想被B项目中的代码使用,可以使用static修饰。

在这里插入图片描述


🕸️结束语


非常感谢您花时间阅读我的博客,希望我的分享能为您带来收获。如果您对本文有任何想法或疑问,欢迎在评论区留言交流。如果您喜欢我的博客,请继续关注,我会定期更新更多精彩内容。最后,别忘了行动起来的力量,让我们一起实践这些方法,见证自己的成长和进步!

再见,祝您生活愉快! 🌹

在这里插入图片描述


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

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

相关文章

PyTorch Tensor进阶操作指南(二):深度学习中的关键技巧

本文主要讲tensor的裁剪、索引、降维和增维 Tensor与numpy互转、Tensor运算等&#xff0c;请看这篇文章 目录 9.1、首先看torch.squeeze()函数&#xff1a; 示例9.1&#xff1a;&#xff08;基本的使用&#xff09; 小技巧1&#xff1a;如何看维数 示例9.2&#xff1a;&a…

全球海洋平均质量变化的时间序海洋、冰和水文等效水高数据集

Tellus Level-4 Antarctica Mass Anomaly Time Series from JPL GRACE/GRACE-FO Mascon CRI Filtered Release 06.1 version 03 从 JPL GRACE/GRACE-FO Mascon CRI 过滤发布的 Tellus Level-4 南极洲质量异常时间序列 06.1 版本 03 简介 该数据集是全球海洋平均质量变化的时…

水果品牌网站开展如何拓宽渠道

对大多数人来说&#xff0c;零售买水果只在乎是买什么水果、哪个产地、价格等因此&#xff0c;对品牌的依赖度相对较低。但对于水果品牌公司来说&#xff0c;货好仅是基本&#xff0c;还需要将品牌发展出去、能获取准属性客户和转化路径。 与零售不同&#xff0c;批发生意或是…

本末倒置!做660+880一定要避免出现这3种情况!

每年都有不少人做过660题&#xff0c;但是做过之后&#xff0c;并没有真正理解其中的题目&#xff0c;所以做过之后效果也不好&#xff01;再去做880题&#xff0c;做的也会比较吃力。 那该怎么办呢&#xff0c;不建议你继续做880题&#xff0c;先把660给吃透再说。 接下来给…

【01-02】Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…

计算神经网络中梯度的核心机制 - 反向传播(backpropagation)算法(1)

计算神经网络中梯度的核心机制 - 反向传播&#xff08;backpropagation&#xff09;算法&#xff08;1&#xff09; flyfish 链式法则在深度学习中的主要应用是在反向传播&#xff08;backpropagation&#xff09;算法中。 从简单的开始 &#xff0c;文本说的就是链式法则 R …

安卓应用开发学习:获取经纬度及地理位置描述信息

前段时间&#xff0c;我在学习鸿蒙应用开发的过程中&#xff0c;在鸿蒙系统的手机上实现了获取经纬度及地理位置描述信息&#xff08;鸿蒙应用开发学习&#xff1a;手机位置信息进阶&#xff0c;从经纬度数据获取地理位置描述信息&#xff09;。反而学习时间更长的安卓应用开发…

计算机视觉全系列实战教程 (十四):图像金字塔(高斯金字塔、拉普拉斯金字塔)

1.图像金字塔 (1)下采样 从G0 -> G1、G2、G3 step01&#xff1a;对图像Gi进行高斯核卷积操作&#xff08;高斯滤波&#xff09;step02&#xff1a;删除所有的偶数行和列 void cv::pyrDown(cv::Mat &imSrc, //输入图像cv::Mat &imDst, //下采样后的输出图像cv::Si…

第一节:如何开发第一个spring boot3.x项目(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;从今天开始&#xff0c;我会记录每篇我自学spring boot3.x的经验。只要我不偷懒&#xff0c;学完应该很快&#xff0c;哈哈&#xff0c;更新速度尽可能快&#xff0c;想和大佬们一块讨论&#xff0c;如果需要讨论的欢迎一起评论区留…

零基础开始学习鸿蒙开发-页面导航栏布局设计

1.设定初始页(Idex.ets) import {find} from ../pages/find import {home} from ../pages/home import {setting} from ../pages/setting Entry Component struct Index {private controller: TabsController new TabsController()State gridMargin: number 10State gridGut…

[图解]建模相关的基础知识-19

1 00:00:00,640 --> 00:00:04,900 前面讲了关系的这些范式 2 00:00:06,370 --> 00:00:11,570 对于我们建模思路来说&#xff0c;有什么样的作用 3 00:00:12,660 --> 00:00:15,230 我们建模的话&#xff0c;可以有两个思路 4 00:00:16,790 --> 00:00:20,600 一个…

项目实训-接口测试(十八)

项目实训-后端接口测试&#xff08;十八&#xff09; 文章目录 项目实训-后端接口测试&#xff08;十八&#xff09;1.概述2.测试对象3.测试一4.测试二 1.概述 本篇博客将记录我在后端接口测试中的工作。 2.测试对象 3.测试一 这段代码是一个单元测试方法&#xff0c;用于验证…

二叉树从根节点出发的所有路径

二叉树从根节点出发的所有路径 看上图中 二叉树结构 从根节点出发的所有路径 如下 6->4->2->1 6->4->2->3 6->4->5 6->8->7 6->8->9 逻辑思路&#xff1a; 按照先序遍历 加 回溯法 实现 代码如下 // 调用此方法&#xff0c;将根节点传递…

【Lua】第二篇:打印函数和注释

文章目录 一. 打印函数二. 注释方式1. 单行注释2. 多行注释 一. 打印函数 Lua 程序是以 .lua 结尾的文件&#xff0c;创建一个的 Test.lua 的文件&#xff0c;使用 print 函数输出字符串"Hello World"&#xff1a; print(Hello World) 保存之后使用命令lua 文件名编…

安卓开发自定义时间日期显示组件

安卓开发自定义时间日期显示组件 问题背景 实现时间和日期显示&#xff0c;左对齐和对齐两种效果&#xff0c;如下图所示&#xff1a; 问题分析 自定义view实现一般思路&#xff1a; &#xff08;1&#xff09;自定义一个View &#xff08;2&#xff09;编写values/attrs.…

如何用Go语言,实现基于宏系统的解释器?

目录 一、Go语言介绍二、什么是宏系统三、什么是解释器四、如何用Go语言实现一个基于宏系统的解释器&#xff1f; 一、Go语言介绍 Go语言&#xff0c;又称为Golang&#xff0c;是一种由谷歌公司开发并开源的编程语言。Go语言的设计目标是提高程序员的生产力&#xff0c;同时具…

Oracle、MySQL、PostGreSQL、SQL Server-空值

Oracle、MySQL、PostGreSQL、SQL Server-null value 最近几年数据库市场百花齐放&#xff0c;在做跨数据库迁移的数据库选型时&#xff0c;除了性能、稳定、安全、运维、功能、可扩展外&#xff0c;像开发中对于值的处理往往容易被人忽视&#xff0c; 之前写过一篇关于PG区别O…

2024年6月26日 (周三) 叶子游戏新闻

老板键工具来唤去: 它可以为常用程序自定义快捷键&#xff0c;实现一键唤起、一键隐藏的 Windows 工具&#xff0c;并且支持窗口动态绑定快捷键&#xff08;无需设置自动实现&#xff09;。 土豆录屏: 免费、无录制时长限制、无水印的录屏软件 《Granblue Fantasy Versus: Risi…

Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略实施系统

Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略实施系统 思科身份服务引擎 (ISE) - 下一代 NAC 解决方案 请访问原文链接&#xff1a;Cisco Identity Services Engine (ISE) 3.3 Patch 2 - 基于身份的网络访问控制和策略实施系统&#xf…

笔灵AI写作:释放创意,提升写作效率的秘诀

内容为王&#xff0c;在内容创作的世界中尤为重要。然而&#xff0c;面对写作时常常感到无从下手&#xff1a;有时缺乏灵感&#xff0c;有时难以表达清楚自己的想法。AI写作助手的出现&#xff0c;为这些问题提供了创新的解决方案&#xff0c;极大地改变了内容创作的过程。 今…