c指针的问题-指针p如何变化的?

DevPlus 2011-07-30 11:10:20
问题来自百度知道,源地址http://zhidao.baidu.com/question/299302392.html

程序代码如下

#include<stdio.h>
void main()
{
int *p,a[3]={0,1,2};
p=a;
printf("%d %d %d %d %d\n",p,a,*(p+1),p,a[1]);
printf("%d %d %d %d %d %d %d\n",&a[1],p,*++p,p,*p,p,a[1]);

}


原提问者的执行结果为

1245040 1245040 1 1245040 1
1245044 1245044 1 1245040 0 1245040 1

有回答说

引用
Answer1.

首先,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左,而在你的编译系统恰好是由右向左的,因此后面的p是指向数组首元素的,然后“*++p”先将p指向下一个数组元素,然后输入p所指的元素,剩下的p就指向第二个元素了


按这样理解确实能解释通,但是我的执行结果为

2291576 2291576 1 2291576 1
2291580 2291580 1 2291580 1 2291580 1
第二个输出中p的指针变化跟它的不一样(即使忽略了左右顺序)
原帖中有这样的回复

引用
Answer2.

由于第二个printf语句中输出了*++p,前自加运算的优先级在本句子中最高,所以先进行前自加,所以p=p+1。所以*++p前面的p指向的实际是a【1】的地址,由于int型在c中占据4个字节,所以p以%d形式输出结果为1245040+4=1245044.


如果按Answer2理解,我的结果就能解释通了,但是Answer1中++p并没有优先执行

难道++p的执行优先级也与机器有关?

求解释
...全文
118 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hu7324829 2011-07-30
  • 打赏
  • 举报
回复
两种解释针对相应的编译器都能成立。。。

编程的时候要尽量避免这种依赖编译器的语法。。
hua_yang 2011-07-30
  • 打赏
  • 举报
回复
1.
printf的声明(VC6)为:
_CRTIMP int __cdecl printf(const char *, ...);
__cdecl表明:参数压栈顺序是从右向左
注:变参函数都是(__cdecl)

2.
结果与编译器有关:
VC:
算一个记录一个,然后输出,就会有如下结果:
1245040 1245040 1 1245040 1
1245044 1245044 1 1245040 0 1245040 1



linux gcc编译
全部都算出来再打印,结果为:
2291576 2291576 1 2291576 1
2291580 2291580 1 2291580 1 2291580 1
懒得打字 2011-07-30
  • 打赏
  • 举报
回复
ms跟压栈方法有关
第一种可能是压入的是表达式
第二种可能是压入的是表达式的结果
我猜测的

这个东西很纠结的,很讨厌碰到这种题目,每一种编译器给的结果不一样,标准里也没说
DevPlus 2011-07-30
  • 打赏
  • 举报
回复
不纠结了,换了GCC重现原提问者的结果了。
zcargue 2011-07-30
  • 打赏
  • 举报
回复
打酱油的……
c_losed 2011-07-30
  • 打赏
  • 举报
回复
下断点 看反汇编代码 就知道你运算过程了
南京浪人甲 2011-07-30
  • 打赏
  • 举报
回复
函数的调用惯例有很多种:cdecl、stdcall、fastcall、pascal等,一般使用的是cdecl,该惯例参数传递的顺序是从右向左压参数入栈,也就是说这跟编译器有关。

69,371

社区成员

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

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