当前位置:网站首页>static的用法【详解】
static的用法【详解】
2022-04-22 07:50:00 【圣喵】

本期介绍
主要介绍:何为static,static修饰局部变量、全局变量、函数时会发生的变化,产生这些变化的本质原因是什么。。
目录
概述
Static,顾名思义是静态、静止的意思。在C语言中static是一个用来修饰变量与函数的关键字,被修饰对象的某些性质将发生根本性的改变,而这些变化从某种意义上又似乎契合了“静态”这一含义。那接下来就详细讲一讲static这个关键字的用法吧。
用法
static有三种不同的用法:1.修饰局部变量,2.修饰全局变量,3.修饰函数。下面就依次对每一种用法进行详细的解释和分析。
修饰局部变量
被static修饰的局部变量被称为:静态变量。现在有一段代码,尝试着去思考一下执行结果是什么:
#include<stdio.h>
void test()
{
int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
}
我们知道局部变量的生命周期就是其所在的那个局部范围,简单来说就是进这个范围变量就创建,出这个范围变量就销毁。从上面这个例子也可以很好的证实这句话,每次调用函数test,局部变量a就创建,调用结束就把a销毁,所以每次打印才会是2。但如果我用static修饰一下这里的变量a,结果会发生什么样的改变呢?
#include<stdio.h>
void test()
{
static int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int i = 0;
while (i < 10)
{
test();
i++;
}
return 0;
为什么会这样呢?可能有人会说:因为static修饰的变量在一个程序只会执行一次,之后就不会发生改变了。但我想问:这是为什么呢?本质上是因为static修饰的局部变量存储位置改变了,局部变量是存储在栈区内,而静态变量则是存储在静态区内。而这种改变带来的影响就是使得局部变量的生命周期变得和整个程序一样长,即:局部变量出了其作用域也将不会销毁,除非程序结束。值得注意的是虽然局部变量的声明周期得到了很大的提升,但他的作用域没有发生任何的改变,还是只能在那个局部的范围内使用。
内存大致上被划分为三个区域:栈区,堆区,静态区。这里只是简单的提一嘴,不会深讲。
修饰全局变量
我们知道全局变量在不同的源文件中是可以使用的,只不过需要先用extern外部声明一下。例如:
但如果用static给这个全局变量进行修饰将发生执行错误的结果:
报错的原因是:无法解析外部指令,出现这种现象的根本原因是:全局变量是具有外部链接属性的,而static修饰的全局变量的时候就把这个外部链接属性变成了内部链接属性。这就导致其他源文件不能使用该全局变量了。所以你才会感觉似乎全局变量的作用域变小了,但生命周期不变,仍是整个工程。
修饰函数
static修饰函数其实和全局变量差不多,因为函数也具有外部链接属性,被static修饰后就变成内部链接属性了,其他源文件不能再使用。
总结
局部变量被static修饰时生命周期将变得和整个程序一样长,但作用域并没有变化。而static修饰全局变量和函数时,就只能在该源文件内部使用,将于外部隔绝起来。

这份博客如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位点赞评论收藏️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧。
版权声明
本文为[圣喵]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m0_66769266/article/details/124247596
边栏推荐
- js中使用art-template的参数
- C语言 可变参数 用法
- golang 环境搭建
- nacos源代码编译中遇到的问题解决后整理如下
- Fabric测试示例,遇到orderer Exited(x) x seconds
- 94. Middle order traversal of binary tree (easy)
- Matlab tip: to use 'xxx function', you must authorize, install and enable the following products: XXX toolbox
- PCIe学习-PCIe总线体系结构入门:事务层-数据链路层-物理层(八)
- C语言的攻克之路
- Client and server communication project 5: LS command in C language
猜你喜欢

日志切割-搭建远程日志收集服务器

Mapbox sets the official map language to Chinese

idea中@Data注解,get/set方法不起作用

Level 3: node status check, data view and update

INSTALL_FAILED_MISSING_SHARED_LIBRARY

重整笔记记录:【终极方法】在Vscode中用户创建自定义代码模板

C语言之scanf/sprintf、fscanf/fprintf、sscanf/sprintf、snprintf

电脑重置后恢复mysql服务

RHEL7 配置本地yum源

mysql导出表的具体字段信息(Navicat客户端详细操作)
随机推荐
镶嵌路由:实现/home/news
Level 1: create / delete nodes
Binary leading zero
win10安装Mongo出错Service ‘MongoDB Server’ failed to start
Use of stream
工业缺陷检测项目实战(四)——基于HRNet的陶瓷缺陷检测
require-dev.mikey179/vfsStream is invalid, it should not contain uppercase characters. Please use m
617. Merge binary tree (easy)
235. Nearest common ancestor of binary search tree (easy)
CPU内存访问空间
Hyperledger Fabric1.4環境搭建及示例測試
The problems encountered in the compilation of Nacos source code are sorted out as follows
Constructor and toString
mysqlbin log日志回放进行操作步骤
RHEL 用户和组的管理-笔记
@Mapper和@Repository的使用和区别
Dynamic memory management of C
CSDN如何转载文章
idea中@Data注解,get/set方法不起作用
Autumn recruitment job summary and sharing







