HW面试题,求助

jingsuxuyilq 2012-03-13 03:04:43
#include<stdio.h>
int main()
{
int a[5]={1,2,3,4,5};
int *p1=(int*)(&a+1);
int *p2=(int*)((int)a+1);
printf("%x,%x",p1[-1],*p2);
return 0;
}
输出*p2为2000000,为什么呢,求助
...全文
156 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferisnotsatan 的回复:]

(int)a 然后加 1。换大端系统,应该就不是2000000了
[/Quote]
还得int是32位的前提下。找个16位的也不是这个值。
luciferisnotsatan 2012-03-13
  • 打赏
  • 举报
回复
(int)a 然后加 1。换大端系统,应该就不是2000000了
面包大师 2012-03-13
  • 打赏
  • 举报
回复
如果为大端模式(例如motorola 68k,powerpc,IBM sys/360等),那么*p2输出结果为100
详见以下
http://codeprac.iteye.com/blog/1237790
inzaghian 2012-03-13
  • 打赏
  • 举报
回复
a是数组名 和指针不是一个概念 可以当指针引用 但不能作指针偏移操作
面包大师 2012-03-13
  • 打赏
  • 举报
回复
如果为小端模式(例如intel x86兼容处理器,8051,avr等),那么*p2(注意使用题目中使用了%x输出格式)输出结果为2000000
面包大师 2012-03-13
  • 打赏
  • 举报
回复
*p2的值则根据处理器的不同而可能有不同的结果(参见大端模式和小端模式 endianness )
Abel Lee 2012-03-13
  • 打赏
  • 举报
回复
分析:这里需要注意的是&a是整个数组的首地址,a是数组首元素的首地址,其值相同,但是意义不同。

对于指针p+1,指针变量与一个整数相加减并不是用指针变量里的地址直接加减这个整数,这个整数的单位不是字节而是元素的个数。

知道了这些就好办了。

int *ptr1 = (int *)(&a+1);

&a+1这下加的1跑到了a[5](虽然不存在),ptr1[-1]=*(ptr1-1),这下跑到了a[4],所以结果是5;

int *ptr2 = (int *)((int)a+1);

a是数组a的首元素的首地址。(int)a+1是元素a[0]的第二个字节的地址。由于是int型,所以占4个字节

大端模式:

a[0] a[1] a[2] a[3]

1 2 3 4

0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x03 0x00 0x00 0x00 0x04

在32位的x86系统下,是小端模式——认为第一个字节是最低位字节

在内存中存放为:

a[0] a[1]

0x01 00 00 00 0x02 00 00 00

所以读取为:0x02000000

答案为:2000000

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