您的位置:首页 > 其它

全面深入认识C变量

2014-03-05 23:02 309 查看
变量是C语言最基础也是最核心的概念,C的变量比较复杂,这里做个总结,希望对学习C的兄弟们有帮助。

一、认识变量

变量字面含义是表示一个可变的数据,数据有各种各样的类型,变量的类型指定了变量所能表示的数据类型。

从存储角度认识变量的本质,举例来说:

char c = 'x';

这个语句定义了一个char变量c,变量的值为字母120(字母x的ASCII码值为120),这个变量存储在计算机的某块内存区域,其存储单元的地址(编号)假设为0x1101。

变量名c实质就是内存单元地址0x1101的一个符号,c代表的内存地址为0x1101。

当使用变量c时候,其本质是访问所对应的内存单元。

变量之所以能改变,是因为内存中数据是可以改变的,因此称之为变量。

如果你对计算机以上的内容还不理解,请看《计算机组成原理》。

实际上学习计算机组成原理,是学习汇编和C语言先行课程,可是大学里面往往颠倒了,误导了一批又一批的高材生。

二、从时空角度来认识变量分类

刚学C语言的时候,往往会有很多疑问,寄存器变量,全局变量等等,尤其是这些概念交叉起来外部寄存器变量,初学者就晕菜了。

实际上变量是有其时空特性的。简单说就是:

从作用域(空间)角度来划分,可分为全局变量和局部变量。

从存储类型(生命周期/时间)角度划分,可分为静态存储方式和动态存储方式。

另外,从变量的表达值类型划分,类型很多很多,一般说的int类型变量,就是这个意思。

三、认识变量的存储类型

为了认识存储类型,需要了解C语言程序内存区域的划分,一般划分为以下五大部分:

1、栈区(Stack):栈是由编译器自动分配和释放的内存区域,用于存放局部变量(包括方法的参数等)。栈区里的变量个数和变量的值会随着程序的运行而改变。

2、堆区(Heap):程序员通过C的函数(比如malloc)申请的内存区域,使用完毕后释放(或由OS自动释放)。

3、全局区(静态区(Static):这本内存区域用来保存全局变量和静态变量。在进入程序时分配,程序结束后由系统释放,整个程序运行期间一直存在。

4、文字常量区:用来保存常量字符串的内存区域,程序结束后,由系统释放。

5、程序代码区:用来保存程序二进制代码的内存区域。

四、C变量存储类型关键字

C变量存储类型描述关键字有四:

1、auto 自动变量

属局部变量,动态存储。auto可省略,系统不为其进行默认初始化,未初始化的静态变量指向一个不可预期的、无意义的值。

2、register 寄存器变量

与auto一样,属局部变量,动态存储。但存储的位置在CPU内。不能对变量使用取地址运算符(&),因为寄存器变量的存储没有内存地址。

3、extern 外部变量

定义在函数外,也叫全局变量,使用静态存储方式保存在全局区( 静态区)。

外部变量和全局变量是对同一类型变量的两种不同角度的法。全集变量时从他的作用域角度提出的,外部变量时从他的存储方式提出的,表示其生命周期。

4、static 静态变量

存储于静态区,可分为静态全局(或外部)和静态局部(或内部)两种类型。对于基本类型的静态局部变量,系统会自动为其赋初值0(与外部变量相同)。

但属于静态存储方式的变量不一定就是静态变量,外部变量(全局变量)也属于静态存储方式,但外部变量不一定是静态变量。

注意:对于寄存器变量,很多C编译器并没有真正将寄存器变量放到CPU内部,而是作为自动变量处理。使用register只是提示编译器将变量定义为寄存器变量,期望编译器将其作为寄存器变量,但不一定能达到期望。因为要看编译器是否支持了,其次看看CPU内部是否有可用寄存器空间。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: