static和extern

简介: `static`和`extern`是C语言的关键字。`static`用于修饰局部变量、全局变量和函数,改变它们的生命周期和作用域。局部静态变量在函数结束后不会销毁,保持其值直到程序结束。全局静态变量限制为只在当前源文件可见,减少命名冲突。`extern`则用于声明外部已定义的符号,使得在其他文件中可以访问该全局变量或函数。总的来说,`static`和`extern`影响变量和函数的可见性和存储持续时间。

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


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



1.修饰局部变量


2.修饰全局变量


3.修饰函数


extern是用来声明外部符号的


作用域和生命周期


作用域


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


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


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


生命周期


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


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


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


 

结果为:



计算结果都为1是因为i是局部变量,进入函数创建,出函数就销毁



结果为:




出现该结果是因为static修饰了局部变量i




static修饰局部变量:


本质上影响了变量的存储类型,一个局部变量是存在栈区的,但是被static修饰后就存放在静态区了,因为存储类型的变化,生命周期跟着变化了,变长了


使用建议:


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


结论:


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


static修饰全局变量


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



static修饰全局变量:


1. 首先要知道全局变量是具有外部链接属性的


2.全局变量被static修饰后,外部链接属性就变成了内部链接属性,就是这个全局变量只能在自己所在的. c文件中使用,其他文件看不到。


相当于作用域变小了。


static修饰函数:


1. 函数也是具有外部链接属性


2.但是被static修饰后,外部链接属性就变成了内部链接属性,这个函数只能在自己所在的. c文件中使用其他文件中及时声明了,也不能使用。


如:



目录
相关文章
|
Windows 安全
远程桌面和云主机,可以听到云主机内部的声音
有些云主机用户,在使用云主机的时候想借助云主机的高带宽听音乐或者看视频的,那么如何设置远程桌面和云主机,可以听到云主机内部的声音?下面小编就来个图文教程,希望能帮助到这些客户使用云主机。   本地计算机需要进行的设置: 1、打开本地机器的远程登录功能,这里介绍一种快捷的方式。
2731 0
|
编译器 C语言
【C语言】深入理解EOF
【C语言】深入理解EOF
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
176 1
|
机器学习/深度学习 数据采集
详解Diffusion扩散模型:理论、架构与实现
【9月更文挑战第23天】扩散模型(Diffusion Models)是一类基于随机过程的深度学习模型,通过逐步加噪和去噪实现图像生成,在此领域表现优异。模型分正向扩散和反向生成两阶段:前者从真实数据加入噪声至完全噪音,后者则学习从噪声中恢复数据,经由反向过程逐步还原生成清晰图像。其主要架构采用U-net神经网络,实现过程中需数据预处理及高斯噪声添加等步骤,最终通过模型逆向扩散生成新数据,具有广泛应用前景。
1001 0
Python进阶语法之断言
Python进阶语法之断言
|
存储 JSON JavaScript
Python教程:一文了解Python中的json库
JSON(JavaScript Object Notation)是一种轻量级数据交换格式,易于人类阅读和编写,也易于计算机解析和生成。在Python中,JSON通常用于数据交换和存储,因为它与Python的字典和列表类型相似。
1307 2
|
Python
不常用但特别好用的字符串方法—.partitioin()和.translate()
不常用但特别好用的字符串方法—.partitioin()和.translate()
109 0
|
Shell Linux
Linux操作系统选择题之shell编程
Linux操作系统选择题之shell编程
210 0
|
Python
|
Python
Python解释raise关键字的作用。
Python解释raise关键字的作用。
1058 1