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

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

4

3 回答 3

4

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

于 2010-07-02T05:20:07.070 回答
3

ptr最初指向数组的第一个值。(char*)ptr将其从 转换int*char*。向该char*值添加 4 通过4 * sizeof(char)使其指向数组的第二个整数来增加它,假设在 little endian 平台上是 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

阅读有关字节序的更多信息

于 2010-07-02T05:18:24.297 回答
0

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

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

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

在这个例子中,它应该打印2

于 2010-07-02T05:18:39.150 回答