qq 游戏人生 好友:指针问题?!

来源:百度文库 编辑:高校问答 时间:2024/05/01 00:32:37
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呀,搞不懂啊

这样理解吧: *(pp+1)返回类型为long*的地址类型的数字3008,而3008里存的数字是3004,故*(*(pp+1))返回类型为long的地址类型的数字3004。

C还保留着指针,总觉得有点烦!