[例1012]編寫一個交換兩個整數的函數。
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語句來實現。如果需要從一個函數返回多個結果時,返回值就不再適合了。可以通過設置全局變量的方法,增加數據的傳送通道。但在函數中使用全局變量編程,會降低程序的通用性、清晰性。為此,我們可以用指針變量作為函數的形參返回多個結果。
[例1013]編寫一函數,找出一整型數組中的最大數和最小數。
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]