读书人

HW面试题

发布时间: 2012-03-29 12:53:13 作者: rapoo

HW面试题,求助
#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,为什么呢,求助

[解决办法]
分析:这里需要注意的是&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
[解决办法]
如果为大端模式(例如motorola 68k,powerpc,IBM sys/360等),那么*p2输出结果为100
详见以下
http://codeprac.iteye.com/blog/1237790

读书人网 >C语言

热点推荐