深蹲锻炼方法:C++指针?!

来源:百度文库 编辑:高考问答 时间:2024/05/03 00:58:28
指针问题?!
悬赏分:0 - 离问题结束还有 12 天 22 小时
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;将有可能失败)。

为什么而*( pp + 1 )仅转换类型,返回类型为long*的地址类型的数字3008,返回类型为long*的数字3004
为什么先反回3008然后又反回3004呀,搞不懂啊

老大,我说了让你不要用“映射”这个词,这不是标准的称呼

直接说 a 变量的存储地址是 3000,p 的存储地址是 3004,p 指向地址 3000。这样比较清楚。

另外,建议你在纸上画个图,这东西只是玩文字游戏而已,画个图就非常清楚了。

本人邮箱是:lqiyl@163.com 本以为自己对C++指针了解一点,结果看你出的题都晕咯!你说的映射是他本身的值还是它指向的类型的值?

交个朋友吧!(我对编译了解的不算多)