例题:a=0,b=1,请交换a,b的值。
#include<stdio.h>
int main()
{
//声明2个典型的常错的调用函数交换数字的方式、1个正确的调用函数、指针交换数字的方式和1个打印函数(用于显示a,b的值以便读者判断a,b的值是否实现了交换(swap)。
void swap_1(int x,int y);
void swap_2(int *x,int *y);
void swap_3(int *x,int *y);
void print(int a,int b);
int a=0,b=1;
int *p1,*p2; //定义指针变量
p1=&a; //初始化
p2=&b;
//下面是3种函数的调用。建议一种一种看。这边建议去b站看郝斌老师的c语言自学教程,讲得十分清楚易懂,逻辑清晰。
swap_1(a,b);
print(a,b);
swap_2(p1,p2) //也可以写成swap_2(&a,&b); p1与&a等价。
print(a,b);
swap_3(p1,p2)
print(a,b);
return 0;
}
void swap_1(int x,int y); //实参a,b作函参 :无法实现交换,因为虽然形参实现了交换,但无法影响实参的值
{
int t;
t=x;
x=y;
y=t;
}
void swap_2(int *x,int *y) //指针p1、p2作函参
{
int *t; //定义指针变量
t=x;
x=y;
y=t;
//无法实现交换:与swap_1的原理相同,只是形参指针的值实现了交换,却无法影响实参a、b的指针的值,故而a、b地址不变,仍为原值。
}
void swap_3(int *x,int *y); //指针p1、p2作函参
{
int t; //定义普通变量 (这是swap_2和swap_3的区别)
t=*x;
*x=*y;
*y=t;
//可以实现交换:通过形参指针间接访问实参,通过改变指针指向来改变变量的值。(既要有指针又要有指向,所以就是*和p的综合,即改变的东西只能是*p,而不能是只有指向的a、b或只有指针变量的p1、p2。
}
void print(int x,int y)
{
printf("a=%d,b=%d\n",x,y);
}