6.3.2指针变量作函数的参数
函数的参数可以是我们在前面学过的简单数据类型,也可以是指针类型。使用指针类型做函数的参数,实际向函数传递的是变量的地址。由于子程序中获得了所传递变量的地址,在该地址空间的数据当子程序调用结束后被物理地保留下来。
[例6-4]利用指针变量作为函数的参数,用子程序的方法再次实现上述功能。
main()
{
void chang();/*函数声明*/
int *p1,*p2,a,b,*t;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
chang(p1,p2);/*子程序调用*/
printf("%d,%d\n",*p1,*p2);
return0;
}
void chang(int *pt1,int *pt2)
{/*子程序实现将两数值调整为由大到小*/
int t;
if(*pt1<*pt2)/*交换内存变量的值*/
{
t=*pt1;*pt1=*pt2;*pt2=t;}
return;
}
由于在调用子程序时,实际参数是指针变量,形式参数也是指针变量,实参与形参相结合,传值调用将指针变量传递给形式参数pt1和pt2。但此时传值传递的是变量地址,使得在子程序中pt1和pt2具有了p1和p2的值,指向了与调用程序相同的内存变量,并对其在内存存放的数据进行了交换,其效果与[例6-2]相同。
思考下面的程序,是否也能达到相同的效果呢?
main()
{
void chang();
int *p1,*p2,a,b,*t;
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
chang(p1,p2);
printf("%d,%d\n",*p1,*p2);
}
void chang(int*pt1,int*pt2)
{
int *t;
if(*pt1<*pt2)
{
t=pt1;pt1=pt2;pt2=t;
}
return;
}
程序运行结束,并未达到预期的结果,输出与输入完全相同。其原因是对子程序来说,函数内部进行指针相互交换指向,而在内存存放的数据并未移动,子程序调用结束后,main()函数中p1和p2保持原指向,结果与输入相同。
|