函式指標(指向函式的指標)
乙個函式在編譯之後,會佔據一部分記憶體,而它的函式名,就是這段函式的首位址。
可以把乙個指標宣告成為乙個指向函式的指標。
c 語言規定函式名會被轉換為指向這個函式的指標,除非這個函式名作為 & 操作符或 sizeof 操作符的運算元(注意:函式名用於 sizeof 的運算元是非法的)。也就是說 f = test; 中 test 被自動轉換為 &test,而 f = &test; 中已經顯示使用了 &test,所以 test 就不會再發生轉換了。因此直接引用函式名等效於在函式名上應用 & 運算子,兩種方法都會得到指向該函式的指標。
示例1
int fun1(int,int);int fun1(int a, int
b)int
main()
函式名 test,是乙個符號用來標識乙個函式的入口位址,在使用中函式名會被轉換為指向這個函式的指標,指標的值就是函式的入口位址,&test 在前面已經說了:顯示獲取函式的位址。*test 可以認為由於 test 已經被轉換成了函式指標, 指向這個函式,所以 *test 就是取這個指標所指向的函式名,而又根據函式名會被轉換指向該函式的指標的規則,這個函式也轉變成了乙個指標,所以 *test 最終也是乙個指向函式 test 的指標。也就是說:*test --> *(&test) --> test --> &test。上述關係十分重要!
示例1的補充
#include int fun1(int,int);int fun1(int a, int
b)/*
要呼叫上面定義函式的主函式
*/int
main ()
//根據關係 *fun1==*&fun1==fun1==&fun1 可知,以上的執行結果會得到4個5+7。
函式指標乙個呼叫形式,另外三種函式呼叫形式
指標函式(返回值為指標的函式)
所謂指標函式,就是返回指標的函式,c語言的庫函式中有很多都是指標函式
函式的返回值不僅僅侷限於指向變數的指標,也可以是指向函式的指標
int* pfun1(int,int); //不帶括號就表示返回值是指標
兩者混用(不常用)
首先來看這個宣告:*int (*function(int)) (double*, char); 要了解此宣告的含義,首先來看 function(int),將 function 宣告為乙個函式,它帶有乙個 int 型的形式引數,這個函式的返回值為乙個指標,正是函式指標 int (*) (double*, char); 這個指標指向乙個函式,此函式返回 int 型並帶有兩個分別是 double* 型和 char 型的形參(繞的很)。
函式指標陣列
假設現在有乙個檔案處理程式,通過乙個選單按鈕來選擇相應的操作(開啟檔案,讀檔案,寫檔案,關閉檔案)。這些操作都實現為函式且型別相同,分別為:
voidopen();
void
read();
void
write();
void close();
現在定義乙個函式指標型別的別名pf:
typedef void (*pf) ( );
pf file_options[ ] =;
如果不使用 typedef,那麼分析起來就會比較複雜,結果是 void (*file_options[ ]) ( );
這個陣列中的元素都是指向不接受引數且不返回任何值的函式的指標,因此這是乙個函式指標陣列。
函式與指標的複雜宣告(不做要求,一般用typedef代替它)
int *(*(*fp)(int)) [10];
1.從未定義的變數名開始閱讀 --------------------------------------------fp2.往右看,什麼也沒有,遇到了),因此往左看,遇到乙個* ------乙個指向某物件的指標
3.跳出括號,遇到了(int) -----------------------------------乙個帶乙個int引數的函式
4.向左看,發現乙個* ---------------------------------------(函式)返回乙個指向某物件的指標
5.跳出括號,向右看,遇到[10] ------------------------------乙個10元素的陣列
6.向左看,發現乙個* ---------------------------------------乙個指向某物件指標
7.向左看,發現int ----------------------------------------- int型別
所以 fp 是指向函式的指標(函式指標), 該函式返回乙個指向陣列的指標,此陣列有 10 個 int* 型的元素。
int *(*(*fp)(int)) [10]; (*fp)(int)是乙個指向函式的指標ptr*(*fp)(int)相當於乙個指標ptr1(指標函式的返回值)最後剩下int *ptr1[10],可以理解。
函式名和指標的關係
函式名和指標的關係 函式名也是一種指標,因為函式名是函式的入口位址,所以函式的名字就可以被賦值乙個對應的函式指標了,我們我可以通過函式指標來呼叫這個函式,和指標一樣,在32位系統裡面,函式名佔4個位元組,在16位系統裡面佔2個位元組,在64位系統裡面佔8個位元組。而指標本身不是位址,指標式用來儲存位...
指標與函式的關係
c語言中的指標變數可以指向乙個函式 函式指標可以作為引數傳遞給其它函式 函式的返回值可以是乙個指標值。1 指向函式的指標 函式雖然不是變數,但是它在記憶體中占有實際位置。函式的首位址就是該函式的入口位址,它可以賦給指標變數,使得指標變數指向函式。利用指向函式的指標變數,可以代替函式名,也可以作為函式...
傳入函式的陣列和指標之間的關係
函式引數表中的陣列實際上是指標 sizeof a sizeof int 但是指標傳進函式之後,可以用陣列的運算子進行運算。include void minmax int a,int len,int min,int max main int min,max printf main d n sizeof...