鱼C论坛

 找回密码
 立即注册
查看: 906|回复: 3

[已解决]带你学C带你飞-指针-课后题动动手第一题

[复制链接]
发表于 2023-7-17 19:41:54 | 显示全部楼层 |阅读模式

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

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

x
这题要求我们补充被抹去的代码,补充完成之后如下:
#include <stdio.h>

int main(void)
{
        int a, b, c, t;
        int *pa, *pb, *pc;
        
        printf("请输入三个数:");
        scanf("%d%d%d", &a, &b, &c);
        
        pa = &a;
        pb = &b;
        pc = &c;
        
        if (a > b)
        {
                t = *pa;
                *pa = *pb;
                *pb = t;
        }
        
        if (a > c)
        {
                t = *pa;
                *pa = *pc;
                *pc = t;
        }
        
        if (b > c)
        {
                t = *pb;
                *pb = *pc;
                *pc = t;
        }
        
        printf("%d <= %d <= %d\n", *pa, *pb, *pc);
        printf("%d <= %d <= %d\n", a, b, c);
        
        return 0;
}


对于上面的代码我有2点不是很清楚。第一点是怎么理解这三个if中的内容?
if (a > b)
        {
                t = *pa;
                *pa = *pb;
                *pb = t;
        }
        
        if (a > c)
        {
                t = *pa;
                *pa = *pc;
                *pc = t;
        }
        
        if (b > c)
        {
                t = *pb;
                *pb = *pc;
                *pc = t;

第二点是为什么结尾要有这个 printf("%d <= %d <= %d\n", *pa, *pb, *pc)?    有一个这个不就行了吗  printf("%d <= %d <= %d\n", a, b, c)?

指针好难,感觉好多听不懂看不懂
最佳答案
2023-7-17 19:42:31
第一点,这三个if语句是用来进行三个整数的排序操作的,采用的是简单的冒泡排序算法。其中,指针 *pa, *pb, *pc 分别存放了变量 a, b, c 的地址。

在第一个if中,if(a>b),是比较输入的两个数a和b的大小。如果a>b,那么会执行大括号中的语句,交换*pa(也就是a)和*pb(也就是b)的值,保证a的值小于b的值。

第二个if和第一个if的逻辑一样,只不过这次比较的是a和c,交换的是*pa和*pc的值,这样就保证了a的值是最小的。

最后,第三个if是用来比较剩下的两个数b和c的大小,交换*pb和*pc的值,这样就保证了b的值小于c的值。

所以,通过这三个if语句,可以将三个整数从小到大排序。

第二点,关于程序末尾的两个printf语句,其实它们打印的内容是一样的,只是表达方式不同。printf("%d <= %d <= %d\n", *pa, *pb, *pc) 是以指针的方式打印这三个数,而printf("%d <= %d <= %d\n", a, b, c) 是直接打印这三个数。因为在上面的if语句中已经对a,b,c的值进行了操作,所以*pa,*pb,*pc的值和a,b,c的值是一样的。这里写两个printf语句可能是为了帮助你理解和区分直接变量和指针变量的区别。

学习指针确实比较困难,但是只要多做一些练习,慢慢理解它的工作原理,你会发现它是一个非常强大和有用的工具。希望我的解答能帮到你,如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-17 19:42:25 | 显示全部楼层
第一点:理解三个if语句的内容

这三个if语句用于比较输入的三个数的大小,并按升序排列它们。

- 第一个if语句 if (a > b){t = *pa;*pa = *pb;*pb = t;} 会比较ab的值,如果a大于b,则交换它们的值。交换是通过使用指针来实现的,即将a的值赋给临时变量t,然后将b的值赋给a,最后再将临时变量中的值赋给b。通过这样的交换操作,保证了*pa(即a)始终代表较小的那个数,而*pb(即b)代表较大的那个数。

- 第二个if语句 if (a > c){t = *pa;*pa = *pc;*pc = t;} 会比较ac的值,如果a大于c,则交换它们的值。这里的交换操作与第一个if语句类似,只是交换的对象不同。通过这样的交换操作,保证了*pa(即a)仍然代表较小的那个数,而*pc(即c)代表较大的那个数。

- 第三个if语句 if (b > c){t = *pb;*pb = *pc;*pc = t;} 会比较bc的值,如果b大于c,则交换它们的值。同样地,通过交换操作保证了*pb(即b)代表较小的那个数,而*pc(即c)代表较大的那个数。

经过这三个if语句的处理后,指针pa指向最小的数,指针pb指向中间的数,指针pc指向最大的数,这样输出时才能按照升序排列。

第二点:为什么结尾要有两个printf语句

这两个printf语句分别用来输出排序后的数和原始输入的数。

- 第一个printf语句 printf("%d <= %d <= %d\n", *pa, *pb, *pc) 输出排序后的三个数,其中*pa表示最小的数,*pb表示中间的数,*pc表示最大的数。

- 第二个printf语句 printf("%d <= %d <= %d\n", a, b, c) 输出原始输入的三个数,其中a表示第一个输入的数,b表示第二个输入的数,c表示第三个输入的数。

这两个printf语句的目的是在程序执行完排序后,既能显示排序后的结果,也能显示原始输入的顺序。这样可以帮助验证程序的正确性。

指针的概念可能较为抽象,需要通过反复练习和实际的编程经验来加深理解。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-17 19:42:31 | 显示全部楼层    本楼为最佳答案   
第一点,这三个if语句是用来进行三个整数的排序操作的,采用的是简单的冒泡排序算法。其中,指针 *pa, *pb, *pc 分别存放了变量 a, b, c 的地址。

在第一个if中,if(a>b),是比较输入的两个数a和b的大小。如果a>b,那么会执行大括号中的语句,交换*pa(也就是a)和*pb(也就是b)的值,保证a的值小于b的值。

第二个if和第一个if的逻辑一样,只不过这次比较的是a和c,交换的是*pa和*pc的值,这样就保证了a的值是最小的。

最后,第三个if是用来比较剩下的两个数b和c的大小,交换*pb和*pc的值,这样就保证了b的值小于c的值。

所以,通过这三个if语句,可以将三个整数从小到大排序。

第二点,关于程序末尾的两个printf语句,其实它们打印的内容是一样的,只是表达方式不同。printf("%d <= %d <= %d\n", *pa, *pb, *pc) 是以指针的方式打印这三个数,而printf("%d <= %d <= %d\n", a, b, c) 是直接打印这三个数。因为在上面的if语句中已经对a,b,c的值进行了操作,所以*pa,*pb,*pc的值和a,b,c的值是一样的。这里写两个printf语句可能是为了帮助你理解和区分直接变量和指针变量的区别。

学习指针确实比较困难,但是只要多做一些练习,慢慢理解它的工作原理,你会发现它是一个非常强大和有用的工具。希望我的解答能帮到你,如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-17 20:19:44 | 显示全部楼层
根据我的理解,pa,pb,pc是分别指向a,b,c的指针,可以使用*pa,*pb,*pc来指向a,b,c在输出这一步和a,b,c确实没什么两样,只是通过指针获取
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 08:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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