a是整型数组名 (int *)(&a+1) 指向了哪里

yaoxw062240 2010-01-06 03:35:18
详细如下:

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

p1,p2分别指向了哪里
那么 printf("%x",p1[-1])会输出什么呢
...全文
426 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoxw062240 2010-01-06
  • 打赏
  • 举报
回复
恩 已结 谢谢了
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yaoxw062240 的回复:]
恩  搞明白了 谢谢大家
[/Quote]

搞定结贴吧。。
yaoxw062240 2010-01-06
  • 打赏
  • 举报
回复
恩 搞明白了 谢谢大家
hityct1 2010-01-06
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复

void main()
{
int a[5]={1,2,3,4,5};
int *p1=(int *)(&a+1);
int *p2=(int *)((int)a+1);
printf("%p %p",a,p2);
printf("\n%x %x",a[0],p2[0]);

}



运行这个,输出:
0012FF6C 0012FF6D
1 2000000Press any key to continue

首先,int *p2=(int *)((int)a+1); //a先被转成int,所以+1,只后移了一个字节的位置。

再看小段字节序布局。

0x01000000 0x02000000

现在p2[0]的内容其实是0x00000002

小段字节序读到的其实是0x02000000,也就是33554432




  • 打赏
  • 举报
回复
[Quote=引用楼主 yaoxw062240 的回复:]
详细如下:

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

p1,p2分别指向了哪里
那么 printf("%x",p1[-1])会输出什么呢
[/Quote]


1.&a是指向a的指针,&a+1指向数组a后面一个数组,也就是理论上a[5]的首地址,所以p1[0]就是a[5],越界了。

而第2种情况就复杂了,设计到小端字节序,跟指针类型偏移。

sandyandy 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pur_e 的回复:]
&的类型是int (*)[5]
&a+1表示向前移动一维,就是5个int

然后前置转化为int *,就是说p1指向了a[4]后面的一个位置,可以认为是a[5]

所以,printf("%x",p1[-1])会打印a[4]


p2:(int)a,把指针的值转化为int ,然后加1,再强制转化为int *

这里的加1就是普通的数值加1,不是移动一个int的位置,就是说p2指向的是a[0]的3个字节和a[1]的一个字节组成的int
[/Quote]

很好很正确
pur_e 2010-01-06
  • 打赏
  • 举报
回复
&的类型是int (*)[5]
&a+1表示向前移动一维,就是5个int

然后前置转化为int *,就是说p1指向了a[4]后面的一个位置,可以认为是a[5]

所以,printf("%x",p1[-1])会打印a[4]


p2:(int)a,把指针的值转化为int ,然后加1,再强制转化为int *

这里的加1就是普通的数值加1,不是移动一个int的位置,就是说p2指向的是a[0]的3个字节和a[1]的一个字节组成的int
james_hw 2010-01-06
  • 打赏
  • 举报
回复
最好lz能把程序放到大端和小端的机器上试一试,另外忘了,注意TC和VC的区别(有的机器,int 是两个字节)
james_hw 2010-01-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 thefirstz 的回复:]
p1指向a[5]
p2用法不太好,指向a[0]的第二个字节
printf("%x",p1[-1])会输出a[4]
[/Quote]

p2指向的不是第二个字节。。。这道面试题还是比较常见的
james_hw 2010-01-06
  • 打赏
  • 举报
回复
int *p1=(int *)(&a+1); //数组指针+1,因此p1[-1]是5
int *p2=(int *)((int)a+1); //注意这里是地址+1,因此p2指向的空间需要注意大小端问题
pengzhixi 2010-01-06
  • 打赏
  • 举报
回复
int *p1=(int *)(&a+1);//p1指向了a[5]
昵称很不好取 2010-01-06
  • 打赏
  • 举报
回复
p1指向a[5]
p2用法不太好,指向a[0]的第二个字节
printf("%x",p1[-1])会输出a[4]

69,382

社区成员

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

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