2007年12月12日星期三

Magic C Point

在C/C++ 语言里面,指针真是一个奇妙、魔力无穷而又难以掌握的东西。今天上 csdn 看到下面这一段代码,要写出结果( 原地址在:一道考遍东北三省和青岛没有一人做出来的简单题目 )


[code:c]
#include
int main()
{
int a[5]={1,2,3,4,5};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
[/code]


37楼 kingqin 大牛给的答案不错,学习了。
[code:c]
#include
int main(void)
{
int a[5]={1,2,3,4,5};
//假设a的地址为0x80000000,sizeof(int)=4
//假设是little-endian,则0x80000000-0x80000013的数据为:
// addr: 00 01 02 03 04 05 06 07
// data: 01 00 00 00 02 00 00 00
// addr: 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13
// data: 03 00 00 00 04 00 00 00 05 00 00 00
int *ptr1=(int *)(&a+1);
//ptr1 = 0x80000000+20=0x80000014
int *ptr2=(int *)((int)a+1);
//ptr2 = 0x80000000+1 = 0x80000001
//&ptr1[-1] = 0x80000014-4 = 0x80000010 ;
//so ptr1[-1] = *(int *)0x80000010 = 5
//*ptr2 = *(int *)0x80000001 = 0x02000000
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
[/code]


csdn 上很多人说这个很简单,意思是其实就是 我太菜了! 怎么办啊 ?!!

1 条评论:

博弈 说...

Hi ipluss兄,

刚看到你的留言,所以来看看你的新家。我没找到能给你留言的留言板,所以就发到这来了。最近可好?可是有很长时间没见你的博客了,呵呵。真是有中国特殊的“和谐”,信息产业部的真是很无聊,动不动的就搞点“和谐”。不过,你发文也确实得稍微注意点,没必要在自己博客发那些牢骚。你的链接我已经给换成现在的网址了。应该快期末考试了吧,好好准备期末考试噢!

发表评论