Chinaunix首页 | 论坛 | 博客
  • 博客访问: 227516
  • 博文数量: 42
  • 博客积分: 2618
  • 博客等级: 少校
  • 技术积分: 385
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-26 10:04
文章分类

全部博文(42)

文章存档

2013年(2)

2012年(2)

2011年(3)

2010年(17)

2009年(18)

我的朋友

分类: C/C++

2010-01-08 13:43:45

求最后结果

int main(void)
{
   int a[5] = { 7, 8, 9, 10, 11 };
   int *ptr1 = (int *)(&a + 1);
   int *ptr2 = (int *)(a + 1);
   int *ptr3 = (int *)(&a[0]+1);
   int *ptr4 = (int *)((int)a + 1);
   
   printf("%#x\t%#x\t%#x\t%#x\n", ptr1[-1], *ptr2,*ptr3,*ptr4);

   return 0;
}

&a、a都是数组a的起始地址,但是(int *)(&a + 1)表示的是数组a的地址加上了4*5,即&a表示的是整个数组所占有的地址,a则表示a数组内一个元素占用的地址相当于&a[0],(int)a + 1即是将地址a转换为整形变量了,所以

ptr1[-1] = *((int *)(ptr1-1)) = a[4]

 

*((int *)(a + 1)) = a[1]

*((int *)(&a[0] + 1)) = a[1]

*((int *)((int)a + i))的值是&a[i/4]内4-i-1个字节的组合,该值与机器大端小端有关。

纯属个人理解,有误请指正。

阅读(1657) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-15 16:37:19

不错,受教了