#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
这样做的目的是什么?
#include<stdio.h>
main()
{
int a[]={0,2,4,6,8};
int *ptr;
ptr=a;
printf("%d", *((char*)ptr+4));
}
*((char*)ptr+4))
这样做的目的是什么?
它将指针转换为指向 char 的指针,然后添加 4 以查看稍后在内存中的 4 char 的内容,最后取消引用结果。在占用 4 个字节的典型情况下int
,它将查看int
数组中第二个字节的第一个字节。这char
将被提升为int
,传递给printf
,并打印出来。
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
阅读有关字节序的更多信息
因为 ptr 指向 a 的地址,所以它
*ptr 是 a 的第一个值,即 0。
通过将 ptr 转换为 char* 并添加 4,代码是说“获取 ptr 存储的地址,向其添加 4,然后在此位置打印值。
在这个例子中,它应该打印2