题目内容:写代码将三个整数数按从大到小输出。
例如:
输入:2 3 1
输出:3 2 1
本文将通过两种方法实现将三个整数从大到小输出,重点体现在第二个方法函数调用中(将会应用到指针)。
1. 方法一:直接在main函数中实现三个整数大小的比较。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main(){
int a = 0;
int b = 0;
int c = 0;
int tmp = 0;
printf("请输入三个整数:");
scanf("%d%d%d", &a, &b, &c);
if (a < b){
tmp = a;
a = b;
b = tmp;
}
if (a < c){
tmp = a;
a = c;
c = tmp;
}
if (b < c){
tmp = b;
b = c;
c = tmp;
}
printf("三个整数由大到小依次是:%d %d %d\n", a, b, c);
return 0;
}
尽管代码简单易懂,逻辑也比较清晰,但是赋值语句需要反复输入比较繁琐,所以利用函数直接调用会更加便利一些。
2. 方法二:通过函数调用实现三个整数大小的比较。
先上一个比较常见的错误示范!!!
//以下为错误的函数形式
int maxNum( int i , int j ){
int tmp = 0;
if (i <j){ //形参与实参之间的传递问题
tmp =i ;
i = j;
j = tmp;
}
return 0;
}
//无法达到交换值的效果
由于形参与实参之间只能单向传递,即在函数调用时,实参的值会传给形参,但形参的改变并不能传递给实参,所以形参相互赋值并不会改变实参。通常函数与main函数之间是通 过return来传递改变过的值(但赋值操作无法实现传递),所以我们要通过指针进行传递地址改变实参。
接下来开始写正确的函数:
(1)在写函数之前,让我们来先理解一下什么是指针。首先指
针与内存密切相关,把内存想象成一个大走廊,走廊上 有很多
房间,每个房间都有门牌号,把门牌号看作地址。这时候创建
一个变量(重新申请一个内存空间/即申请一个房间)这个内存
空间来存储地址。这个存储了地址的变量就是“指针变量”, 也
就是我们常说的指针。
(2)明确指针是什么后,我们可以通过传递实参的地址给到
形参,形参把地址所对应的变量进行改变,实参也开始发生改变。
这个过程相当于有一张房卡,打开房间里面有一个房间号,通
过房间号找到对应的房间,可以在房间里放东西,也可以取出东西。
以下为正确函数形式以及完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int maxNum( int* i,int* j ){ //此处的int*为指针类型
int tmp = 0;
if (*i <*j){ //此处的*为解引用操作符,返回指针变量i、j所指的对象
tmp =*i ;
*i = *j;
*j = tmp;
}
return 0;
}
int main(){
int a = 0;
int b = 0;
int c = 0;
//1.为指针变量申请内存空间
int *p1 = 0;
int *p2 = 0;
int *p3 = 0;
//2.将a、b、c的地址赋予指针变量p1、p2、p3
p1 = &a;
p2 = &b;
p3 = &c;
printf("请输入三个整数:");
scanf("%d%d%d", &a, &b, &c);
if (a < b){
maxNum(p1, p2);
}
if (a < c){
maxNum(p1, p3);
}
if (b < c){
maxNum(p2, p3);
}
printf("三个整数由大到小依次是:%d %d %d\n", a, b, c);
return 0;
}
为了更加详细的了解函数内部到底是如何运作的,可以参考下图:

通过图片,我们可以更加清晰的了解到内存中指针变量和实参变量之间的变化。
以上,欢迎更多的小伙伴来沟通交流想法~
本文介绍如何使用C语言将三个整数按从大到小排序并输出,包括直接在main函数中比较和通过函数调用并利用指针传递地址的方法。重点讲解了通过指针进行函数调用时,如何正确地改变实参的值。
1345

被折叠的 条评论
为什么被折叠?



