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为什么会有几个数字,还连起来??
谢谢各位这么晚了。 展开
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为什么会有几个数字,还连起来??
谢谢各位这么晚了。 展开
1个回答
展开全部
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;等价。建议初学者不要纠结什么“大端”、“小端”模式,不是因为难,而是因为简单得不值得去考究;它是系统安排多字节数据在内存中的顺序问题,对用户来说一般是透明的,不必去探究;等略有长进,自然完全明白。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询