[紧急求助]遇到一题,菜鸟求助!!

陌上花花 2010-08-22 09:55:38

#include <stdio.h>
main()
{
int b=3;
int arr[]={6,7,8,9,10};

int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d\n",*ptr,*(++ptr));
}

输出结果为8 8 但是分析不出来,请朋友们帮忙下。
...全文
210 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wibnmo 2010-08-24
  • 打赏
  • 举报
回复
关键点是printf函数是从右往左输出的。
hagelee 2010-08-23
  • 打赏
  • 举报
回复
学习了!
lovemeizh 2010-08-23
  • 打赏
  • 举报
回复
#include <stdio.h>
main()
{
int b=3;
int arr[]={6,7,8,9,10};

int *ptr=arr; ..... (1)

*(ptr++)+=123; .......(2)

printf("%d,%d\n",*ptr,*(++ptr)); ......(3)

}



(1)表明将数组arr的首地址赋给指针ptr,即指针ptr指向了数组的第一个元素6。

(2) *(ptr++)+=123;
注意ptr++是先引用后增值,即先把指针ptr引用出去,再行增值。
因此可以分解成以下两步

*ptr=*ptr+123; ......(4)
ptr=ptr+1; .......(5)

另外,指针加1表示指针ptr指向下一个元素,在(5)中就是这样的。此时指针ptr指向了7
而(4)的意思是说ptr指向的地址中存储的数据值变为129,当然数组的元素不变,只是指针重新指向了一个地方A,A中的值是129。

#include <stdio.h>
main()
{
int b=3;
int arr[]={6,7,8,9,10};

int *ptr=arr;

*(ptr++)+=123;

printf("%d\n",*ptr);
printf("%d\n" , *(ptr-1));

}

此时输出结果为7 129

(3)意思是输出值,printf是从右到左输出值的。
在这是要意识到指针ptr指向了7。
因此,*(++ptr)是先增值后引用,即先把指针向下移一位再引用出去,所以指向了8之后再引用出去,所以
*(++ptr)的结果是8。 *ptr的结果自然也是8

*ptr表示取出指针ptr所指向的地址中所存储的数据值。
swl82560397pq 2010-08-23
  • 打赏
  • 举报
回复
主要纠结在printf的参数读入顺序和++操作。
陌上花花 2010-08-23
  • 打赏
  • 举报
回复
感谢朋友们的帮忙。似乎有些明白了,但是还要自己多学习下。
visayafan 2010-08-23
  • 打赏
  • 举报
回复
#include <stdio.h>
void main()
{
int i=0;
printf("%d,%d,%d\n",++i,++i,++i);
}

//自右向左扫描,先左后右输出
chaoliu1024 2010-08-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lovestefanie 的回复:]
ls程序的目的是什么?
[/Quote]貌似是一道公司的面试题,程序目的就是考来应聘的人...
rig622 2010-08-22
  • 打赏
  • 举报
回复
楼上正解。。。学习了。。。。
lovestefanie 2010-08-22
  • 打赏
  • 举报
回复
ls程序的目的是什么?
chaoliu1024 2010-08-22
  • 打赏
  • 举报
回复
#include <stdio.h>
int main(void)
{
int b=3;
int arr[]={6,7,8,9,10};

int *ptr=arr; // 现在ptr指向6
*(ptr++)+=123; // 现在ptr指向7,第一个元素变为129
printf("%d,%d\n",*ptr,*(++ptr)); // 以编译器printf求参顺序从右往左计算,
// 先执行*(++ptr),现在ptr指向8,*ptr值为8.
return 0;
}

貌似以前有过这样一个帖子...
kingteng 2010-08-22
  • 打赏
  • 举报
回复
正常人不写这样的代码,只有考试才有
qgqch2008 2010-08-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 d1x2p3 的回复:]

printf 参数从右往左读入,*ptr 自增两次,为 ptr=arr+2;
[/Quote]
正解了
#include <stdio.h>
main()
{
int b=3;
int arr[]={6,7,8,9,10};

int *ptr=arr;
*(ptr++)+=123;
printf("%d\n",*(--ptr));
}

这样就输出129啦
Dstnoe 2010-08-22
  • 打赏
  • 举报
回复
printf 参数从右往左读入,*ptr 自增两次,为 ptr=arr+2;
*(ptr++)+=123; 中 自增是下次加1,本次还为arr。 printf("%d",*arr) ;结果为129

70,021

社区成员

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

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