博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
全面深入认识C变量
阅读量:6702 次
发布时间:2019-06-25

本文共 1583 字,大约阅读时间需要 5 分钟。

变量是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内部是否有可用寄存器空间。
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/186951,如需转载请自行联系原作者
你可能感兴趣的文章
arm还是x86?未来在工业SBC数字谁可以脱颖而出
查看>>
Mybatis成为首选持久框架的原因
查看>>
SAP利用内表删除多条数据(自定义表)
查看>>
电脑上卸载软件的残留文件怎么清理?
查看>>
Android 初始化Menu item的值(ActionBar篇)
查看>>
Facebook和Google服务全球大瘫痪,网友:全世界只剩下推特 ...
查看>>
不让「数据孤岛」成为 AI 发展的绊脚石,「联邦学习」将成突破口? ...
查看>>
阿里云大数据ACP认证知识点梳理9——产品特点(DATA WORKS) ...
查看>>
首发 | 完成近亿美元B轮融资,黑芝麻如何成为自动驾驶芯片破局者?
查看>>
AI通过儿童眼球运动,筛查胎儿酒精谱系障碍
查看>>
【资料下载】Python第四讲——使用IPython/Jupyter Notebook与日志服务玩转超大规模数据分析与可视化...
查看>>
用不到 30 行 Python 代码实现 YOLO
查看>>
云HBase备份恢复,为云HBase数据安全保驾护航
查看>>
Ubuntu16.04上通过kubeadm安装指定版本Kubernetes1.9.0
查看>>
Intellij IDEA Jrebel Plugin 激活服务
查看>>
用Mockplus教你使用属性面板的设置交互状态
查看>>
让旧手机运行 Android O? 看看 Android Go 是如何做到的
查看>>
Zabbix SNMP监控安装、配置与服务器实例(学习笔记六)
查看>>
CocoaPods 1.7.0 Beta 发布,Xcode 依赖库管理
查看>>
学习讲述
查看>>