变量是C语言最基础也是最核心的概念,C的变量比较复杂,这里做个总结,希望对学习C的兄弟们有帮助。
变量字面含义是表示一个可变的数据,数据有各种各样的类型,变量的类型指定了变量所能表示的数据类型。
这个语句定义了一个char变量c,变量的值为字母120(字母x的ASCII码值为120),这个变量存储在计算机的某块内存区域,其存储单元的地址(编号)假设为0x1101。
变量名c实质就是内存单元地址0x1101的一个符号,c代表的内存地址为0x1101。
变量之所以能改变,是因为内存中数据是可以改变的,因此称之为变量。
如果你对计算机以上的内容还不理解,请看《计算机组成原理》。
实际上学习计算机组成原理,是学习汇编和C语言先行课程,可是大学里面往往颠倒了,误导了一批又一批的高材生。
刚学C语言的时候,往往会有很多疑问,寄存器变量,全局变量等等,尤其是这些概念交叉起来外部寄存器变量,初学者就晕菜了。
从作用域(空间)角度来划分,可分为全局变量和局部变量。
从存储类型(生命周期/时间)角度划分,可分为静态存储方式和动态存储方式。
另外,从变量的表达值类型划分,类型很多很多,一般说的int类型变量,就是这个意思。
为了认识存储类型,需要了解C语言程序内存区域的划分,一般划分为以下五大部分:
1、栈区(Stack):栈是由编译器自动分配和释放的内存区域,用于存放局部变量(包括方法的参数等)。栈区里的变量个数和变量的值会随着程序的运行而改变。
2、堆区(Heap):程序员通过C的函数(比如malloc)申请的内存区域,使用完毕后释放(或由OS自动释放)。
3、全局区(静态区(Static):这本内存区域用来保存全局变量和静态变量。在进入程序时分配,程序结束后由系统释放,整个程序运行期间一直存在。
4、文字常量区:用来保存常量字符串的内存区域,程序结束后,由系统释放。
5、程序代码区:用来保存程序二进制代码的内存区域。
属局部变量,动态存储。auto可省略,系统不为其进行默认初始化,未初始化的静态变量指向一个不可预期的、无意义的值。
与auto一样,属局部变量,动态存储。但存储的位置在CPU内。不能对变量使用取地址运算符(&),因为寄存器变量的存储没有内存地址。
定义在函数外,也叫全局变量,使用静态存储方式保存在全局区( 静态区)。
外部变量和全局变量是对同一类型变量的两种不同角度的法。全集变量时从他的作用域角度提出的,外部变量时从他的存储方式提出的,表示其生命周期。
存储于静态区,可分为静态全局(或外部)和静态局部(或内部)两种类型。对于基本类型的静态局部变量,系统会自动为其赋初值0(与外部变量相同)。
但属于静态存储方式的变量不一定就是静态变量,外部变量(全局变量)也属于静态存储方式,但外部变量不一定是静态变量。
注意:对于寄存器变量,很多C编译器并没有真正将寄存器变量放到CPU内部,而是作为自动变量处理。使用register只是提示编译器将变量定义为寄存器变量,期望编译器将其作为寄存器变量,但不一定能达到期望。因为要看编译器是否支持了,其次看看CPU内部是否有可用寄存器空间。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/186951,如需转载请自行联系原作者