C语言中的关键字static和extern

news/2024/11/16 18:35:37/

Hello,亲爱的小伙伴们,我又来了,上一期作者菌讲解了C语言中函数的知识点,得到了很好的反馈,这里作者菌感谢每一个至此我的小伙伴!!今天作者菌又来补充一些很有用的知识,感兴趣的uu们不要吝啬手中的三连啊,感恩比心。

好,废话不多说,正式开始我们今天的学习。

一、static和extern 

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

static是静态的意思,可以用来:

1.修饰局部变量

2.修饰全局变量

3.修饰函数

extern是用来声明外部符号的。

在讲解static和extern之前在来讲解一下:作用域与生命周期

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

1. 局部变量的作⽤域是变量所在的局部范围。

2. 全局变量的作⽤域是整个⼯程(项⽬)

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

1. 局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束。

2. 全局变量的⽣命周期是:整个程序的⽣命周期

static修饰局部变量

//代码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 
#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的效果,理解 static 修饰局部变量的意义。

代码1的test函数中的局部变量i是每次进⼊test函数先创建变量(⽣命周期开始)并赋值为0,然后 ++,再打印,出函数的时候变量⽣命周期将要结束(释放内存)。

代码2中,我们从输出结果来看,i的值有累加的效果,其实test函数中的i创建好后,出函数的时候是 不会销毁的,重新进⼊函数也就不会重新创建变量,直接上次累积的数值继续计算。

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

使⽤建议:未来⼀个变量出了函数后,我们还想保留值,等下次进⼊函数继续使⽤,就可以使⽤static修饰。 

static修饰全局变量

代码1

 add.c

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

test.c

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

代码2

add.c 

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

test.c

 

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

代码1是能够正常运⾏的,但是代码2就出现了链接错误。

其实 static 修饰函数和 static 修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤, 被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了。 本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤。

使⽤建议:⼀个函数只想在所在的源⽂件内部使⽤,不想被其他源⽂件使⽤,就可以使⽤ static 修 饰。


http://www.ppmy.cn/news/1456076.html

相关文章

【Qt】按钮类控件

文章目录 1 :peach:Push Button:peach:2 :peach:Radio Buttion:peach:3 :peach:Check Box:peach:4 :peach:Tool Button:peach: 1 &#x1f351;Push Button&#x1f351; 使⽤ QPushButton 表⽰⼀个按钮&#xff0c;这也是当前我们最熟悉的⼀个控件了&#xff0c;QPushButton …

为什么 ChatGPT 不火了?

不火了是有原因的&#xff0c;下面我来从大部分人拿到 ChatGPT 之后的两大痛点开始讲起&#xff1a; 很多朋友拿到 ChatGPT 后的第一个痛点就是&#xff1a;用的不好 你经常会感觉到 ChatGPT 回答的好空&#xff0c;没有太多参考价值。 而第二个痛点则是&#xff1a;无处去用…

前端技术Stylus详解与引入

Stylus 是一种动态样式语言&#xff0c;它允许使用更少的代码来生成 CSS。它是一个预处理器&#xff0c;这意味着你需要在浏览器加载前将 Stylus 代码转换成 CSS。Stylus 提供了多种功能&#xff0c;如变量、混合&#xff08;mixins&#xff09;、函数、继承等&#xff0c;这些…

【强训笔记】day10

NO.1 思路&#xff1a;中心扩展。从i位置开始&#xff0c;从i-1为左边和i1右边进行移动&#xff0c;字符相等就继续移动&#xff0c;直到不等&#xff0c;更新回文串长度&#xff0c;让i为左边&#xff0c;i1右边再移动&#xff0c;同样字符相等就移动&#xff0c;不等就更新长…

组件通信-(父子组件通信)

目录 一、什么是组件通信 二、组件关系的分类 三、组件通信解决方案 四、父传子 五、子传父 一、什么是组件通信 组件通信&#xff0c;就是指组件与组件之间的数据传递。组件的数据是独立的&#xff0c;无法直接访问其他组件的数据。如果想使用其他组件的数据&#xff0c;…

鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案

官方概述 先看官方对事件的描述. 事件&#xff08;Event&#xff09;是一种任务间通信的机制&#xff0c;可用于任务间的同步。 多任务环境下&#xff0c;任务之间往往需要同步操作&#xff0c;一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 一对多同步模型…

#04 构建您的第一个神经网络:PyTorch入门指南

文章目录 前言理论基础神经网络层的组成前向传播与反向传播 神经网络设计步骤1&#xff1a;准备数据集步骤2&#xff1a;构建模型步骤3&#xff1a;定义损失函数和优化器步骤4&#xff1a;训练模型步骤5&#xff1a;评估模型结论 前言 在过去的几天里&#xff0c;我们深入了解了…

2024年第七届可再生能源与环境工程国际会议(REEE 2024)即将召开!

2024年第七届可再生能源与环境工程国际会议&#xff08;REEE 2024&#xff09;将于2024 年8月28-30日在法国南特举行。共绘绿色未来&#xff0c;全球同频共振&#xff01;REEE 2024将汇聚全球可再生能源与环境工程领域的专家学者和业界精英&#xff0c;共同探讨行业发展的前沿技…