| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> C语言中extern,static, register,volatile 关键字的作用;保姆级教学! -> 正文阅读 |
|
[C++知识库]C语言中extern,static, register,volatile 关键字的作用;保姆级教学! |
目录 冰冻三尺非一日之寒。既然选择远方,当不负青春,砥砺前行,每一个裂缝都是为透出光而努力,只有极致的拼搏,才能配得上极致的风景。诸君,山顶见! 前言:在C语言中,这几个关键字,都有他们自己的个性。static和extern用的比较多,特别是static在学校的C语言考试经常考到。register和volatile这两个关键字是平时用的比较少,如果小伙伴对这两个关键字的作用已经有了认识,那小编就要给你树个大拇指了,小伙子了不起。小编自己也曾在考试中在static这个关键字上吃了憋,自以为C语言学的不错的情况下,见到register和volatile也是一脸懵,今天特意来聊一聊这几个关键字。 一.externextern声明外部符号,用来声明不在同一个源文件( .c文件)的变量,这里非常像引用头文件,但是引用头文件仅限于,变量在? ?.h 文件中,我们可以使用#include"xxx.h",但是如果实在 .c 文件中就不可以用头文件了。 看代码示例,这里是引用头文件的情况。 再来演示一下,外部变量在.c文件中; ?注意:这里的a通过extern去声明,这里外部文件按的a,必须是全局变量,因为局部变量的作用域仅在自己所在的局部范围中,局部变量的生命周期也是进入作用范围开始和出作用范围结束,而全局变量的作用范围是整个工程,生命周期是整个程序的生命周期,如果a是局部变量,在外部声明了a,而a的生命周期已经结束了,编译器都不会编译通过。 extern对于函数也是一样的,用法和普通全局变量一样。 但是函数一般不加也可以,但是可能会报未声明的警告。 ?二.static1.static的作用是,被static修饰局部变量,会改变局部变量的储存类型,对于普通的局部变量是存储在栈区的,被static修饰的变量是存储在静态区的。存储在静态区的变量出了作用范围依然不会销毁,依然存在。所以静态变量的生命周期是整个程序的生命周期,只有程序结束的时候静态区的变量才会回收。这里的对静态区的变量描述是不是非常像全局变量,哈哈,没错全局变量也是存储在静态区的。其实除了静态区和栈区,还有一个堆区。 ?写一段代码来看看static是怎样延长变量的生命周期的:
?小伙伴们可以算一算这段代码的运行结果。 小伙伴们有没有算对呢,因为这里的a是个局部变量;所以每次进入函数text(),a变量都会重新创建,所以每次a变量的值都是a=0+1;出了函数?a变量就会销毁。 ?下面再来看一看这个代码:
小伙伴来算一算结果吧 ?为什么会这样呢? ?由此可见,局部变量的生命周期延长了,但是作用域还是不变的。 2.如果static修饰全局变量,又会是怎么样的呢?一起来看一看吧。 首先全局变量具有外部链接属性,static修饰后,外部连接属性就变成了,内部连接属性。这个全局变量就只能在自己所在的.c文件看到,其他源文件就无法访问。 ?修饰函数也会使得函数外部连接属性就变成内部连接属性。函数就只能在自己所在的.c文件看到,其他源文件就无法访问。 ?三.registerregister叫做寄存器,被其修饰的变量叫做,寄存器变量。什么是寄存器简单介绍一下,计算机的存储位置有,硬盘,内存,高速缓存,寄存器。 ?当一个变量,后续需要大量使用的时候,每次CPU都要向寄存器,高速缓存,内存一级一级的去寻找,这样访问速度就会很慢,针对这样的情况,如果我们就将这样的变量存储到寄存器中,那么CPU每次都直接从寄存器中去获取,访问速度就会大大提高。所以register关键字由此出现,但是register修饰变量,只是建议将变量存储到寄存器中,会根据情况而定,不是被register修饰了就一定放到寄存器中,这点要特别注意。编译器会根据情况自己智能的将,需要的处理的变量放到寄存器中。还有就是被register修饰的变量是不能取地址的,是因为&只能取出内存中的地址,而无论被register修饰的变量,是否真正的存储到了寄存器中,都不能取地址。 四.volatile?volaile 有不稳定的,容易变化的意思。当我们有一个变量需要大量的使用,这个变量就会,可能就会存储到寄存器中,在我们现在来看,看似没事其实是有一定风险的,因为我们现在写的代码都是单线程的,如果代码不只有一个线程,而在另外的线程中会使得变量被修改,而CPU仍然从寄存器中去获取变量,获取的并不是修改后的变量,就会导致出现问题。而volatile就是使得被修饰的变量不去优化,一直放在内存中,提高对特殊地址位置的访问,使得后续的访问安全性更高。这里volatile和register有点对立,可以对比记忆。 值得注意的是,volatile修饰的变量也是提醒编译器,这个变量后续可能会发生变化,要注意保护。并不是被volatile修饰及一定发生变化。这点和register非常像。 最后冰冻三尺非一日之寒。既然选择远方,当不负青春,砥砺前行,每一个裂缝都是为透出光而努力,只有极致的拼搏,才能配得上极致的风景。诸君,山顶见! |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/11 11:54:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |