概述

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语言 —— 存储类相关的关键字 (持续更新中....)相关推荐

  1. Java后台相关知识盘点(持续更新中)

    前言 本篇博客 取自于博主工作以来 对一些Java后台开发相关的 基础知识盘点和回顾, 主要涉及到Spring SpringBoot 和MyBatis相关的知识, 未来会一直更新下去- Spring ...

  2. 土木工程类规范下载(持续更新中...)

    关注公众号及时获取文章更新 ​申明:本文所提供的所有规范资料仅供个人学习.研究之用! 目录 桥梁设计类 BIM类 施工及监测类 桥梁设计类 规范名称 公众号回复内容 CJJ 166-2011 城市桥梁 ...

  3. chromium相关问题集合--持续更新中

    Q: 如何替换chromium浏览器中的图标? A: 替换src\chrome\app\theme\chromium下面相关的图片: Q: chrome应用可以分为哪些类型? A: case Mani ...

  4. c语言存储类_C编程语言的存储类

    c语言存储类 A variable's storage class tells us the following, 变量的存储类告诉我们以下内容: Where the variables would ...

  5. C语言入门教程||C语言常量||C语言存储类

    C语言 常量 常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,比如整数常量.浮点常量.字符常量,或字符串字面值,也有枚举常量. 常量就像是常规的变量, ...

  6. Go语言开发学习笔记(持续更新中)

    Go语言开发学习笔记(持续更新中) 仅供自我学习 更好的文档请选择下方 https://studygolang.com/pkgdoc https://www.topgoer.com/go%E5%9F% ...

  7. 嵌入式相关开源项目、库、资料------持续更新中

    学习初期最难找的就是找学习资料了,本贴精心汇总了一些嵌入式相关资源,包括但不限于编程语言.单片机.开源项目.物联网.操作系统.Linux.计算机等资源,并且在不断地更新中,致力于打造全网最全的嵌入式资 ...

  8. 阿里最新面试必备项之Java的String类,持续更新中!

    最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例 ...

  9. 数据库SQL语言学习--上机练习2(连接查询 嵌套查询)(持续更新中)

    数据库SQL语言学习--上机练习2(连接查询 嵌套查询)(持续更新中) 上机练习2 1.              启动SQL Server 2008中的 SQL Server Management ...

  10. C语言图形函数代码~持续更新中

    下面总结的是一些C语言图形函数代码~持续更新中 画三类圆 #include#include#include#include#includeint main(void) { initgraph(640, ...

最新文章

  1. c# 获取客户端IP地址方法
  2. linux sed命令:查看gitlab配置文件删除注释行并过滤空行后的内容
  3. 内存拷贝函数的深入思考
  4. 媒体播放器三大底层架构
  5. C# 线程手册 第三章 使用线程 Monitor.TryEnter()
  6. 数学不好,如何转行人工智能?
  7. 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机
  8. AIX学习笔记-第一天简介
  9. (87)Verilog HDL:七分频设计
  10. Oracle数据库报错【ORA-12514 】TNS 监听程序当前无法识别连接描述符中请求服务
  11. android colorstatelist_B站Android多主题框架开源:MagicaSakura
  12. 使用VideoView实现简单视频播放器
  13. Ajax怎么解决乱码PHP,php Ajax乱码
  14. C# 多文件压缩与解压
  15. 计算机无法复制大文件格式,秒解U盘复制文件电脑提示文件过大无法复制
  16. MIT.6.00.1X --Week 3 Lecture 5 -- 'Divid and conqer' algorithm 分而治之
  17. 物联网平台 yyds
  18. 查看思科交换机出厂时间
  19. 安装hg版本管理工具
  20. Ten Digit Powers

热门文章

  1. 用画图取色和在Word中使用任意颜色
  2. Dialog dismiss 和 cancel的区别
  3. [GDC 2015] Scroll Back - 2D 卷轴游戏的摄影机理论与实务
  4. Android 9.0 wifi 热点 汇总
  5. 英飞凌磁传感器 TLE5012b STM32F103 SPI 程序说明
  6. mpl代表什么_西方经济学中MPL,APL,MPK分别是什么意思
  7. 英雄联盟修改服务器封3年,LOL自定义也被封三年 竟然因为这个原因?
  8. 降维 php,线性降维方法 - 百度开发者中心的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. 用计算机唱你笑起来真好看,你笑起来真好看简谱-李昕融/樊桐舟/李凯稠演唱-孙世彦制谱...
  10. java虎胆龙威_格斗之王3虎胆龙威