函數的參數不僅可以是整型、實型、字符型等數據,還可以是指針類型。指針類型參數的作用是將一個變量的地址傳遞到另一個函數的參數中。指針變量作函數參數主要有以下幾個用途:
1.允許函數操作其調用程序的數據
C語言規定,實參變量對形參變量的數據傳遞是單向值傳遞,把一個簡單變量從一個函數傳遞到另一個函數時,該函數就得到了一個調用值的副本。在函數的語句中給參數賦一個新值會改變參數在這個函數中的局部副本,但不會影響調用參數。例如:
voidsetzero(intvar)
{
var=0;
}
voidmain()
{
inta=5;
setzero(a);
printf("a=%d\n",a);
}
運行結果為:
a=5
這個結果告訴我們,setzero函數沒有改變變量a的值。
程序分析:程序運行時,首先執行main函數,變量a被分配內存並被初始化為5,(a);在調用setzero函數時,將變量a的值的副本傳遞給形參var,因此虛實結合後形參var的值為5,(b);接著執行setzero函數的函數體,把var的值賦為0,(c);函數調用結束後,形參變量var不複存在,變量a的值沒有改變,(d)。
解決這個問題的方法之一就是用指針變量作為函數的參數,在函數調用時,將實參的指針傳遞給函數的形參,使該函數在函數體內通過“間接訪問”來操作其調用程序的數據。於是把上麵的程序修改為:
voidsetzero(int*var)/*指針變量作為函數的參數*/
{
*var=0;/*通過指針變量間接訪問*/
}
voidmain()
{
inta=5;
setzero(&a);/*把變量a的指針&a傳遞給函數形參var*/
printf("a=%d\n",a);
}
運行結果為:
a=0
這個結果告訴我們,setzero函數已經改變了變量a的值。
程序分析:setzero函數是用戶自定義的函數,作用是把變量的值賦0,setzero函數的參數var是一個指針變量。程序運行時,先執行main函數,變量a被分配內存並初始化,(a)。在調用setzero函數時,將變量a的指針(&a)傳遞給形參var。采取的依然是值傳遞,隻不過這個值是指針。因此虛實結合後形參var的值為&a,這時指針變量var就指向了變量a,(b)。接著執行setzero函數的函數體,把*var的值賦為0,也就是把變量a的值賦為0,(c)。函數調用結束後,指針變量不複存在,變量a的值已經被賦值為0,(d)。最後在main函數中輸出變量a的值。
按下列步驟完成用指針變量作為函數的形參:
(1)把函數參數聲明為指針變量;
(2)在函數體內使用指針變量間接訪問它所指向的對象;
(3)當調用函數時,將實參變量的地址作為參數傳遞給形參指針變量。