讀古今文學網 > 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
; }