luck_roki 发表于 2017-6-8 15:04:19

指针问题

为什么打印的顺序是倒的?(如图)
#include<stdio.h>

int main()
{
        int s = {10, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int *p;
        p = s;
       
        printf("%d\n%d\n%d\n",*p, *(p++), *(p++));
       
        return 0;
}

luck_roki 发表于 2017-6-8 15:07:30

改了下代码(如下):
#include<stdio.h>

int main()
{
        int s = {10, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        int *p;
        p = s;
       
        printf("%d\n%d\n%d\n",*p, *(p+1), *(p+2));
       
        return 0;
}
这样就能正常打印了,但原来的是什么原因啊?

超凡天赐 发表于 2017-6-8 17:43:01

这涉及到参数从右向左执行,但有的编译器是从左向右。
printf("%d\n%d\n%d\n",*p, *(p++), *(p++));
在这里,printf本身也是一个库函数。这里,我们都知道,p++要到下一步才能执行,所以第三个数为10,第二个数是1,第一个数是2。这里要注意,尽管程序执行是从右向左,但是输出的时候仍是按照从左向右。所以这里你看到的是这样的2,1,10。
printf("%d\n%d\n%d\n",*p, *(p+1), *(p+2));
等价于
printf("%d\n%d\n%d\n",p, p, p);

落叶飞空 发表于 2017-6-8 18:18:38

本帖最后由 落叶飞空 于 2017-6-8 18:19 编辑

超凡天赐 发表于 2017-6-8 17:43
这涉及到参数从右向左执行,但有的编译器是从左向右。

在这里,printf本身也是一个库函数。这里,我们都 ...

我觉得楼上的解释没有问题,在你的编译器中printf()函数计算的时候是从右向左进行的,另外补充一点,造成你这种结果的原因还有一个就是你在计算的过程种改变了指针自身指向的位置,所以计算到最后第一个%d对应的值,即p指向的位置实际上是数组的第三个元素。

HansonCPT 发表于 2017-6-19 21:55:24

楼上两位解释的很到位
页: [1]
查看完整版本: 指针问题