一道c语言指针题

著一 2012-03-26 03:28:56
请问这道题输出结果是多少?为什么?
main()
{
int a[5] = {1,2,3,4,5};
int *ptr = (int*)(&a+1);

printf("%d %d" , *(a+1), *(ptr-1));
}
...全文
290 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
著一 2012-03-27
  • 打赏
  • 举报
回复
谢各位大侠,小弟第一次发帖!
goldbeef 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xuexingyang 的回复:]

C/C++ code

#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
//假设a的地址为0x80000000,sizeof(int)=4
//假设是little-endian,则0x80000000-0x80000013的数据为:
// addr: 00 01 02 03 0……
[/Quote]++
wintree 2012-03-26
  • 打赏
  • 举报
回复
2 和5 推荐你看一个课程就啥都知道额
xuexingyang 2012-03-26
  • 打赏
  • 举报
回复

#include <stdio.h>
int main(void)
{
int a[5]={1,2,3,4,5};
//假设a的地址为0x80000000,sizeof(int)=4
//假设是little-endian,则0x80000000-0x80000013的数据为:
// addr: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11 12 13
// data: 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00
int *ptr1=(int *)(&a+1); //ptr1 = 0x80000000+20=0x80000014
int *ptr2=(int *)((int )a+1); //ptr2 = 0x80000000+1 = 0x80000001
//&ptr1[-1] = 0x80000014-4 = 0x80000010,so ptr1[-1] = *(int *)0x80000010 = 5
//*ptr2 = *(int *)0x80000001 = 0x02000000
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}


这个解释的好。
xuexingyang 2012-03-26
  • 打赏
  • 举报
回复
关键是int 指针指针加1,相当于加了4个字节,在32位机上。
soft_and_hard_ware 2012-03-26
  • 打赏
  • 举报
回复
4楼威武,此所谓知其然,并知其所以然也,总结下:

int a[5] = { 1, 2, 3, 4, 5 };

若a=123456;

那么,(a + 1) = 123460; // int类型,单位大小为4
(&a) = 123456;
(&a + 1) = 123476;
一根烂笔头 2012-03-26
  • 打赏
  • 举报
回复
很像某些公司的面试题
querdaizhi 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 czh3642210 的回复:]

第二个(&a+1)中的&a取得是整个数组的首地址,&是对整个数组操作的,所以(&a+1)即ptr1指向了a[4]后面的内存区,ptr1[-1]指针后退一步,指向a[4]输出为5
[/Quote]

受教了。
苹果皮 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 a443475601 的回复:]

一楼正解
ptr = a + sizeof(a) - sizeof(int) = a+5
*(ptr-1) = *(a+5-1) = *(a+4)
不知道对不对
[/Quote]

错了 ptr = a + sizeof(a) = a+5
苹果皮 2012-03-26
  • 打赏
  • 举报
回复
一楼正解
ptr = a + sizeof(a) - sizeof(int) = a+5
*(ptr-1) = *(a+5-1) = *(a+4)
不知道对不对
wesweeky 2012-03-26
  • 打赏
  • 举报
回复
一楼已经正解啦
Lynn_Iris 2012-03-26
  • 打赏
  • 举报
回复
2 5
Corner 2012-03-26
  • 打赏
  • 举报
回复
&用于数组时将数组可以把数组看做一个变量,int a[5]表明该变量的长度为5,所以&a+1获得的地址应该是a的地址加上5
东大坡居士 2012-03-26
  • 打赏
  • 举报
回复
definitely, it is 2 and 5
面包大师 2012-03-26
  • 打赏
  • 举报
回复
第二个(&a+1)中的&a取得是整个数组的首地址,&是对整个数组操作的,所以(&a+1)即ptr1指向了a[4]后面的内存区,ptr1[-1]指针后退一步,指向a[4]输出为5
面包大师 2012-03-26
  • 打赏
  • 举报
回复
第一个不用解释,
condlover 2012-03-26
  • 打赏
  • 举报
回复
楼上的 正解 ,, 楼主 你想输出什么结果呢
面包大师 2012-03-26
  • 打赏
  • 举报
回复
2 和 5

69,381

社区成员

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

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