a(数组)+1怎么理解?

题目是这个:intmain(){inta[5]={1,2,3,4,5};int*ptr1=(int*)(&a+1);int*ptr2=(int*)((int)a+1);p... 题目是这个:

int main()
{
int a[5] = {1,2,3,4,5};
int *ptr1 = (int*)(&a + 1);
int *ptr2 = (int*)((int)a + 1);
printf("%x,%x\n", ptr1[-1], *ptr2);
return 0;
}

printf的输出是什么呢(X86体系结构下)?
5,2000000

int *ptr2 = (int*)((int)a + 1); 得到的*ptr2是什么?
同样,(int)a 和 &a 和 a 和 &a[0],都是同一个值,但是它们类型不同。 (int)a的类型是int,是一个整型(注意,不是指针)。所以,加1就是直接加1。于是4个字节的int被截断了。
小端情况下(X86体系结构),a按字节表示是: 0x01,0x00,0x00,0x00,0x02,0x00…… 地址值加1后,得到的int是0x00,0x00,0x00,0x02,连起来就是0x02000000。

1.最后一段中a应该是看成了首地址了,我想问数组直接加数字有意义吗?
2.最后一段没看懂,什么叫int被截断了?(int)a+1为什么会有几个数字,还连起来??

谢谢各位这么晚了。
展开
 我来答
White_MouseYBZ
推荐于2017-06-01 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6710万
展开全部
a+1不是数组+1,而是数组的第一个元素的指针+1,即&a[0]+1,它等于&a[1],即数组的第二个元素的地址(指针)。int *ptr2 = (int*)((int)a + 1);是把指针a强制为int型再+1,把+1后的值再强制成int *型指针,最后赋给int *型指针ptr2。所以int *ptr2 = (int*)((int)a + 1);与int *ptr2 = a + 1;等价。建议初学者不要纠结什么“大端”、“小端”模式,不是因为难,而是因为简单得不值得去考究;它是系统安排多字节数据在内存中的顺序问题,对用户来说一般是透明的,不必去探究;等略有长进,自然完全明白。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式