指針與函數的關系
2019-11-17 05:29:29
供稿:網友
作者:周靜(四川)
在學習C語言的過程中,學員經常對指針和函數的關系不甚清楚。事實上,C語言中的指針變量可以指向一個函數;函數指針可以作為參數傳遞給其它函數;函數的返回值可以是一個指針值。
1.指向函數的指針
函數雖然不是變量,但是它在內存中占有實際位置。函數的首地址就是該函數的入口地址,它可以賦給指針變量,使得指針變量指向函數。利用指向函數的指針變量,可以代替函數名,也可以作為函數的參數傳遞給其它函數。
函數指針可以用如下形式說明:<類型> (*指針變量名)();
例如:int (*funcp)();
表示funcp被定義為指向一個返回值是整型量的函數。
若函數指針被說明為:float (*funcp)();
則說明了funcp是一個指向一個返回值是浮點數的函數。
以上說明中,第一對圓括號是必須要的,假如去掉,如int (*funcp)(),就變成了int *funcp();
按照運算符的優先級,編譯程序把這個說明解釋為:funcp是一個返回值為指向整型量指針的函數。
這就與前面的解釋完全不同了。
2.把指向函數的指針變量作為函數參數
函數的指針變量作為參數傳遞到其它函數中,是函數指針的重要用途之一,其基本思想是:設有一函數func(p1, p2);有兩個形參p1和p2,它們被說明為指向函數的指針變量。則在調用func()函數時,實在參數用f1和f2兩個函數名給形式參數p1和p2傳遞函數地址,這樣在函數func()中就可以調用函數f1和f2。如
f1() f2
{ {
…… ……
} }
main()
{
……
func(f1, f2) /*將兩個函數名f1,f2傳遞給func函數*/
……
}
func(p1, p2)
int (*p1)(), (*p2)();
{
int a, b, i, j;
a=(*p1)(i); /*調用函數f1*/
b=(*p2)(i, j); /*調用函數f2*/
……
}
其中i和j是函數f1和f2所要求的參數。(*p1)(i)就等價于f1(i),(*p2)(i, j)等價于f2(i, j)。利用這一基本思想,實現了同一段程序調用不同的函數進行操作。
3.返回值為指針的函數
函數返回值可以是一個指針。在函數定義時要指明,同樣在調用前也要對其進行說明。定義這種函數如同定義指針一樣,都是通過“*”來表示。一般說明形式為:
<類型符> *<函數名> (<形參數>)
(形參數說明部分)
{
……
}
需要注重的是,調用返回值是指針的函數之前,先要對其進行說明。