一道关于指针的问题,有点难 高手指教

来源:百度知道 编辑:UC知道 时间:2024/06/04 03:00:04
int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf(”%d,%d”,*ptr,*(++ptr));

为什么结果是8,8

请具体说明一下

printf(”%d,%d”,*ptr,*(++ptr)); 的输入是从右向左。
*(ptr++)+=123; 的运行是先做*ptr=*ptr+123=6+123=129 *ptr++
运行后*ptr=7 然后再做printf(”%d,%d”,*ptr,*(++ptr)); 因为printf是从右向左。
所以先做*(++ptr); 此时*ptr指向第a[2]就是说*(++ptr)=8 ,*ptr=8;
答案就是8 8
如果你没有后面*(++ptr)语句的话,*ptr=7,*ptr指向a[1]
答案之所以等于8是因为有*(++ptr);

..............................

我也有点不懂了呢。。。
*ptr++
怎么能实现两步呢。指针后移一个,而且指针指向的7也加了1??
分布做应该是先做*ptr += 123 再做ptr++啊。。。

你可以做一个分解动作

int arr[]={6,7,8,9,10};
int *ptr=arr;
// 现在 ptr 指向arr的第一个元素,也就是6

*(ptr++)+=123;
// 这一句实际上可以分解为
// int* ptr_now = ptr;
// ptr = ptr + 1;
// *ptr_now = *ptr_now + 123;
// 也就是说把原来 ptr 指向的元素加 123,
// 所以arr[0]等于129了。而ptr现在是指向arr的第二个元素,也就是 7

printf(”%d,%d”,*ptr,*(++ptr));
// 最后这一句稍微有点复杂。
// 函数在被调用的时候,首先是将参数全部压到栈中。
// 这样在压 *(++ptr) 参数的时候,因为++在ptr之前,需要首先执行++操作,然后将结果压到栈中,这样ptr实际上是指向了arr的第3个元素,也就是arr[2],当然结果是8了。
// 其实这个分解开,也就相当于:
// ptr = ptr+1;<