指针练习:1.输入a,b / a,b,c按照先大后小的顺序输出(函数方法与普通方法)

# 1.指针练习:输入a,b按照先大后小的顺序输出

1.普通方法

p1 = &b;
p2 = &a;

这样子就直接交换了地址而不用借助第三个变量。
借助指针的地址,就不用借助中间变量啦。

#include <stdio.h>

int main() {
    int *p1, *p2, *p, a, b;
    printf("请输入两个整数a,b:");
    scanf("%d,%d", &a, &b);
    p1 = &a;
    p2 = &b;
    if (a < b) {
       /* p = p1;
        p1 = p2;
        p2 = p;*/
        p1 = &b;
        p2 = &a;
    }
    printf("max=%d,min=%d\n", *p1, *p2);
    return 0;
}

2.函数的方法:

问题引入:为什么这个输出的结果没有变化?

#include <stdio.h>
void swap(int p1, int p2); //函数声明
int main() {
    int a, b;
    printf("请输入两个数a和b\n");
    scanf("%d,%d", &a, &b); //不要老是忘记取地址!!!
    swap(a, b);
    printf("max=%d,min=%d", a, b);
    return 0;
}

void swap(int p1, int p2) {
    int p;
    if (p1 < p2) {
        p = p1;
        p1 = p2;    //注意此处没有被用到,所以显示的是灰色
        p2 = p;
    }
}

结果:
8,9
max=8,min=9
Process finished with exit code 0

在swap函数中执行函数之后虽然p1和p2的值确实相互交换了但是却并没有影响到a和b的值,这是因为执行函数之后p1,p2被释放了,也就是说由于“单向传递”的“值传递”方式,形参的改变是不能使得实参改变的。
因此,为了能够让函数中的值可以在主函数main中被调用,我们就要使用指针变量作为函数的参数,这样在函数调用结束之后,这些数值任然被保留了下来,是不会被释放的。

#include <stdio.h>

void swap(int *p1, int *p2); //函数声明
int main() {
    int *pointer_1, *pointer_2, a, b;
    pointer_1 = &a;
    pointer_2 = &b;
    printf("请输入两个数a和b\n");
    scanf("%d,%d", &a, &b); //不要老是忘记取地址!!!
    if (a < b)
        swap(pointer_1, pointer_2);  //注意直接写名字即可,因为已经定义的就是指针变量
    printf("max=%d,min=%d", a, b);
    return 0;
}

void swap(int *p1, int *p2) {	//定义函数
    int p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;
   
}
结果

请输入两个数a和b
4,5
max=5,min=4

**注意:**
```c
    int *p;
    *p = *p1;
    *p1 = *p2;
    *p2 = *p;

这样子是错误的,因为在函数调用的时候将实参变量传递给形参变量采用的是“值传递”而不是“址传递”

拓展:输入a,b,c按照先大后小的顺序输出
#include <stdio.h>

void exchange(int *q1, int *q2, int *q3); //函数声明 不用再写swap函数了因为已经在exchange中写过了

int main() {
    int *pointer_1, *pointer_2, *pointer_3, a, b, c;
    pointer_1 = &a;
    pointer_2 = &b;
    pointer_3 = &c;
    printf("请输入三个数a和b和c\n");
    scanf("%d,%d,%d", &a, &b, &c); //不要老是忘记取地址!!!
    exchange(pointer_1, pointer_2, pointer_3);  //注意直接写名字即可,因为已经定义的就是指针变量
    printf("%d,%d,%d", a, b, c);
    return 0;
}

void exchange(int *q1, int *q2, int *q3) {
    void swap(int *p1, int *p2);    //函数声明 函数可以嵌套调用 不可以嵌套定义
    if (*q1 < *q2)swap(q1, q2);
    if (*q1 < *q3)swap(q1, q3);
    if (*q2 < *q3)swap(q2, q3);
}

void swap(int *p1, int *p2) {   //交换
    int p;
    p = *p1;
    *p1 = *p2;
    *p2 = p;
}

结果:

请输入三个数a和b和c
1,2,3
3,2,1
Process finished with exit code 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微莱羽墨

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值