# 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