什么是`*((char *)ptr + 4))`做什么?

时间:2010-07-02 05:07:41

标签: c pointers pointer-arithmetic

#include<stdio.h>
main()
{
  int a[]={0,2,4,6,8};
  int *ptr;
  ptr=a;
  printf("%d", *((char*)ptr+4));
}

*((char*)ptr+4))这是什么目的?

3 个答案:

答案 0 :(得分:3)

它将指针视为指向char的指针,然后添加4以查看内存中4个字符的内容,最后取消引用结果。在int占用4个字节的典型情况下,它将查看数组中第二个int的第一个字节。 char将被提升为int,传递给printf并打印出来。

答案 1 :(得分:2)

ptr最初指向数组的第一个值。 (char*)ptr将其从int*投射到char*。将char*值加4会使其增加4 * sizeof(char),使其指向数组的第二个整数,假设在小端平台上有32位(4字节)int和一个字节char。外部*取消引用它,因此输出2

如果你没有将其投放到char* - 就像*(ptr+4)一样 - 它会向指针添加4 * sizeof(int),因此你已经获得8,(a[4] )作为输出。


更新:玩得开心!

#include<stdio.h>
main()
{
    int a[]={0x00010203, 0x04050607};
    int *ptr;
    int i, j;
    ptr=a;
    for(i = 0; i < 2; i++) {
        for(j = 0; j < 4; j++)
            printf("%d", *((char*)ptr + 4 * i + j));
        printf("\n");
    }
}

我得到了输出:

3210
7654

如果你在大端机器上试试这个,你就得到了

0123
4567

详细了解endianness

答案 2 :(得分:0)

因为ptr指向a的地址,所以

* ptr是a的第一个值,或者是0。

通过将ptr转换为char *并添加4,代码说“获取ptr存储的地址,向其添加4,然后在此位置打印该值。

在此示例中,它应该打印2