在今天做题时遇到了这样一个问题
#include<stdio.h>
int main()
{
int arr[] = {1,2,3};
int *p = (int *)((int)&arr+1);
printf("%08x\n",*p);
return 0;
}
求打印结果。
要做这道题要对数组arr的实际存储有所了解。假设arr从100号内存地址开始,那么arr[0]所占100-104,arr[1]占104-108,以此类推。整形1的10进制值为0x 0000 0001,在pc上按小端存储为0x 0100 0000,以此类推整形2的存储为0x 0200 0000 。如下图:

按照上图,(int)&arr这个表达式个结果是100(&arr与arr值相同,有兴趣可以测试一下)。那么(int)&arr+1的值就是101。再将其强转为int *类型,这个值又表示指向101-105这段内存的地址。int *p = (int *)((int)&arr+1);一句后,p表示101-105的位置。

小端存储值为0000 0002,所以*p的值为0x 0200 0000。%08x打印8位16进制,所以输出结果位0200 0000