C为变量提供了5种不同的存储类,还有基于指针的第6种存储类。

不同的存储类提供了变量的作用域、链接和存储时期的不同组合。

作用域:描述了程序中可以访问的一个标识符的一个或多个区域。

一个C变量的作用域可以是代码块作用域(code scope)、函数原型作用域(function prototype scope),或者文件作用域(file scope)。

存储类是C语言与C++语言的标准中,变量与函数的可访问性(即作用域范围scope)与生存期(life time)。存储类可分为auto、register、static、extern、mutable、thread_local等。

auto类

auto类是指定于在{与}所限定的作用域内部的局部变量的缺省存储类。-------作用域:代码块

register

register关键字提示编译器把局部变量或函数的形参尽可能放入CPU的寄存器中,以便快速访问。因此变量的字节长度不应该超过寄存器的长度。不要用取地址符(&)去获得此变量的内存地址--------作用域:代码块

static

static是全局变量的默认存储类。

extern

extern存储类是指全局变量可以被各个对象模块访问。使用extern关键字时,表示变量已经在别处定义,所以不能在此处初始化。

mutable

mutable存储类只能用于类的数据成员,不能用于普通变量。具有mutable性质的类的数据成员打破了类对象的const限定,允许修改类的mutable的数据成员,即便类的其它成员仍然是const只读属性。

thread_local

适用于命名空间内的变量、全局作用域的变量、函数内部定义的静态变量,如果使用了thread_local关键字,则在运行时不同的线程具有该变量的不同的存储位置,即各有各的副本。因此,具有thread_local存储类的变量,必然具有static存储类性质,不管是否使用了static关键字。

--------------------------------------我是分割线---------------------------------

一个代码块是包含在开始花括号和结束花括号之内的一段代码。

在代码块中定义的变量具有代码块作用域,从该变量被定义的地方到包含该定义的代码块的末尾,该变量均可见。

另外,函数的形式参数也具有代码块作用域。

C99把代码块的概念扩展到了由for循环、while循环、do while循环或者if语句所控制的代码--即使这些代码没有被花括号括起来。

函数原型作用域适用于函数原型中使用的变量名。其作用域从变量定义处直到原型声明的末尾。如:

int mighty(int mouse, double large);

这说明编译器在处理一个函数原型的参数时,它所关心的只是该参数的类型,在声明中使用说明名字通常是无关紧要的。

一个在所有函数之外定义的变量具有文件作用域。具有文件作用域的变量从它定义处到包含该定义的文件结尾处都是可见的。

文件作用域变量也被称为全局变量(global variable)。

链接:

一个C变量具有下列链接之一:外部链接(external linkage)、内部链接(internal linkage)或空链接(no linkage)。

具有代码块作用域或函数原型作用域的变量有空链接,意味着它们是由其定义所在的代码块或函数原型所私有的。

具有文件作用域的变量可能有内部或外部链接。

一个具有外部链接的变量可以在一个多文件程序的任何地方使用;一个具有内部链接的变量可以在一个文件的任何地方使用。

分辨一个变量具有内部还是外部链接,看其定义是否使用了存储类说明符static:

存储时期:

一个C变量有以下两种存储时期之一:静态存储时期(static storage duration)和自动存储时期(automatic storage duration)。 如果一个变量具有静态存储时期,它在程序执行期间将一直存在。具有文件作用域的变量具有静态存储时期。 具有代码块作用域的变量一般情况下具有自动存储时期。在程序进入定义这些变量的代码段时,将为这些变量分配内存;当退出这个代码块时,分配的内存将被释放。 C使用作用域、链接和存储时期来定义5种存储类:自动、寄存器、具有代码块作用域(空链接)的静态、具有外部链接的静态、具有内部链接的静态。 5种存储类: 存储类                时期    作用域    链接    声明方式 自动                    自动    代码块    空        代码块内 寄存器                自动    代码块    空        代码块内,使用关键字register 具有外部链接的静态    静态    多文件    外部    所有函数外 具有内部链接的静态    静态    单文件    内部    所有函数外,使用关键字static 空链接的静态            静态    代码块    空        代码块内,使用关键字static

