鱼C论坛

 找回密码
 立即注册
查看: 1527|回复: 4

[已解决]指针问题

[复制链接]
发表于 2017-6-8 15:04:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

int main()
{
        int s[10] = {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;
 } 
最佳答案
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[0], p[1], p[2]);
搜狗截图20170608150024.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-6-8 15:07:30 | 显示全部楼层
改了下代码(如下):
#include<stdio.h>

int main()
{
        int s[10] = {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;
 } 
这样就能正常打印了,但原来的是什么原因啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0], p[1], p[2]);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-6-8 18:18:38 | 显示全部楼层
本帖最后由 落叶飞空 于 2017-6-8 18:19 编辑
超凡天赐 发表于 2017-6-8 17:43
这涉及到参数从右向左执行,但有的编译器是从左向右。

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


我觉得楼上的解释没有问题,在你的编译器中printf()函数计算的时候是从右向左进行的,另外补充一点,造成你这种结果的原因还有一个就是你在计算的过程种改变了指针自身指向的位置,所以计算到最后第一个%d对应的值,即p指向的位置实际上是数组的第三个元素。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-19 21:55:24 | 显示全部楼层
楼上两位解释的很到位
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-28 08:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表