类型转换在下面的代码中的声明1中没有效果吗?

时间:2014-11-30 07:14:31

标签: c pointers casting

#include<stdio.h>

int main()
{
    int arr[3] = {2, 3, 4};
    char *p;
    p = arr;
    p = (char*)((int*)(p));
    printf("%d, ", *p);
    p = (int*)(p+1); //............statement 1
    printf("%d", *p);
    return 0;
}

在上面的代码中,p = (int*)(p+1);表示字符指针是整型指针的类型转换。因此,当我们取消引用p时,它会将内容提取到下一个int大小(2个字节或4个字节,具体取决于编译器)。但是当我在www.indiabix.com上解决这个问题时,他们已经给出了

  

回答:2,0

如何2, 0?根据我的分析,答案应该是2, 3。任何人都可以解释什么是正确答案以及为什么?

1 个答案:

答案 0 :(得分:2)

假设int占用四个字节。

在小端系统中,arr的内存布局如下:

|   | <--- one byte
+---+---+---+---+---+---+---+---+---+---+---+---+
| 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 | 0 | 0 | 0 |
+---+---+---+---+---+---+---+---+---+---+---+---+

在大端系统中,arr的内存布局如下:

|   | <--- one byte
+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 0 | 0 | 2 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 4 |
+---+---+---+---+---+---+---+---+---+---+---+---+

在小端系统中,

*p = 2;
*(p+1) = 0;

在大端系统中,

*p = 0;
*(p+1) = 0;

根据您的平台,输出将为:

2 0

0 0

您拥有的代码可能意味着混淆。这条线

p = (char*)((int*)(p));

不做该死的事。

该行

p = (int*)(p+1);

具有与以下相同的效果:

p = p+1;