c语言 这道题咋回事 哪位大神解释一下?求详细。

如题所述

首先明确说一下,这种题目完全没有任何意义,而且在不同的编译器中得到的结果也不一定相同。
题目本意是考查答题者对于不同类型之间的指针进行强制类型转换的理解程度。
先把一个指向char类型的指针强制转换为指向long的指针(即q=(long*)p;),然后对其进行++操作,指针的自增与所指类型有关,long类型在不同编译器中所占长度不一定一样,标准中只是说明其最短不能小于4个字节,并且不能比int小,如果你的编译器中long类型占4个字节,做一次自增就向后移动4个字节,此时再转换会char*类型,打印后结果就是字符串中从第5个字节开始的内容,即efgh;如果你的编译器中long类型占8个字节,做一次自增就向后移动8个字节,此时再转换会char*类型,打印后结果就是字符串中从第9个字节开始的内容,而字符串连带最后的结束符\0在内一共才有9个字节,所以只能打印一个结束符,在屏幕上看不出来。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-11
q=(long*)p; 在我看来,在茫茫编程中没有任何意义,唯一说在这里有意义的是因为这时候指针q 指向了字符串abcdefg,但是这样做 的却是没有必须要,所以后面的q++是指针的移位,因为一个 long在vc占用四个字节所以指针向前移动四位,最后结果应该是efgh本回答被提问者采纳
第2个回答  2015-01-11
#include <stdio.h>
main()
{
char *p="abcdefgh",*r;
long *q;
q=(long*)p;
q++;
r=(char*)q;
printf("%s\n",r);
printf("%d\n",sizeof(long));
}

输出结果是efgh,这里的关键是指针的偏移量问题,q是long,也就是四个字节 q++就移动了四个字节,指向了e所在位置。这个可能编译环境不同而不同,不过可以通过sizeof(long)来验证。
第3个回答  2015-01-11
q=(long*)p;//将char* 类型的p强制转换成long * 类型,q++就会移动long类型大小个字节(32位b编译环境是4),故输出是efgh。
相似回答