C指针求教!

tjsummer 2003-10-18 10:39:13
#include<stdio.h>
void main()
{int a[5]={1,2,3,4,5},b[5]={1,2,3,4,5},c[5]={1,2,3,4,5},*p=a,*q=b,*w=c;
printf("\n\n%3d,%3d,%3d\n\n",*p,*q,*w);
printf("\n\n%3d,%3d,%3d\n\n",*p++,*(q++),(*w)++);
printf("\n\n%3d,%3d,%3d\n\n",*p,*q,*w);
printf("\n\n%3d,%3d,%3d\n\n",a[1],b[1],c[1]);
}

我想着,第一次全部输出1,1,1
第二次应该输出 1,然后p++,p改指向2;
2,q++指向2,然后输出q;
1,先得到*w,1,然后给1 ++得2;改变了c[1];
这样的话,的三次输出应该是2,2,2
那么最后输出第一项时,应该是1,1,2,因为c[1]在第二次输出时被改变了。而且的三次输出的最后一个2,不是c[2],而是,c[1];
可是,运行的结果并不是这样子,不知道为什么,故来求教!

我不是钻牛角尖,只是想通过它,了解一下× 与++的关系,谢谢各位!
...全文
43 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
Anorld 2003-10-18
  • 打赏
  • 举报
回复
经过讨论,尽管自己错了,但还是学到了不少东西,谢谢!
tjsummer 2003-10-18
  • 打赏
  • 举报
回复
收到,我这下明白了,谢谢各位,无论错于对,只有讨论实践后才明白,这下,不会在混淆了。谢谢,非常感谢各位,虽说问题不大,但是高明白了还是蛮高兴的!
TianGuangZao 2003-10-18
  • 打赏
  • 举报
回复
楼上搞错了。
++ 比 * 优先。

*p++ 等效于 *(p++)

参考:
运算符 结合律
( ) [ ] -> . 从左至右
! ~ ++ -- (类型) sizeof 从右至左
* / % 从左至右
+ - 从左至右
<< >> 从左至右
< <= > >= 从左至右
== != 从左至右
& 从左至右
^ 从左至右
| 从左至右
&& 从左至右
|| 从右至左
?: 从右至左
= += -= *= /= %= &= ^= 从左至右
|= <<= >>=
Anorld 2003-10-18
  • 打赏
  • 举报
回复
是有不同:

* 优先级比++高
加()改变优先级
*p++,是先取p的内容,然后等表达式执行完,p的内容加1
*(p++),是指针p 的位置加1,而p的内容不变

tjsummer 2003-10-18
  • 打赏
  • 举报
回复
“*(q++),是先取q的内容,然后等表达式执行完了,q指针加1,所以还是1”


那么
*p++和 *(p++)有不就没什么不同么?是这意思么?
chaonet 2003-10-18
  • 打赏
  • 举报
回复
我是个新手,我也不太懂ya ,为什么第2行不是1 2 1了
njuhuangmy 2003-10-18
  • 打赏
  • 举报
回复
呵呵

改成 楼上 的 下标 0

就会得到 你 想要 的啦
tjsummer 2003-10-18
  • 打赏
  • 举报
回复
对,因为我写错了,最后我想输出的是a[0]b[0]c[0],错写成了a[1]....所以大家的都是2 2 2
抱歉
showming 2003-10-18
  • 打赏
  • 举报
回复
我懂了!
Anorld 2003-10-18
  • 打赏
  • 举报
回复
无论从分析,还是实践,结果都是
1 1 1
1 1 1
2 2 2
2 2 2
我的tc2.0运行就是这个结果
Anorld 2003-10-18
  • 打赏
  • 举报
回复
*(q++),是先取q的内容,然后等表达式执行完了,q指针加1,所以还是1
suisuibianbian 2003-10-18
  • 打赏
  • 举报
回复
因为是先输出值 1 之后,再由 1 变成 2 的
*(q++) 和 *(++q) 是不一样的
tjsummer 2003-10-18
  • 打赏
  • 举报
回复
tc 2运行的结果是
1 1 1
1 1 1
2 2 2
1 1 2
tjsummer 2003-10-18
  • 打赏
  • 举报
回复
哦,失误,那第二次为什么不是1,2,1呢?
Anorld 2003-10-18
  • 打赏
  • 举报
回复
首先 * 优先级比++高!
第一行不用说了.
第2行输出,还应是p,q,w的"内容",
执行后p,w的内容加1,即a[0]=2,c[0]=2,q的内容不变,但指针位置加了1,指向a[1]
但p,w的位置不变

所以第3行输出:p,q,w的内容全是2

至于第4行,打印a[1],b[1],c[1],程序中都没有修改他们的内容,所以都是2,
注意,数组下标是从0开始的!
程序结果: 1 1 1
1 1 1
2 2 2
2 2 2

showming 2003-10-18
  • 打赏
  • 举报
回复
结果是:1,1,1
1, 1, 1
2, 2, 2
2, 2, 2
liem 2003-10-18
  • 打赏
  • 举报
回复
结果是该2 2 2啊。
你输出的是a[1],b[1],c[1],而不是a[0],b[0],c[0]!!!

69,369

社区成员

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

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