现在的位置: 首页 > 综合 > 正文

在首页上看到的一道有趣的题

2012年05月04日 ⁄ 综合 ⁄ 共 552字 ⁄ 字号 评论关闭

#include <stdio.h>
  int main( void )
  {
       int a[4] = {1,2,3,4};
       int *ptr1 = (int*)(&a+1);
       int *ptr2 = (int *)((int)a+1);
       printf("%x\n",ptr1[-1]);
       printf("%x\n",*ptr2);
      return 0;
  }
我在x86系统上打印出结果是:
4
2000000
下面来分析一下结果:
&a+1这个表达式的结果是a[3]后面的内存地址也就是a+4或(&a[4])
因为a的类型是指向4个整形元素的数组的地址对a+1所得的结果就是将指针向后移4个
整形指针的偏移量那么&a+1就是a[4]。现在把这个地址赋给ptr1。
ptr1[-1]表达式的值是*(ptr-1)也就是a[3]所以第一个printf打印出4。
在来看下一个表达式:
(int)a+1这个表达式先将a强制转换成整形然后再加1,这个表达式的值是a的下一个字节的地址但它的类型不是指针而是整形。
int *ptr2 = (int*)((int)a+1)这个表达式先将上一步得到的整形值转换为指针然后在赋给指针ptr2,那么现在ptr2就指向了a的后一个字节
如果是小端系统那么就打印2000000这个值。大端系统就打印10000。

抱歉!评论已关闭.