快速业务通道

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

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30
原类型的类型。

long **p;。p映射的数字是一long**的地址类型的数字,则p;返回的数字的类型就是long**.对于*p;就可将p返回的数字的类型看作是long*的指针类型,原类型为long*,故*p返回的数字的类型是long*的地址类型的数字,而**p;则返回long的地址类型的数字。

对于long a[2][3];也是同样。由于其原类型是long[3],故可以long ( *p )[3] = a;,进而a[1]返回的是long[3]的地址类型的数字,而a[1][2]返回的就是long的地址类型的数字。

注意为什么a的原类型不是long[2]而是long[3].在《C++从零开始(五)》中已经说明,当多个类型修饰符同时修饰时,修饰顺序是从左到右,而相同连续修饰符的修饰则从右到左以符合人的习惯,而“()”则降低修饰优先度。如long*[2][3]是long的指针类型的数组[3]类型的数组[2]类型,即它是一个数组类型,有两个元素,原类型是long*[3].也就是“[2]”最后修饰,优先级最低(从其所修饰的数字的类型方面来看,也可认为其优先级最高)。而long*[3]*[2][3]却是一个错误的类型,虽然按照前面所说的从左到右进行修饰没有任何问题,但C++规定变量定义时,指针类型修饰符必须在变量名的左侧,数组类型修饰符必须在右侧以符合人的阅读习惯,也因此才会在类型中出现“()”以降低修饰优先度。所以long*[3]*[2][3]应写成long *( *[2][3] )[3],欲定义变量则long *( *p[2][3] )[3];,其中最后修饰的是“[2]”(不是“[3]”,因相同连续修饰符修饰时是从右到左而非从左到右)。故p是一个有两个元素的数组,原类型为long *( *[3] )[3],而long *( *( *pp )[2][3] )[3] = &p;没有任何问题,因为最后修饰的是“*”,而原类型为long *( *[2][3] )[3].

除此以外还应注意一件事——不管什么多级指针,其长度都为4字节(这是对于32位操作系统,而成员指针可能不止4个字节),但数组的维数越多,类型的长度就越长(当然,如果元素个数为1则长度没有变化)。如long ***p;,此时只分配4个字节内存空间,而long a[2][3][5];则分配2*3*5*sizeof(long)=120个字节的内存空间。如下:

long a = 0; long *p = &a, **pp = &p; long b[2][3][4];

假设上面a映射的是3000,则p就映射3004,pp就映射3008,而b映射3012.如上赋值后,a的值为0,类型为long;p的值为3000,类型为long*;pp的值为3004,类型为long**;b的值为3012,类型为long[2][3][4].

对于*( *( pp + 1 ) ) = 5;,pp返回类型为long**的数字3004,而原类型long*的长度是4个字节,故pp + 1返回类型为long**的数字3008,而*( pp + 1 )仅转换类型,返回类型为long*的地址类型的数字3008,返回类型为long*的数字3004,故*( *( pp + 1 ) )返回类型为long的地址类型的数字3004,而*( *( pp + 1 ) ) = 5;则将5按照long的存放规则放到3004所标识的内存中,结果p的值变为5而不再是3000(运气极好地5是正数,此时long类型的数字转换规则和long*一样),进而如果再继续*p = 1;将错误(应注意上面是假设编译器顺序安放a、p和pp,进而使pp的地址较p多4.不同的编译设置和编译器将不一定如上顺序安放局部变量,则*( *( pp + 1 ) ) = 5;将有可能失败)。

对于*( *( *( b + 1 ) + 1 ) + 1 ) = 5;,b返回类型为long[2][3][4]的数字3012,原类型为long[3][4],则b + 1将先进行隐式类型转换以将3012转换为long(*)[3][4],而sizeof(long[3][4])=48字节,则b + 1将返回类型为long(*)[3][4]的数字3012+48=3060,而*( b + 1 )返回类型为long[3][4]的地址类型的数字3060,再返回类型为long[3][4]的数字3060.则*( b + 1 ) + 1返回类型

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号