函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型的数据。下面分析指针变量作为函数参数的优势。
例子:编写函数实现对两个变量的值进行传递。
函数1:
void Swap1(int a,int b)
{
int tmp=a;
a=b;
b=tmp;
}
int main()
{
int a=10;
int b=20;
Swap(a,b);
printf("%d,%d\n",a,b);
return 0;
}
说明:该函数采用值传递方式,如上图,在main函数中的实参变量a,b和Swap1中的形参变量a,b分别占用不同的存储单元,该Swap1中改变了形参变量的值但并不会影响实参变量的值,所以该函数不能实现对两个变量值的交换。
函数2:
void Swap2(int *p1,int *p2)
{
int *tmp=p1;
p1=p2;
p2=tmp;
}
int main()
{
int a=10;
int b=20;
Swap2(&a,&b);
printf("%d,%d\n",a,b);
return 0;
}
说明:函数Swap2的两个形参p1、p2是指针变量,主函数调用时将a和b的地址分别赋给int *变量p1、p2,但在函数中p1、p2未被解引用,所以只是完成了p1、p2值的交换,并不能通过该函数实现对两个变量的交换。
函数3:
void Swap3(int *p1,int *p2)
{
int *tmp;
*tmp=*p1; //此语句有问题
*p1=*p2;
*p2=*tmp;
}
说明:*p就是a,是整形变量,而 * tmp是指针变量tmp所指向的变量。但我们并没有给tmp赋值,tmp中没有确定的值,因此tmp所指向的单元也是不可预见的。所以,对 * tmp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元可能存储着一个有用的数据,这样就有可能破坏系统的正常工作状态。我们把这样没有访问权限的指针(地址)的指针称为野指针或悬挂指针。
函数4:
void Swap4(int *p1,int *p2)
{
int tmp;
tmp=*p1;
*p1=*p2;
*p2=tmp;
}
说明:该函数在Swap3的基础上,将 * p1的值赋给与 * p1相同的数据类型,即用整型变量tmp作为临时辅助变量实现了* p1和* p2的交换。