第三节 指针变量作为函数参数(四)
函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
【例10-3】题目同【例10-2】,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。
1 swap(int *p1,int *p2)
2 {
3 int temp;
4 temp=*p1;
5 *p1=*p2;
6 *p2=temp;
7 }
8 main()
9 {
10 int a,b;
11 int *pointer_1,*pointer_2;
12 scanf("%d,%d",&a,&b);
13 pointer_1=&a;pointer_2=&b;
14 if(a<b)
15 swap(pointer_1,pointer_2);
16 printf("\n%d,%d\n",a,b);
17 }
对程序的说明:
1) swap是用户定义的函数,它的作用是交换两个变量(a和b)的值。swap函数的形参p1、p2是指针变量。程序运行时,先执行main函数,输入a和b的值。然后将a和b的地址分别赋给指针变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b。
2) 接着执行if语句,由于a<b,因此执行swap函数。注意实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传递给形参变量。采取的依然是“值传递”方式。因此虚实结合后形参p1的值为&a,p2的值为&b。这时p1和pointer_1指向变量a,p2和pointer_2指向变量b。
3) 接着执行执行swap函数的函数体使*p1和*p2的值互换,也就是使a和b的值互换。函数调用结束后,p1和p2不复存在(已释放)。
4) 最后在main函数中输出的a和b的值是已经过交换的值。请注意交换*p1和*p2的值是如何实现的。
【例10-4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。
1 swap(int *p1,int *p2) 2 { 3 int *p; 4 p=p1; 5 p1=p2; 6 p2=p; 7 } 8 main() 9 { 10 int a,b; 11 int *pointer_1,*pointer_2; 12 scanf("%d,%d",&a,&b); 13 pointer_1=&a;pointer_2=&b; 14 if(a<b) 15 swap(pointer_1,pointer_2); 16 printf("\n%d,%d\n",*pointer_1,*pointer_2); 17 }
其中的问题在于不能实现如图所示的第四步(d)。
【例10-5】输入a、b、c3个整数,按大小顺序输出。
1 swap(int *pt1,int *pt2) 2 { 3 int temp; 4 temp=*pt1; 5 *pt1=*pt2; 6 *pt2=temp; 7 } 8 exchange(int *q1,int *q2,int *q3) 9 { 10 if(*q1<*q2) 11 swap(q1,q2); 12 if(*q1<*q3) 13 swap(q1,q3); 14 if(*q2<*q3) 15 swap(q2,q3); 16 } 17 main() 18 { 19 int a,b,c,*p1,*p2,*p3; 20 scanf("%d,%d,%d",&a,&b,&c); 21 p1=&a; 22 p2=&b; 23 p3=&c; 24 exchange(p1,p2,p3); 25 printf("\n%d,%d,%d \n",a,b,c); 26 }
posted on 2015-04-06 13:35 chunlanse2014 阅读(427) 评论(0) 编辑 收藏 举报