c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍

描述

C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式。

静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。

动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:自动变量;函数形参;函数调用时的现场保护和返回地址等。

e9e74bd8a170b8b9e2ee6f7a2e4dec33.png

静态分配和动态分配的区别主要是两个:

时间不同:静态分配发生在程序编译和连接的时候,动态分配则发生在程序调入和执行的时候。

空间不同:堆都是动态分配的,没有静态分配的堆。动态分配由函数malloc进行分配(需要注意的是有一个malloc,就有一个free对应)。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。不过栈的动态分配和堆不同,它的动态分配是由编译器进行释放,无需人工实现。

C语言的内存分配方式:堆和栈

7c5e88c831af86ac459b3b017512f97b.png

变量示例

C语言中的变量具体包含有四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern),如果不加以声明,则认为是auto型,自动分配存储空间,属于动态存储方式。

Static声明局部变量是在函数调用结束后不消失而保留原值,即占用存储单元不释放,在下一次调用该函数时,该变量保持上次函数调用结束时的值。Static在对全局变量声明中,该变量的作用域则仅限于本文件模块操作。

Register变量是C语言中允许将局部变量的值放在CPU中的寄存器中需要时直接从寄存器中取出来参加运算,不必再到内存中提取,但是计算机系统中寄存器数量有限,不能任意定义任意多的存储器,局部静态变量不能定义为寄存器变量。

寄存器是最贴近CPU的,而且CPU只在寄存器中进行存取。寄存的意思是暂时存放数据,不用每次都从内存中取,它是一个临时的存放数据的空间。

关于寄存器变量有以下事项需要注意:

为寄存器变量分配寄存器是动态完成的,因此,只有局部变量和形式参数才能定义为寄存器变量。

寄存器的长度一般和机器的字长一致,所以,只有较短的类型如int、char、short等才适合定义为寄存器变量,诸如double等较大的类型,不推荐将其定义为寄存器类型。

CPU的寄存器数目有限,因此,即使定义了寄存器变量,编译器可能并不真正为其分配寄存器,而是将其当做普通的auto变量来对待,为其分配栈内存。当然,有些优秀的编译器,能自动识别使用频繁的变量,如循环控制变量等,在有可用的寄存器时,即使没有使用 register 关键字,也自动为其分配寄存器,无须由程序员来指定。

计算机系统的硬件组织:总线、IO、主存、CPU

Extern声明外部变量,表示变量在别的文件中。在一个文件中,如果定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量做外部变量声明。在多文件中,也可以采用extern声明的办法进行外部变量声明。有时希望某些局部变量只限于被本文件引用,而不能被其他文件引用,这时就可以采用在定义外部变量时外加一个static,这在程序模块化设计中加强了通用性。

4caa46d8efa2fb62c967d5f8095afeb7.png

打开APP阅读更多精彩内容

点击阅读全文

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值