c语言 存储,c语言存储类相关推荐

  1. 我的全栈之路-C语言基础之数据存储

    我的全栈之路-C语言基础之数据存储 我的全栈之路 2.1 计算机的计算单位 2.1.1 容量单位 2.1.2 速度单位 2.2 计算机底层为什么只能识别二进制 2.3 进制 2.3.1 进制概述 2. ...

  2. c语言中负数的读取和存储,C语言中负数的存储方式

    详细介绍负数的文章: https://blog.csdn.net/daiyutage/article/details/8575248 1.以char类型举例,其取值范围是 -128 ~ 127,即-2 ...

  3. c语言存储类型关键字作用,c语言学习笔记.关键字.存储类型关键字等

    关键字const 1.修饰变量. 修饰的对象为常量,只读. 2.修饰指针. const 也可以和指针变量一起使用,这样可以限制指针变量本身,也可以限制指针指向的数据. const 离变量名近就是用来修 ...

  4. c语言变量是如何存储,C语言变量存储

    C语言中的变量按照生存周期来区分,可以分为静态存储和动态存储. 一.静态存储 静态存储是在程序运行过程中分配固定的存储空间.静态存储区中存放了整个程序运行过程中的都存在的变量,如全局变量,因此静态存储 ...

  5. c语言 文档存储,C语言数据的存储

    C语言数据的存储Tag内容描述: 1.第二章 数据的存储与运算,预备知识 基本数据类型 常量与变量 不同类型数据间的转换 运算符和表达式,2.0 预备知识 计算机中数的表示及进制转换 数码.基与权 数 ...

  6. 20.0、C语言数据结构——图的存储结构

    20.0.C语言数据结构--图的存储结构 图的存储结构相比较线性表与树来说就复杂很多了: 1. 我们回顾下,对于线性表来说,是一对一的关系,所以用数组或者链表均可简单存放:树结构是一对多的关系,所以我 ...

  7. C语言用char数组存储一串整数时的一个陷阱

    C语言用char数组存储一串整数时的一个小陷阱 C语言的一个关于char数组的小Tip 一.问题起源 二.问题代码 三.问题分析 (一).运行分析 (二).可能的解决方案 四.问题总结(不想看长篇大论 ...

  8. ADS下C语言中局部变量的存储位置分配

    ADS下C语言中局部变量的存储位置分配 发布:xlander | 发布时间: 2008年8月12日 做研发很多年了,起初开发的软件都是在台式机上运行的,台式机上丰富的资源从来没让我仔细的思考过有关变量 ...

  9. C语言—静态存储与动态存储

    静态存储和动态存储 变量从变量值存在的时间(即生存期)角度分:静态存储方式和动态存储方式 静态:在编译时确定了固定的内存地址与内存大小,如:函数里的局部变量.全局变量等 动态:由程序控制,运行时主动性 ...

最新文章

  1. 大写的服!90 后程序员利用业余时间帮网友鉴定毒蘑菇,拥有百万粉丝成网络大 V...
  2. 安装Oracle10g on RedHat as 4 64bit
  3. NiosII中Flash的使用(转)
  4. mysql数据库sql注入原理_sql注入原理详解(一)
  5. 没有计算机基础可以学python-Python入门必看篇(面向小白)想学Python只看这一篇就够了...
  6. BZOJ1283 序列(费用流)
  7. 【优化算法】粒子群优化算法(PSO)【含Matlab源码 1073期】
  8. django oscar_赢得奥斯卡奖之后会发生什么
  9. 面试被问Redis锁的缺点,被打击的扎心了
  10. Python+Turtle 魔法阵效果(简陋)
  11. 腾讯云从良心云转变成“凉心云”,乱封禁服务器与域名怎么办?
  12. 世界著名的品牌啤酒——网络整理X
  13. ie9 error 拒绝访问
  14. 利用Arcpy批量图斑生成图片
  15. 08-Hibernate3.6.2 查询02 by SQL QBC QBE
  16. Kyan 网络监控设备 hosts 账号密码泄露漏洞
  17. mysql中avg函数如果有空值_SQL中AVG、COUNT、SUM、MAX等聚合函数对NULL值的处理
  18. Mybatis Plus 多租户id使用
  19. MySQL 8.0.31 最新版详细安装教程(下载+安装+配置+登录测试)
  20. 2164 Bincomial Coeffcients(组合数求模)

热门文章

  1. C语言中以二进制形式输出文件
  2. libuv:多平台支持库-异步I / O
  3. C++ STL 教程
  4. C 标准库 limits.h
  5. HugeTLB Pages大页内存
  6. LKMs:Loadable Kernel Modules
  7. 依赖注入的三种方式_Spring IoC是如何进行依赖注入的
  8. python的目的_Python-** wargs的目的和用途是什么?
  9. paste shell 分隔符_shell基础11:文件分类、合并和分割(sort,uniq,join,cut,paste,split)
  10. Java 动态代理详解