菜鸟问题

rafter263 2003-01-13 03:40:22
main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);

printf("%d %d" , *(a+1), *(ptr-1) );

}
对&a+1不解,请大虾帮我说说!
...全文
28 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rafter263 2003-01-13
  • 打赏
  • 举报
回复
谢谢各位热心人!
熊主任 2003-01-13
  • 打赏
  • 举报
回复
楼上说得对,我没看仔细。用了&a就是把a当一个二维数组处理了,虽然是加1,但是性质变了,所以p - 1就变成了a的最后一个元素了!再次感谢楼上几位指出。
wangyong312 2003-01-13
  • 打赏
  • 举报
回复
#include <stdio.h>

main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);

printf("%d %d %d %d" , *(a+1), *(ptr-1) ,a,ptr );

}
结果为: 2 5 1245036 1245056
a与ptr之间相差20个字节,因为每个int的字节数为4(在c++中)
bugfree 2003-01-13
  • 打赏
  • 举报
回复
&a+1 equal address +4byte, but ptr-1 equal address-1byte,
Look at the following code:

main()
{
int i;
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);

printf("%d %d\n" , *(a+1), *(ptr-1) );
for (i=0; i<5; i++)
printf("%x\t", (int) (&a + i) );

printf("\n%x %x %x", (int)&a+1, (int)ptr, (int) ptr-1);
}
[gdc5e46:(allanz)]>a.out
2 5
effff220 effff234 effff248 effff25c effff270
effff221 effff234 effff233

wangyong312 2003-01-13
  • 打赏
  • 举报
回复
a是一个数组,本来是一维的。
但是&a就是去a的地址,这时其实把a 看作了二维数组。
&a+1就是去二维数组a的第二行的首地址,
所以*(ptr-1)得到的就是数组a的最后一个元素,即5。
rafter263 2003-01-13
  • 打赏
  • 举报
回复
我在VC下编译运行后的结果是2 5呀!
熊主任 2003-01-13
  • 打赏
  • 举报
回复
对于数组来说a和&a是一回事,都是取数组首地址。所以ptr从a的第2个元素开始,输出结果应该是2, 1。
假设数组首地址为0x1000,机器工作与32位系统,1个int的大小为32位,那么a + 1所指向的地址就是0x1004,前面加个(int*)是强制类型转换,保证指向的是int类型的数据。

69,371

社区成员

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

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