#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
这是什么目的?
答案 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