1.函数的参数不仅可以是整型,浮点型,字符型等数据,还可以是指针类型。
指针变量作为函数参数的作用:将一个变量的地址传送到另一个函数中。
【例题】
输入a和b两个整数,按先大后小的顺序输出a和b,用函数处理,而且用指针类型的数据作函数参数。
【思路】
定义一个Swap函数,将指向两个整型变量的指针变量(内放两个整型变量的地址)作为实参传递给Swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。
【代码】
void Swap(int *p1,int*p2)//定义Swap函数
{
int tmp;
tmp=*p1; //使*p1和*p2交换
*p1=*p2;
*p2=tmp;
}
int main()
{
int a,b;
printf("请输入a和b:\n");
scanf("%d%d",&a,&b);
int *b1,*b2; //定义两个int*型指针变量
b1=&a; //使b1指向a
b2=&b; //使b2指向b
if(a<b) //如果a<b
Swap(b1,b2); //调用Swap函数
printf("Max=%d,Min=%d",a,b); //输出结果
return 0;
}
【运行结果】
【程序分析】
Swap是用户自定义函数,它的作用是交换两个变量(a和b)的值。Swap函数的两个形参p1和p2是指针变量。注意实参b1和b2是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是“值传递”的方法。因此虚实结合后形参p1的值为&a,p2的值为&b,如下图:
这时,p1和b1都指向变量a,p2和b2都指向变量b。接着执行Swap函数的函数体,使*p1
和*p2
的值互换,也就是a和b的值互换,互换后的情况如下图:
函数调用结束后,形参p1和p2不复存在(已释放),如图:
最后在main函数中输出的a和b的值已经是交换过的值(a=9,b=5)。
【注意】
若把Swap函数写成这样则是错误的。如下:
void Swap(int *p1,int*p2)
{
int *tmp;
*tmp=*p1;
p1=*p2;
p2=*tmp;
}
*p1
就是a,是整型变量。而*tmp
是指针变量tmp所指向的变量。由于未给tmp赋值,因此tmp中并无确定的值,所以tmp所指向的单元也是不可预见的。所以,对*tmp
赋值就是向一个未知的存储单元赋值,而这个未知的存储单元中可能存储着一个有用的数据,这样就有可能破坏系统的正常工作。应该将*p1
的值赋给与*p1
相同类型的变量,在上例中,用整型变量tmp
,作为临时辅助变量实现*p1
和*p2
的交换。
这个例题采取的方法是交换a和b的值,而p1和p2的值不变。
为了使在函数中改变了的变量值能被主函数main所用,应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,从而实现了“通过调用函数使变量的值发生变化,在主调函数中可以使用这些改变了的值”的目的。
如果想通过函数调用得到n个要改变的值,可以这样做:
①在主调函数中设n个变量,用n个指针指向它们;
②设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值;
③在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的值,也就是相关变量的地址传给该函数的形参;
④在执行该函数过程中,通过形参指针变量,改变它们所指向的n个变量的值;
⑤主调函数中就可以使用这些改变了的值的变量。