搞不懂,故pp + 1返回类型为long**的数字3008,而*( pp + 1 )仅转换类型,返回类型为long*的地址类型的数字3008,返回类型为long*的数字30
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;将有可能失败)。
问题:
返回类型为long*的地址类型的数字3008,返回类型为long*的数字3004
为什么前面反回的是3008,到后面又变成了3004了呀!不应该是3008吗?这可是PP+1啊,PP的值3004+4应该反回3008呀,然后再对3008这个地址附址为5,不是这样吗?然后5就变成了*p的值了吗!>>>?????????????????????????
问题点数:10、回复次数:1Top
1 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-07-02 04:14:29 得分 0
映射是什么意思?
楼主最好把*( *( pp + 1 ) ) = 5这样的语句翻译成:pp[1][0] = 5,然后再说问题。
不过我看pp[1]是访问非法地址了,所以下面的东西我也不想再看了,把我以前给别人的回复再给你粘一遍吧,也希望大家在遇到这样的贴子时能毫不留情的用这段话来回答
--------->
这是“未定义的结果”(Undefined result),C++中很多操作都是会引发“未定义的结果”的。未定义的操作,故名思义,就是语言对此操作的结果没有定义,由编译器厂商或着操作系统的架构师看着办吧。换言之,一个未定义的操作可能格式化的硬盘,也可能给你上司发送暗示信,当然最可能的结果就是弹出一个程序崩溃的对话框或着仅仅是在你的程序中埋下一颗定时炸弹然后让程序继续执行。
当delete用在非动态分配的变量上会引发未定义的结果。这是C++语言的规定,所以楼主不要再追问为什么了,如果要这样追问下去,你迟早会问到为什么要诞生C++这门“烦人”的语言。
论坛里天天都有成百上千的初学者在问未定义操作而引发的问题,更有甚者就是知道那是违反语言规定的,但还要故意拿某编译器上对一个未定义的操作产生的奇怪现象来论坛寻找原因,或者仅仅是声称他/她终于发现了一个新大陆。我对于这些人一向是强烈鄙视的。有这么多精力何不去多学点该学的东西!
Top




