c语言中各种变量初始化时间,C语言中变量的存储类型与初始化

存储类型

变量的存储类型决定变量何时创建,何时销毁,以及变量的值保持多久。有三个地方可以存储变量:

普通内存

运行时堆栈

硬件寄存器

变量的默认存储位置取决于它的声明位置。

静态变量

在代码块外声明的变量总是存储于静态内存中,不在堆栈中,这样的变量称为静态变量。静态变量在程序开始前创建,在程序运行过程中一直存在,在程序执行完毕后销毁。

自动变量

在代码块内声明的变量默认存储类型是自动的,它存储于运行堆栈中,称为自动变量。关键字auto用于修饰这种存储类型,但是很少被使用,因为代码块中声明的变量本就是自动存储类型。这类变量,在程序执行到声明变量的地方才被创建,在离开代码块后被销毁。一个函数可能多次被调用,函数中声明的变量每次都会创建,销毁。

对于在代码块中创建的变量(自动存储类型),在其前面加上关键字static可以使其存储类型变为静态存储类型,但是这并不意味着修改了变量的作用域,它只能在该代码块中被访问。

寄存器变量

register关键字可以用于自动变量的声明,它表明该变量存储于机器的寄存器中而不是堆栈中。因为处理器的寄存器有限,如果有太多的变量被声明为寄存器变量,那么编译器只取前几个,其余的按照自动变量处理。

寄存器中的数据读取速度快,所以通常把那些频繁使用的变量声明为寄存器变量。有的编译器会判断出那些变量使用最频繁,所以编译器可能会彻底忽略register关键字,而由编译器决定那些变量存储于寄存器中。

我们知道寄存器会存储其他信息,所以变量创建时,需要将寄存器中原始的数据保存在堆栈里。在变量销毁时候,会将堆栈中原来的数据恢复回来。许多机器不为寄存器指定地址,其次寄存器在不同时刻保存着不同的数据,所以机器不提供寄存器变量的地址。

初始化

如果不显式地为静态变量指定初始值,静态变量将被初始化为0。由于静态变量是静态链接,所以静态变量的初始化过程中,可以将将要初始化的值放在程序执行时静态变量对应的位置上。

对于自动变量程序链接时并不知道自动变量存储的位置,所以自动变量的初始化,实际上是两个步骤,其一是创建变量,其二是给变量赋值。所以下面两种方式只有风格之差,并没有效率上的差别:

// 1

int a = 10;

// 2

int a;

a=10;

最后,如果没有对自动变量进行显式的赋值,那么它的值将是不确定的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值