快速业务通道

C++从零开始之指针及其语义和运用

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
*sizeof(long)=40个字节,而char[7]类型所对应的长度就是7*sizeof(char)=7个字节。一个数字的类型是数组类型时,因这个数字的长度可一个字节,可一万个字节,故这个数字一定被存放在某块内存中,而数组类型的数字返回的二进制数就是其被存放的内存的首地址。所以前面提到的常数就不能返回一个数组类型的数字,因其没有给出一块内存来存放数组类型的数字。

这里有点混乱,注意数字不一定非要被内存所存储。对于long a[3] = { 45, 45, 45 };,假设a映射的数字是3000,则表示以long[3]的规则解释内存单元3000所记录的数字,这个数字的长度是3*sizeof(long)=12个字节,它的值由于数组类型是长度可变的而决定使用3000(记录它的内存的地址)来代表它,实际是3个值为45的数。所以a;将先返回long[3]类型的地址类型的数字3000,然后计算此地址类型的数字而返回其原类型的数字,由于原类型是long[3],而这个数字存放在3000所标识的内存处,故最后返回3000所对应的二进制数。

容易发现指针返回的是一个地址,数组也是一个地址,当它们原类型相同时,后者可以隐式类型转换为前者,但反之不行,因为数组还具备元素个数这个信息,即long[2]和long[3]的原类型相同,但类型不同。因此有:long a[3]; long *p = a;。这里没任何问题,假设a映射的是3000,则p的值就是3000.因此*p = 3;就是将3放到3000处存放的数组类型的数字的第0个元素中。为了放到第1个和第2个元素中,C++提供了一个所谓的指针运算功能,如下:*( p + 1 ) = 4; *( p + 2 ) = 5;。这里就把4放到第1个元素,5放到第2个元素中。对*( p + 1 ) = 4;,p返回一个long*的数字3000,而p + 1返回long*的数字3004,然后继续后续计算。同理,p + 2返回类型为long*的数字3000+2*sizeof(long)=3008.即指针只能进行整数加减,如:char *p1 = 0; p1++; p1 = p1 + 5 * 8 - 1; short *p2 = 0; p2 += 11; p2——;上面p1的值为40,p2的值也为40,因为p1的原类型是char而p2的是short.因此为了获得数组的第2个元素的值,需*( p + 2 );,这很明显地不便于阅读,为此C++专门提供了一个下标操作符“[]”,其前面接指针类型的数字,方括号中放一整型数字,将指针类型的数字换成地址类型,再将值按前面提到的指针运算规则变换,返回。如long a[4]; long *p = a;,假设a映射的是3000.则a[2] = 1;等效于*( p + 2 ) = 1;,a[2]前面接的是long*类型的数字3000(隐式类型转换,从long[4]转成long*),加2*sizeof(long),返回3008,类型则简单地变成long类型的地址类型。由于“[]”仅仅只是前面说的指针运算的简化易读版本,故也可a[-1] = 3;,其等效于*( p - 1 ) = 3;。由于“[]”前接指针,故也可p[-1] = 3;,等效于a[-1] = 3;。

算规则变换,返回。如long a[4]; long *p = a;,假设a映射的是3000.则a[2] = 1;等效于*( p + 2 ) = 1;,a[2]前面接的是long*类型的数字3000(隐式类型转换,从long[4]转成long*),加2*sizeof(long),返回3008,类型则简单地变成long类型的地址类型。由于“[]”仅仅只是前面说的指针运算的简化易读版本,故也可a[-1] = 3;,其等效于*( p - 1 ) = 3;。由于“[]”前接指针,故也可p[-1] = 3;,等效于a[-1] = 3;。

类型修饰符的重复修饰——多级指针和多维数组

前面提到的类型修饰符中,只有指针、数组和偏移三个类型修饰符是可以连续重复修饰类型的。偏移重复修饰以表示类型嵌套,指针重复修饰被称作多级指针,数组重复则称作多维数组。这看起来好像变复杂了,实际完全没有,只用记住一点:类型修饰符修饰某一原类型后形成一种新的可被认为是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号