碰到一个指针的怪问题!

来源:百度知道 编辑:UC知道 时间:2024/05/26 12:45:07
#include<stdio.h>
void main()
{
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
}
上面这段代码为什么我在VS2005里执行的结果是8,8呢?其他的平台我没有试过,是IDE的关系吗?

printf("%d,%d",*ptr,*(++ptr));
压栈顺序:
1.*(++ptr)==8,由于之前的*(ptr++)+=123;使ptr指针指向了arr[1],所以此时的*(++ptr)便使其指向了arr[2] ,将8压入堆栈。

2.*ptr==8,由于之前的*(++ptr)已经使ptr指向了arr[2],而此时没有对ptr进行变更,所以仍然将8压入堆栈。

输出顺序(出栈顺序):8,8

输出时
printf("%d,%d",*ptr,*(++ptr));
*prt压栈 *(++ptr)压栈
*(++ptr)出栈=8
*prt出栈=8

你可以用两行 单独输出看看

vs里面函数参数是从右向左计算并压栈的
比如int i=8;
f(i,++i); //先计算右边的++i并传递,然后传递i
实际上是调用f(9,9)而不是f(8,9)

向右匹配的,先计算,*(++ptr),再计算*(ptr)

printf("%d,%d",*(++ptr),*ptr);
结果为8,7;
printf("%d,%d",*ptr,*(++ptr));这是你调用系统的一个函数;
参数传入时,从右边先执行;
先执行*(++ptr),再执行*ptr
等于printf("%d,%d",8,8);所以有上面的答案;