int arr[4] = { 1, 2, 3, 4 };
int i = *(int *)((int)arr + 1);
printf("%x\n",i);
就上面的代码而言输出值你认为是多少?
答案如下:
为什么会是这个数字,我当时也很奇怪后面请教老师以及参考资料才把这道题搞明白,我先画个图先了解一下题意
不知道这个图看不看的懂,因为是int类型的数组所以一个数组格子里面有4个字节,那么数组地址是4个4个往上走,所以我上面写的地址(这个地址不是真实地址,是我自己虚拟的)是100 104 108 112。原先arr可以看作指针指向下标为0的数据就是我用红色框起来的。但题上面将arr强转成了整形,就是说现在arr不是指针了,变成了数字,这个数字就是100,现加一,又强转成了指类型那么现在的位置就是我用蓝色框起来的,然后解引用,算出这个格子里的数字是多少。那这个格子里的数字是多少
因为电脑是小端所以数据的存储形式如上图所示,刚开始arr指向的是红色格子框起来的数据,经过题上的+1现变成了蓝色格子框起来的数据,数据再转回因该表示的样子就是00000010 00000000 00000000 00000000 用16进制表示就是2000000。