努力学C的阿通 发表于 2023-7-17 19:41:54

带你学C带你飞-指针-课后题动动手第一题

这题要求我们补充被抹去的代码,补充完成之后如下:
#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:25

第一点:理解三个if语句的内容

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

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

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

- 第三个if语句 if (b > c){t = *pb;*pb = *pc;*pc = t;} 会比较b和c的值,如果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语句的目的是在程序执行完排序后,既能显示排序后的结果,也能显示原始输入的顺序。这样可以帮助验证程序的正确性。

指针的概念可能较为抽象,需要通过反复练习和实际的编程经验来加深理解。如果还有其他问题,请随时提问。

isdkz 发表于 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语句可能是为了帮助你理解和区分直接变量和指针变量的区别。

学习指针确实比较困难,但是只要多做一些练习,慢慢理解它的工作原理,你会发现它是一个非常强大和有用的工具。希望我的解答能帮到你,如果还有其他问题,请随时提问。

陈尚涵 发表于 2023-7-17 20:19:44

根据我的理解,pa,pb,pc是分别指向a,b,c的指针,可以使用*pa,*pb,*pc来指向a,b,c在输出这一步和a,b,c确实没什么两样,只是通过指针获取
页: [1]
查看完整版本: 带你学C带你飞-指针-课后题动动手第一题