映月读书网 > C语言解惑 > 6.6 传递指针不一定改变原来参数的值 >

6.6 传递指针不一定改变原来参数的值

【例6.8】设计的程序使用传指针的方式,希望调用程序后,能交换两个变量的值。这个程序是否能达到设计要求?要求通过合适的演示手段说明这个问题。


#include <stdio.h>
void swap
(int*
, int*
);          //
函数参数采用传地址值方式
void main
()
{
  int num1=25
, num2=52
;
  swap
(&num1
, &num2
);          //
传地址值
}
void swap
(int *P1
, int *P2
)
{
  int *temp
;
  printf
("
原来地址为:num1=%d
,num2=%d\n"
, P1
,P2
);
  temp=P1
;  P1=P2
;  P2=temp
;  
}
  

传递指针只是改变值的必要条件,并不是充分条件。是否改变原来的值,还要看如何在函数中使用这些参数。在这个被调函数内,没有将指针作为左值,所以不会改变原来参数的值。

结论:这个swap函数不能实现交换变量值的功能。

为了演示其过程,还是增加观察指针指向及变量存储地址为佳。下面是增加相应信息的程序。


#include <stdio.h>
void swap
(int*
, int*
);          //
函数参数采用传地址值方式
void main
()
{
  int num1=25
, num2=52
;
  swap
(&num1
, &num2
);          //
传地址值
  printf
("
返回后地址:num1=%d
,num2=%d\n"
,&num1
,&num2
);
  printf
("
返回后数据:num1=%d
,num2=%d\n"
,num1
,num2
);
}
void swap
(int *P1
, int *P2
)
{
  int *temp
;
  printf
("
原来地址:(P1
指向)num1=%d
,(P2
指向)num2=%d\n"
, P1
,P2
);
  printf
("
原来数据:num1=%d
,num2=%d\n"
,*P1
,*P2
);
  temp=P1
;                    //
交换两个指针的指向
  P1=P2
;
  P2=temp
;
  printf
("
交换地址:(P1
指向)num1=%d
,(P2
指向)num2=%d\n"
, P1
,P2
);
  printf
("
交换数据:(*P1
)num1=%d
,(*P2
)num2=%d\n"
, *P1
,*P2
);
}
  

运行结果如下:


原来地址:(P1
指向)num1=1245052
,(P2
指向)num2=1245048
原来数据:num1=25
,num2=52
交换地址:(P1
指向)num1=1245048
,(P2
指向)num2=1245052
交换数据:(*P1
)num1=52
,(*P2
)num2=25
返回后地址:num1=1245052
,num2=1245048
返回后数据:num1=25
,num2=52
  

从函数swap中可见,函数只是对指针P1和P2进行操作,让两者的值对换,即将两者的指向进行对换。原来P1指向25的地址,P2指向52的地址,现在变成P2指向25的地址,P1指向52的地址。

因为交换了指向的地址,所以P1和P2指向地址的内容发生了变化。这就是在被调函数里交换了两个变量的值。当然,主函数中的值并没有发生变化。是否变化,要等从被调函数返回之后才知道。

在被调函数里,指针都是临时变量,离开被调函数即自行消失。提供的指针变量,可以对存储地址的内容进行操作。但swap函数没有进行这种操作,所以也就没有改变原来的参数值。调用返回后,并不会改变原来变量的值。

swap函数里交换的是值,所以使用普通变量即可。修改后的swap函数如下:


void swap
(int *P1
, int *P2
)
{ int temp
; temp=*P1
; *P1=*P2
; *P2=temp
; }