指针变量做为函数的参数

函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

【例10.3】题目同例10.2,即输入的两个整数按大小顺序输出。今用函数处理,而且用指针类型的数据作函数参数。

  1. #include <stdio.h> 
  2. swap(int *p1,int *p2) 
  3.  int temp; 
  4.  temp=*p1; 
  5.  *p1=*p2; 
  6.  *p2=temp
  7. main() 
  8.   int a,b; 
  9.   int *pointer_1,*pointer_2; 
  10.   scanf("%d,%d",&a,&b); 
  11.   pointer_1=&a; 
  12.   pointer_2=&b; 
  13.   if(a<b) swap(pointer_1,pointer_2); 
  14.   printf("\n%d,%d\n",a,b); 
  15.  
对程序的说明: 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的值是如何实现的。请找出下列程序段的错误: swap(int *p1,int *p2)
{int *temp;
 *temp=*p1;      /*此语句有问题*/
 *p1=*p2;
 *p2=temp;
}
请考虑下面的函数能否实现实现a和b互换。
swap(int x,int y)
{int temp;
 temp=x;
 x=y;
 y=temp;
}
如果在main函数中用“swap(a,b);”调用swap函数,会有什么结果呢?请看下图所示。
【例10.4】请注意,不能企图通过改变指针形参的值而使指针实参的值改变。
  1. #include <stdio.h> 
  2. swap(int *p1,int *p2) 
  3.      int *p; 
  4.      p=p1
  5.      p1=p2
  6.      pp2=p; 
  7. main() 
  8.     int a,b; 
  9.     int *pointer_1,*pointer_2; 
  10.     scanf("%d,%d",&a,&b); 
  11.     pointer_1=&a; 
  12.     pointer_2=&b; 
  13.     if(a<b) swap(pointer_1,pointer_2); 
  14.     printf("\n%d,%d\n",*pointer_1,*pointer_2); 
例5,输入3个数,改变大小顺序.
  1. #include <stdio.h> 
  2. swap(int *pt1,int *pt2) 
  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)swap(q1,q2); 
  11.      if(*q1<*q3)swap(q1,q3); 
  12.      if(*q2<*q3)swap(q2,q3); 
  13.  
  14. main() 
  15.       int a,b,c,*p1,*p2,*p3; 
  16.       scanf("%d,%d,%d",&a,&b,&c); 
  17.       p1=&a;p2=&b; p3=&c; 
  18.       exchange(p1,p2,p3); 
  19.       printf("\n%d,%d,%d \n",a,b,c);