企业组网案例经典分享
2015-04-02 17:36
495 查看
有了前面两篇的基础,下面正式开扒变量名和内存的关系,先看一段大家很熟悉的代码:
int i; scanf_s("%d", &i);int i;,在这一句就为i分配了内存(但尚未对这块内存进行初始化),所以可以通过&i直接使用这块内存。赋值就更不用说啦,i = 3;。 变量名i,是为方便编程人员使用,是这块内存的别名,指代到块内存,对编程人员i代表这块内存中存储的值(实际上是i指到这个内存,然后取值)。通常我们都是通过变量名来使用已知的内存的。 i代表取(这块内存中存储的)值,而&i代表取(这块内存的)址。程序本身是不为i这个变量名分配空间的。在最终的机器代码中,是不会出现变量名的,这一点在分析反汇编语言时可以看出(命令:dumpbin /disasm xx.obj >xx_disasm.asm可以查看反汇编语言)。那么编译器是如何处理变量名的呢,变量名会存储在符号表中,并将符号表中的索引对应到实际物理空间(地址)上去,当调用这个变量时,查找符号表就可以找到对应的地址并取值了。 上面分析的是基本数据类型(如int、char等)的变量名。C中除了变量名之外,还有函数名、常量名、指针名、数组名、结构名等。和变量名不同,这些标识符都是直接对应着地址的。基本数据类型的变量,和地址的对应关系需要取址符&才能得到地址,而其余的这些,名字本身就对应着地址。 例如char *pc = “se”;,就是将字符串常量”se”的首地址(位于常量存储区)赋值给了字符指针pc。这也就解释了为什么不需要为pc分配地址就可以为其赋值,而不会遇到类似下面代码所带来的野指针问题:
int *pi; *pi = 1;int *pi句,是为pi分配空间,而不是开辟pi所指向的空间。 下面分别来看不同类型变量的变量名和内存见的关系:先看C中的常量: C对常量是怎么处理的呢?比如上面的i = 3;中的常量3,存储常量3的地址并不是随机分配的,是在程序中的数据段中(.data?这个我也还不是很确定,希望知道的前辈们给个指导),也就是程序本身并不为3分配内存,而是直接写入指令。3是数字常量,对于字符常量和字符串常量,又分别是怎么处理的呢? 字符常量和数字常量是一样的处理方式,都是类似汇编中的立即数,直接写入指令; 而字符串常量,则是存储在常量存储区,可以使用&(“string”)取得具体地址。也就是字符串常量名字本身指代着地址,只是不能直接操作(和int i中的i相同)。 再看各种类型的变量名,c中的数据类型除常量之外大致有5种:基本数据类型:int、float、double、char等: 对各基本数据类型的变量名及其声明时的处理方式都是一样的,声明时即分配内存,并使用变量名直接操作这段内存;使用取地址符号&取得地址的数字表示,至于声明时要不要做初始化,要看是不是全局变量或者 static变量了。这类变量名指向一个地址空间,但不能直接当做地址使用,而是通过取址符&操作其地址。http://www.cnblogs.com/czl-sy/archive/2013/04/08/3008959.html
相关文章推荐
- 经典案例:企业H3C组网实例 推荐
- 经典案例:企业H3C组网实例
- CCNA--LAB-11:配置单臂路由(企业经典案例)
- spark企业经典案例之手机app流量统计
- ESB 案例解析和项目实施经验分享,第 2 部分: 刚柔相济,构建企业联邦 ESB
- 案例分享(二)——江苏某金融行业IT企业案例分享
- Android Zxing生成二维码经典案例分享
- MYSQL资料集锦--高可用企业案例分享篇
- 经典案例分享:20个创新的用户界面设计
- 倾情奉献:开源企业类库(EntLib)大分享(汇聚网上经典的类库)
- 企业上云案例分享:上海和黄白猫成功部署云盒子企业云盘!
- CCNA--LAB-11:配置单臂路由(企业经典案例)
- 云南企业现代物流经典案例
- 经典案例分享:20个创新的用户界面设计
- 经典网页设计:10个优秀的国外企业网站设计案例
- CCNA--LAB-11:配置单臂路由(企业经典案例)
- 分享一起经典故障案例