正文 第33章 指針6(2 / 2)

[例1012]編寫一個交換兩個整數的函數。

voidswap(int*p1,int*p2)

inttemp;

temp=*p1;

*p1=*p2;

*p2=temp;

voidmain()

inta=5,b=9;

swap(&a,&b);

printf("a=%d,b=%d\n",a,b);

運行結果為:

a=9,b=5

對程序的分析:swap函數是用戶自定義的函數,它的作用是交換兩個整數的值,為了達到這個目的,swap函數的兩個形參p1、p2必須定義為一個指針變量。程序運行時,先執行main函數,變量a和b被分配內存並初始化,(a)。在調用swap函數時,將變量a的指針(&a)傳遞給形參p1,將變量b的指針(&b)傳遞給形參p2。虛實結合後形參p1的值為&a,這時指針變量p1就指向了變量a,形參p2的值為&b,這時指針變量p2就指向了變量b,b)。接著執行swap函數的函數體,把*p1和*p2交換,也就是把變量a和b的值交換,(c)。函數調用結束後,指針變量p1和p2不複存在,變量a和b的值已經被交換,(d)。最後在main函數中輸出變量a和b的值。

在編寫swap函數的時候,很容易犯下麵的錯誤:

第一種錯誤:

voidswap(int*p1,int*p2)

int*temp;

temp=p1;

p1=p2;

p2=temp;

這裏沒有語法錯誤,但交換的隻是指針變量p1和p2的值,它們所指向的對象的值不會變。

第二種錯誤:

voidswap(int*p1,int*p2)

int*temp;

temp=*p1;/*類型不一致*/

*p1=*p2;

*p2=temp;

這裏有語法錯誤,不能將*p1(也就是它所指向的對象)的int型值賦給指針變量p1。

2.函數返回多個結果

當一個函數需要給調用程序返回單個值時,可以把單個值作為函數本身的值返回,用return語句來實現。如果需要從一個函數返回多個結果時,返回值就不再適合了。可以通過設置全局變量的方法,增加數據的傳送通道。但在函數中使用全局變量編程,會降低程序的通用性、清晰性。為此,我們可以用指針變量作為函數的形參返回多個結果。

[例1013]編寫一函數,找出一整型數組中的最大數和最小數。

voidfindmaxmin(intarr[],intn,int*max,int*min)

intt1,t2,i;

t1=t2=arr[0];

for(i=1;i

t1)

t1=arr[i];

if(arr[i]