C/C++中完整的变量声明除了包括声明其数据类型外,有时还需要声明其存储类型,存储类型说明了变量在内存中存储的方式,它决定了变量的作用域和生存期。
变量的作用域有三种:局部作用域,全局作用域和文件作用域。具有局部作用域的变量称为局部变量,具有全局作用域和文件作用域的变量称为全局变量。局部变量在函数内部声明,仅在其函数或语句块内部有效,全局变量在函数外声明,其作用域范围最广,甚至在整个源文件中有效,当多个独立编译的源文件链接成一个程序时,在某个链接的文件中也可以使用它们,但使用前必须进行extern外部声明。文件作用域是指在函数外部声明的变量只在当前文件范围内(包括该文件内所有定义的函数)可用,但不能被其他文件中的函数访问。要使文件或函数具有文件作用域,必须在它们的声明前加上static修饰符。当将多个独立编译的源文件链接成一个程序时,可以利用static修饰符避免一个文件中的外部变量由于与其他文件中的变量同名而发生冲突。
在同一作用域内声明的变量不能同名,但不同作用域声明的变量可以同名。
系统为不同存储属性的变量分配不同类型的内存空间,C++程序中的变量有三种内存分配方式:静态分配,自动分配和动态分配。一个程序运行时,系统为每个程序开辟了三块区域,分别是固定的静态存储区,栈的活动存储区和堆。静态分配是指在静态存储区内为变量分配内存空间,编译时就分配了内存地址,程序开始执行时就开始占用内存,程序结束时才释放内存。自动分配是指在栈中为变量临时分配内存空间,程序运行时,在变量作用域开始时有系统自动为变量分配内存,在作用域结束后释放内存。动态分配是指在堆中为变量分配内存空间,堆使用静态存储区和栈之外的部分内存,动态分配是一种完全由程序本身控制内存的使用的分配方式,在程序运行后,利用new()和delete()运算符进行内存的分配和释放。
非动态分配内存的变量,由其存储类型和位置决定采用哪种内存分配方式。变量的存储类型有以下四种:auto(自动),register(寄存器),extern(外部),static(静态)。auto和register用于声明内部变量,auto变量存储在栈中,register变量是存储在寄存器中,extern用于声明外部变量,static用于内部和外部变量,extern变量和static变量是存储在静态存储区中。当声明变量时未指定存储类型时,则内部变量默认是auto类型,外部变量默认是extern类型。
外部变量的声明有两种声明方式:引用性声明和定义性声明。定义性声明只能放在函数的外部,它为了创建变量,即变量需要分配内存,且extern修饰符可以省略。引用性声明是为了建立变量和内存单元间的关系,表示要引用的变量已在程序源文件中其他地方进行过定义性声明。且extern修饰符不可缺,引用性声明时一般不能进行初始化,除非定义性声明该外部变量时没有进行初始化。
关于用static声明的变量是静态变量,可以是全局或局部变量,但有全局的生存寿命,虽然只可以在其作用域使用,但它一直存在。如果声明时没有初始化,则其初始化值为0。因此尽量在静态变量的声明时初始化。
本文详细解析了C/C++中变量的存储类型及其如何决定变量的作用域和生存周期,阐述了不同作用域变量的特点,并介绍了静态、自动和动态内存分配的区别。此外,还解释了使用static和extern关键字的场景。

747

被折叠的 条评论
为什么被折叠?



