指標系統學習6-指向函式的指標
阿新 • • 發佈:2018-11-30
1.用函式指標變數呼叫函式
可以用指標變數指向整型變數、字串、陣列,也可以指向一個函式。一個函式在編譯時被分配給一個入口地址。這個函式的入口地址就稱為函式的指標。
//指向函式的指標 /****************************/ /* 比較a 和 b的大小,求大值 */ /****************************/ #include <stdio.h> #if(0)//預編譯命令:if語句為0,則不用編譯,為1則編譯! // c語言不允許巢狀註釋,所以用此方法可以註釋比較多內容 void main() { int max(int, int); int a, b, c; scanf("%d %d", &a, &b); c = max(a, b); printf("a = %d, b = %d, max = %d\n\n", a, b, c); } #endif int max(int x, int y) { int z; if( x > y ) { z = x; } else { z = y; }return z; } #if(1) //將 main 函式改寫為 #include <stdio.h> void main() { int max(int, int); int (*p)();//定義了一個函式指標(指向函式的指標) int a, b, c; p = max; scanf("%d %d", &a, &b); c = (*p)(a, b); printf("a = %d, b = %d, max = %d\n\n", a, b, c); }#endif
2.用指向函式的指標作函式引數:
函式指標變數常用的用途之一是把指標作為引數傳遞到其他函式。
前面介紹過,函式的引數可以是變數、指向變數的指標變數、陣列名、指向陣列的指標變數等。
現在介紹指向函式的指標也可以作為引數,以實現函式地址的傳遞,這樣就能夠在被呼叫的函式中使用實參函式。
// 實參函式名 f1 f2 ↓ ↓ void sub( int (*x1)(int),int (*x2)(int,int)) { int a,b,i,j; a=(*x1)(i); /*呼叫f1函式*/ b=(*x2)(i,j);/*呼叫f2函式*/ … }
它的原理可以簡述如下:有一個函式(假設函式名為sub),它有兩個形參(x1和x2),定義x1和x2為指向函式的指標變數。在呼叫函式sub時,實參為兩個函式名f1和f2,給形參傳遞的是函式f1和f2的地址。這樣在函式sub中就可以呼叫f1和f2函數了。
實戰演練:
設一個函式process,在呼叫它的時候,每次實現不同的功能。(有點類似多型)
輸入a和b兩個數,第一次呼叫process時找出a和b中大者,第二次找出其中小者,第三次求a與b之和。
/***********************************************************/ /* 設一個函式process,在呼叫它的時候,每次實現不同的功能。*/ /* 輸入a和b兩個數,第一次呼叫process時找出a和b中大者,*/ /* 第二次找出其中小者,第三次求a與b之和。 */ /***********************************************************/ #include <stdio.h> void main() { int max(int, int); /* 函式宣告 */ int min(int, int); /* 函式宣告 */ int add(int, int); /* 函式宣告 */ void process( int, int, int(*fun)() ); /* 函式宣告 */ int a, b; printf("Endter a and b: "); scanf("%d %d", &a, &b); printf("max = "); process(a, b, max); printf("min = "); process(a, b, min); printf("sum = "); process(a, b, add); } int max(int x, int y) /* 函式定義 */ { int z; if( x > y ) { z = x; } else { z = y; } return z; } int min(int x, int y) /* 函式定義 */ { int z; if( x < y ) { z = x; } else { z = y; } return z; } int add(int x, int y) { int z; z = x + y; return z; } void process( int x, int y, int(*fun)() ) /* 函式定義 */ { int result; result = (*fun)(x, y); printf("%d\n", result); }View Code