指针变量作为函数参数

来源:互联网 发布:剑灵飞月捏脸数据 编辑:程序博客网 时间:2024/06/12 23:19

先描述一个题目,题目是这样的,输入a和b两个整数,按先大后小的顺序输出a和b。

`/* Note:Your choice is C IDE */#include "stdio.h"void main(){   void swap(int *p1,int *p2);   int a,b;   int *pointer_1,*pointer_2;   scanf("%d,%d",&a,&b);   pointer_1=&a;   pointer_2=&b;   if(a<b) swap(pointer_1,pointer_2);   printf("\n%d,%d\n",a,b);}void swap(int *p1,int *p2){    int temp;    temp=*p1;    *p1=*p2;    *p2=temp;}`

对程序的说明:swap是用户定义的函数,它的作用是交换两个变量(ab)的值。swap函数的两个形参p1p2是指针变量。程序运行时,先执行main函数,输入ab的值。然后将ab的地址分别赋给指针变量pointer_1pointer_2,使pointer_1指向apointer_2指向b。接着执行if语句,若满足a<b,则执行swap函数。注意实参pointer_1pointer_2是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是”值传递”方式。因此虚实结合后形参p1的值为&ap2的值为&b。这时p1pointer_1都指向变量ap2pointer_2都指向b。接着执行swap函数的函数体,使*p1*p2的值互换,也就是使ab的值互换。函数调用结束后,形参p1p2不复存在(已释放)。最后在main函数中输出的ab的值已是经过交换的值。

请注意交换*p1*p2的值是如何实现的。如果写成以下这样就有问题了:

`void swap(int *p1,int *p2){    int *temp;    temp=*p1;   /*此语句有问题*/    *p1=*p2;    *p2=temp;}`

*p1就是a,是整型变量。而*temp是指针变量temp所指向的变量。但temp中并无确定的值(它的值是不可预见的),因此temp所指向的单元也是不可预见的。所以,对*temp赋值有可能给一个存储着重要数据的存储单元赋值,这样就会破坏系统的正常工作状况。应该将*p1的值赋给一个整型变量,用整型变量temp作为临时辅助变量实现*p1*p2的交换。

考虑一下是否可以通过下面的函数实现a和b的互换:

`void swap(int x,int y){    int temp;    temp=x;    x=y;    y=temp;}`

如果在main函数中调用swap函数:

swap(a,b);

在函数调用时,a的值传送给xb的值传送给y。执行完swap函数后,xy的值是互换了,但并未影响到ab的值。在函数结束时,变量xy释放了,mian函数中的ab并未互换。也就是说,由于“单向传送”的“值传递”方式,形参值的改变不能使实参的值随之改变。

为了使在函数中改变了的变量值能被main函数所用,不能采取上述把改变的值的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来,这样就实现了“通过调用函数是变量的值发生变化,在主调函数(如:main函数)中可以使用这些改变了的值”的目的。

请注意,不能企图通过改变指针形参的值而使指针实参的值改变。下面的程序:

`/* Note:Your choice is C IDE */#include "stdio.h"void main(){   void swap(int *p1,int *p2);   int a,b;   int *pointer_1,*pointer_2;   scanf("%d,%d",&a,&b);   pointer_1=&a;   pointer_2=&b;   if(a<b) swap(pointer_1,pointer_2);   printf("\n%d,%d\n",a,b);}void swap(int *p1,int *p2){    int *p;    p=p1;    p1=p2;    p2=p;}`

程序编写者的意图是:交换pointer_1pointer_2的值,使pointer_1指向值大的变量。其设想是:

  1. 先使pointer_1指向apointer_2指向b
  2. 调用swap函数,将pointer_1的值传给p1pointer_2传给p2.
  3. 在swap函数中使p1p2的值交换。
  4. 形参p1p2将地址传回实参pointer_1pointer_2,使pointer_1指向bpointer_2指向a。然后输出*pointer_1*pointer_2

但是,这是办不到的,结果并不会发生交换。问题出在第四步。C语言中实参变量和形参变量之间的数据传递时单向的“值传递”方式。指针变量作函数参数也要遵循这一规则。不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。我们知道,函数的调用可以(而且只可以)得到一个返回值(即函数值),而运用指针变量作参数,可以得到多个变化了的值。如果不用指针变量是难以做到这一点的。

1 0
原创粉丝点击