1.指針函數(shù)
先看下面的函數(shù)聲明,注意,此函數(shù)有返回值,返回值為int *,即返回值是指針類型的。
[cpp] view plain copyint *f(int a, int b); 上面的函數(shù)聲明又可以寫成如下形式:int* f(int a, int b);讓指針標志 * 與int緊貼在一起,而與函數(shù)名f間隔開,這樣看起來就明了些了,f是函數(shù)名,返回值類型是一個int類型的指針。
下面看指針函數(shù)的實現(xiàn):
[cpp] view plain copyint *f(int a, int b); // 聲明指針函數(shù) int _tmain(int argc, _TCHAR* argv[]) { PRintf("------------------------------ Start/n"); int *p1 = NULL; printf("The memeory address of p1 = 0x%x /n", p1); p1 = f(1, 2); printf("The memeory address of p1 = 0x%x /n", p1); printf("*p1 = %d /n", *p1); printf("------------------------------ End/n"); getchar(); return 0; } /* * 指針函數(shù)的定義 * 返回值是指針類型int * */ int *f(int a, int b) { int *p = (int *)malloc(sizeof(int)); printf("The memeory address of p = 0x%x /n", p); memset(p, 0, sizeof(int)); *p = a + b; printf("*p = %d /n", *p); return p; } 通過運行結果,可以看出,指針函數(shù)f返回的類型是一個指針類型,因為f是賦值給int類型指針p1的,如果不是指針類型,編譯就會出錯。下面是運行結果:

從上圖的運行結果可以看出,指針函數(shù)f的返回值p和f賦值給的指針p1的地址是相同的,都是指向指針函數(shù)內(nèi)部申請的內(nèi)存地址0x3b88d0。
下面是debug查看的指針p1和指針p的內(nèi)存地址。
(1)指針p1剛定義時的指向NULL,也就是空指針,地址是0。p1的地址如紅色框內(nèi)所示,p1地址為0x00000000。

(2)指針函數(shù)f內(nèi)的返回值p的地址如下圖中紅色框內(nèi)所示,p的地址是0x003b88d0:

(3)執(zhí)行完指針函數(shù)f后,把f的返回值p賦給先前定義的地址p1,此時p1的地址和p的地址相同。p1的地址如下圖中紅色框內(nèi)所示,p1的地址是0x003b88d0,與p的地址相同,p的地址如下圖中藍色框內(nèi)所示,并且兩者的值也都是3,因為是指向同一個地址,所以值必然相同:

所以,指針函數(shù)就是返回一個地址給調用者,用于需要地址的情況。
2.函數(shù)指針
顧名思義,函數(shù)指針說的就是一個指針,但這個指針指向的函數(shù),不是普通的基本數(shù)據(jù)類型或者類對象。
函數(shù)指針的定義如下:
[cpp] view plain copyint (*f)(int a, int b); // 聲明函數(shù)指針 通過與1中指針函數(shù)的定義對比可以看到,函數(shù)指針與指針函數(shù)的最大區(qū)別是函數(shù)指針的函數(shù)名是一個指針,即函數(shù)名前面有一個指針類型的標志型號“*”。當然,函數(shù)指針的返回值也可以是指針。
上面的函數(shù)指針定義為一個指向一個返回值為整型,有兩個參數(shù)并且兩個參數(shù)的類型都是整型的函數(shù)。
下面是利用函數(shù)指針分別求兩個整數(shù)的最大值和最小值的用法。
[cpp] view plain copy/* * 求最大值 * 返回值是int類型,返回兩個整數(shù)中較大的一個 */ int max(int a, int b) { return a > b ? a : b; } /* * 求最小值 * 返回值是int類型,返回兩個整數(shù)中較小的一個 */ int min(int a, int b) { return a < b ? a : b; } int (*f)(int, int); // 聲明函數(shù)指針,指向返回值類型為int,有兩個參數(shù)類型都是int的函數(shù) int _tmain(int argc, _TCHAR* argv[]) { printf("------------------------------ Start/n"); f = max; // 函數(shù)指針f指向求最大值的函數(shù)max int c = (*f)(1, 2); printf("The max value is %d /n", c); f = min; // 函數(shù)指針f指向求最小值的函數(shù)min c = (*f)(1, 2); printf("The min value is %d /n", c); printf("------------------------------ End/n"); getchar(); return 0; }執(zhí)行結果如下:

新聞熱點
疑難解答