C语言 —— 存储类相关的关键字 (持续更新中....)
概述
C语言变量四大属性:存储类、作用域、生命周期、链接属性。从这四个方面来理解变量相互之间是独立,对程序员编程没有太大的意义。但是将它们连起来看就会对变量有更深的理解。本文章结合这四大属性来看看存储类相关的关键字修饰之后的变量。
注:了解C语言变量四大属性的概念以及相关细节可看C语言基础篇 —— 5.0 详解C语言变量的四大属性
存储类相关的关键字对比表
关键字 | 作用 | 存储类 | 作用域 | 生命周期 | 链接属性 | 说明 |
---|---|---|---|---|---|---|
auto | auto关键字在C语言中只有一个作用修饰局部变量 | 分配在栈上 | 代码块作用域 | 临时生命周期 | 无链接 |
1、auto修饰布局变量,表示这个局部变量是自动局部变量,自动局部变量分配在栈上。 2、平时定义局部变量是就是定义的auto的,只是省略auto关键字而已。auto的局部变量其实就是默认定义的普通局部变量。 3、定义时如果未显示初始化则其值为随机的,变量地址由运行时在栈上分配得到,多次执行时地址不一定相同,函数不能返回该变量的地址(指针)做返回值。 |
static | 第一种用法:用来修饰局部变量,形成静态局部变量。 | 分配在数据段/bss段(显示初始化为非0则在数据段,显示初始化为0或未显示初始化则在bss段) | 代码块作用域 | 永久生命周期 | 无链接 |
1、静态局部变量和非静态局部变量的区别本质上是在存储类不同。 (非静态局部变量分配在栈上;静态局部变量分配在数据段/bss段上。) 2、定义时如果未显示初始化则值为0,变量地址由运行时环境在加载程序时确定,整个程序运行过程中唯一不变;静态局部变量其实就是作用域为代码块作用域(同时链接属性为无链接)的全局变量。静态局部变量可以改用全局变量实现。 |
第二种用法:用来修饰全局变量,形成静态全局变量。 | 分配在数据段/bss段(显示初始化为非0则在数据段,显示初始化为0或未显示初始化则在bss段) | 文件作用域 | 永久生命周期 | 内部链接 | 静态全局变量和非静态全局变量区别在链接属性上不同。 | |
register | register修饰的变量,编译器会尽量将它分配在寄存器中(一般变量都是在内存中)。分配在寄存器中一样的用,但是读写效率会高很多。大幅度提升程序运行效率。 | 寄存器区域 | 文件作用域 | 永久生命周期 | 外链接 | register编译器只能承诺尽量将register修饰的变量放在寄存器中,但是不保证一定放在寄存器中。主要原因是因为寄存器数量有限,不一定使用到。 |
extern | extern主要用来申明全局变量,声明的目的主要是在a.c中定义全局变量而在b.c中使用这个变量。 | 分配在数据段/bss段(显示初始化为非0则在数据段,显示初始化为0或未显示初始化则在bss段) | 文件作用域 | 永久生命周期 | 外链接 | C语言中程序的编译时以单个.c源文件为单位的,因此编译a.c时只考虑a.c中的内容,这就导致a.c中使用了b.c中定义的变量时报错。解决方案是声明(在a.c中用extern声明要使用其他文件的变量,在编译时告诉编译器这个变量在其他文件中有定义) |
volatile | C语言中volatile用来修饰一个变量,表示这个变量可以被编译器之外的东西改变。编译器之内的意思是变量的改变是代码的作用,编译器之外的改变是这个改变不是代码造成的,或者不是当前代码造成的,编译器在编译当前代码时无法预知。 | 分配在数据段/bss段(显示初始化为非0则在数据段,显示初始化为0或未显示初始化则在bss段) | 文件作用域 | 永久生命周期 | 外链接 |
1、编译器在编译当前代码时无法预知的情况有:(1)中断isr中引用的变量(2)多线程中共用的变量(3)硬件会改变的变量 , 这三种情况下改变这个变量的值属于(可变的、易变的)情况。 2、编译器在遇到volatile的时候就不会对这个变量的访问进行优化。编译器的优化在一般情况下是非常好的,可以帮助提升程序效率。但是在特殊情况(volatile)下,变量会被编译器想象之外的力量改变的,这时编译器没有意识到而去优化就会优化出错。 |
C语言 —— 存储类相关的关键字 (持续更新中....)相关推荐
- Java后台相关知识盘点(持续更新中)
前言 本篇博客 取自于博主工作以来 对一些Java后台开发相关的 基础知识盘点和回顾, 主要涉及到Spring SpringBoot 和MyBatis相关的知识, 未来会一直更新下去- Spring ...
- 土木工程类规范下载(持续更新中...)
关注公众号及时获取文章更新 申明:本文所提供的所有规范资料仅供个人学习.研究之用! 目录 桥梁设计类 BIM类 施工及监测类 桥梁设计类 规范名称 公众号回复内容 CJJ 166-2011 城市桥梁 ...
- chromium相关问题集合--持续更新中
Q: 如何替换chromium浏览器中的图标? A: 替换src\chrome\app\theme\chromium下面相关的图片: Q: chrome应用可以分为哪些类型? A: case Mani ...
- c语言存储类_C编程语言的存储类
c语言存储类 A variable's storage class tells us the following, 变量的存储类告诉我们以下内容: Where the variables would ...
- C语言入门教程||C语言常量||C语言存储类
C语言 常量 常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,比如整数常量.浮点常量.字符常量,或字符串字面值,也有枚举常量. 常量就像是常规的变量, ...
- Go语言开发学习笔记(持续更新中)
Go语言开发学习笔记(持续更新中) 仅供自我学习 更好的文档请选择下方 https://studygolang.com/pkgdoc https://www.topgoer.com/go%E5%9F% ...
- 嵌入式相关开源项目、库、资料------持续更新中
学习初期最难找的就是找学习资料了,本贴精心汇总了一些嵌入式相关资源,包括但不限于编程语言.单片机.开源项目.物联网.操作系统.Linux.计算机等资源,并且在不断地更新中,致力于打造全网最全的嵌入式资 ...
- 阿里最新面试必备项之Java的String类,持续更新中!
最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例 ...
- 数据库SQL语言学习--上机练习2(连接查询 嵌套查询)(持续更新中)
数据库SQL语言学习--上机练习2(连接查询 嵌套查询)(持续更新中) 上机练习2 1. 启动SQL Server 2008中的 SQL Server Management ...
- C语言图形函数代码~持续更新中
下面总结的是一些C语言图形函数代码~持续更新中 画三类圆 #include#include#include#include#includeint main(void) { initgraph(640, ...
最新文章
- c# 获取客户端IP地址方法
- linux sed命令:查看gitlab配置文件删除注释行并过滤空行后的内容
- 内存拷贝函数的深入思考
- 媒体播放器三大底层架构
- C# 线程手册 第三章 使用线程 Monitor.TryEnter()
- 数学不好,如何转行人工智能?
- 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机
- AIX学习笔记-第一天简介
- (87)Verilog HDL:七分频设计
- Oracle数据库报错【ORA-12514 】TNS 监听程序当前无法识别连接描述符中请求服务
- android colorstatelist_B站Android多主题框架开源:MagicaSakura
- 使用VideoView实现简单视频播放器
- Ajax怎么解决乱码PHP,php Ajax乱码
- C# 多文件压缩与解压
- 计算机无法复制大文件格式,秒解U盘复制文件电脑提示文件过大无法复制
- MIT.6.00.1X --Week 3 Lecture 5 -- 'Divid and conqer' algorithm 分而治之
- 物联网平台 yyds
- 查看思科交换机出厂时间
- 安装hg版本管理工具
- Ten Digit Powers
热门文章
- 用画图取色和在Word中使用任意颜色
- Dialog dismiss 和 cancel的区别
- [GDC 2015] Scroll Back - 2D 卷轴游戏的摄影机理论与实务
- Android 9.0 wifi 热点 汇总
- 英飞凌磁传感器 TLE5012b STM32F103 SPI 程序说明
- mpl代表什么_西方经济学中MPL,APL,MPK分别是什么意思
- 英雄联盟修改服务器封3年,LOL自定义也被封三年 竟然因为这个原因?
- 降维 php,线性降维方法 - 百度开发者中心的个人空间 - OSCHINA - 中文开源技术交流社区...
- 用计算机唱你笑起来真好看,你笑起来真好看简谱-李昕融/樊桐舟/李凯稠演唱-孙世彦制谱...
- java虎胆龙威_格斗之王3虎胆龙威