例:输入a和b两个整数,按照先大后小的顺序输出a和b。
#include <stdio.h> int main(){ void swap(int *p1,int *p2); int a,b; int * pointer_1,* pointer_2; printf("please enter a and b:"); scanf("%d,%d",&a,&b); pointer_1 = &a; pointer_2 = &b; if(a<b) swap(pointer_1,pointer_2); printf("max=%d,min=%d\n",a,b); return 0; } void swap(int *p1,int *p2){ int temp; temp = *p1; *p1 = *p2; *p2 = temp; }
上述例子中,我们定义两个指针变量和基本变量。首先给基本变量赋值,并将基本变量的地址赋值给指针变量
然后用指针变量作为函数参数,调用swap方法。
在swap方法中,因为*p1,*p2就是指代具体的a,b两个变量,所以我们定义的一个中间变量就不能用指针类型。
如果我们中间变量定义为 int * temp ,这时会出错,因为,*p1是a变量的值,不是地址。所以将一个值赋给变量是不正确的。
因此,我们交换*p1和*p2的值,也就是交换了a和b的值。
当然,最后我们打印出来的最大值是a,最小值是b了。
下面是一个程序正确,但是逻辑上错误的代码
#include <stdio.h> int main(){ void swap(int *p1,int *p2); int a,b; int * pointer_1,* pointer_2; printf("please enter a and b:"); scanf("%d,%d",&a,&b); pointer_1 = &a; pointer_2 = &b; if(a<b) swap(pointer_1,pointer_2); printf("max=%d,min=%d\n",a,b); return 0; } void swap(int *p1,int *p2){ int *p; p = p1; p1 = p2; p2 = p; }
上面程序和先前程序的区别在于。我们在swap函数中,定义了一个作中间变量的指针。
z
然后,将指针变量p1赋值给找你关键变量,即将p1指针所指向的地址赋值给了p,
接着,将指针变量所保存的地址赋值给p1,所有指针p的地址赋值给p2。
完成了,对指针p1,p2 地址的 交换,但是 变量a和b两个值并没有交换。
最后,给除一个稍微复杂点的例子。
输入三个整数a,b,c,需求按照从大到小的顺序将它们输出。用函数实现,用指针实现
#include <stdio.h> int main(){ void exchange(int *q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; printf("please enter three numbers:"); scanf("%d,%d,%d",&a,&b,&c); p1 = &a; p2 = &b; p3 = &c; exchange(p1,p2,p3); printf("The order is :%d,%d,%d\n",a,b,c); return 0; } void exchange(int *q1, int *q2, int *q3){ void swap(int *pt1, int *pt2); if(*q1 < *q2) swap(q1,q2); if(*q1 < *q3) swap(q1,q3); if(*q2 < *q3) swap(q2,q3); } void swap(int *pt1, int *pt2){ int temp; if(*pt1 < *pt2){ temp = *pt1; *pt1 = *pt2; *pt2 = temp; } }