#include<stdio.h>
#include<conio.h>
int main()
//program start here
{
int i= 655535;
int *p =&i;
printf("p:%d \n*p:%d \n",p,*p);
printf("*p++:%d \n p:%d \n *p:%d \n ++(*p):%d \n p:%d \n",*p++, p,*p, ++*p,p);
printf("p:%d\n", p);
getch();
}
输出:
p:2293620
*p:655535
*p++:655536
p:2293620
*p:655536
++(*p):655536
p:2293620
p:2293624
为什么上述程序打印的最后'p'值不同?
答案 0 :(得分:5)
*p++
相当于:
*(p++)
所以这会改变p
。
您的程序调用未定义的行为,因为它修改并访问序列点之间的p
和*p
,以及第二个printf
参数列表中的所有增量和访问。在您使用的实现中,所有p
访问都在增量之前完成,它会打印未修改的值。但是,*p
在增量之后完成,因此它会打印修改后的值。
答案 1 :(得分:1)
发送到函数调用的参数以相反的顺序被压入堆栈中,因此当它弹出值以按正确的顺序获取它们时
在你的情况下:
printf("*p++:%d \n p:%d \n *p:%d \n ++(*p):%d \n p:%d \n",*p++, p,*p, ++*p,p);
将执行以下步骤:
1)推p
- &gt; p:2293620
2)推++*p
- &gt; ++(*p):655536
3)推*p
- &gt; *p:655536
4)推p
- &gt; p:2293620
5)推送*p++
与*(p++)
相同 - &gt; * p ++:655536 //后增量操作仅在下一次打印时可见,并且您还使用sizeof(int)
增加指针
这解释了为什么p
有不同的值例如,对于以下代码段:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int a = 10;
printf("%d %d %d\n", a++, a++, a++);
return 0;
}
您将获得以下输出:
12 11 10
答案 2 :(得分:0)
你有一个
*(p ++)== * p ++
在这一行:
printf(“* p ++:%d \ np:%d \ n * p:%d \ n ++(* p):%d \ np:%d \ n”,* p ++,p,* p , ++ * P,P);
在 printf 调用返回后,p指向的地址将以 sizeof(int)* 1 递增。 所以p的最终值是 2293620 + 4 * 1 = 2293624