1.指針函數(shù)
先看下面的函數(shù)聲明,注意,此函數(shù)有返回值,返回值為int *,即返回值是指針類型的。
int *f(int a, int b);
上面的函數(shù)聲明又可以寫成如下形式:
int* f(int a, int b);
讓指針標志 * 與int緊貼在一起,而與函數(shù)名f間隔開,這樣看起來就明了些了,f是函數(shù)名,返回值類型是一個int類型的指針。
首先它是一個函數(shù),只不過這個函數(shù)的返回值是一個地址值。函數(shù)返回值必須用同類型的指針變量來接受,也就是說,指針函數(shù)一定有函數(shù)返回值,而且,在主調(diào)函數(shù)中,函數(shù)返回值必須賦給同類型的指針變量。
下面看指針函數(shù)的實現(xiàn):
int *f(int a, int b); // 聲明指針函數(shù)
int _tmain(int argc, _TCHAR* argv[])
{
printf("------------------------------ Start
");
int *p1 = NULL;
printf("The memeory address of p1 = 0x%x
", p1);
p1 = f(1, 2);
printf("The memeory address of p1 = 0x%x
", p1);
printf("*p1 = %d
", *p1);
printf("------------------------------ End
");
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
", p);
memset(p, 0, sizeof(int));//將已開辟內(nèi)存空間 p 的首sizeof(int) 個字節(jié)的值設為值 0
*p = a + b;
printf("*p = %d
", *p);
return p;
}
通過運行結(jié)果,可以看出,指針函數(shù)f返回的類型是一個指針類型,因為f是賦值給int類型指針p1的,如果不是指針類型,編譯就會出錯。
下面是運行結(jié)果:
2.函數(shù)指針
顧名思義,函數(shù)指針說的就是一個指針,但這個指針指向的函數(shù),不是普通的基本數(shù)據(jù)類型或者類對象。
函數(shù)指針的定義如下:
int (*f)(int a, int b); // 聲明函數(shù)指針
通過與1中指針函數(shù)的定義對比可以看到,函數(shù)指針與指針函數(shù)的最大區(qū)別是函數(shù)指針的函數(shù)名是一個指針,即函數(shù)名前面有一個指針類型的標志型號"*"。
注意指針函數(shù)與函數(shù)指針表示方法的不同,千萬不要混淆。最簡單的辨別方式就是看函數(shù)名前面的指針*號有沒有被括號()包含,如果被包含就是函數(shù)指針,反之則是指針函數(shù)。
當然,函數(shù)指針的返回值也可以是指針。
上面的函數(shù)指針定義為一個指向一個返回值為整型,有兩個參數(shù)并且兩個參數(shù)的類型都是整型的函數(shù)。
下面是利用函數(shù)指針分別求兩個整數(shù)的最大值和最小值的用法。
/*
* 求最大值
* 返回值是int類型,返回兩個整數(shù)中較大的一個
*/
int max(int a, int b) {
return a > b ? a : b;
}
/*
* 求最小值
* 返回值是int類型,返回兩個整數(shù)中較小的一個
*/
int min(int a, int b) {
return a
}
int (*f)(int, int); // 聲明函數(shù)指針,指向返回值類型為int,有兩個參數(shù)類型都是int的函數(shù)
int _tmain(int argc, _TCHAR* argv[])
{
printf("------------------------------ Start
");
f = max; // 函數(shù)指針f指向求最大值的函數(shù)max
int c = (*f)(1, 2);
printf("The max value is %d
", c);
f = min; // 函數(shù)指針f指向求最小值的函數(shù)min
c = (*f)(1, 2);
printf("The min value is %d
", c);
printf("------------------------------ End
");
getchar();
return 0;
}
執(zhí)行結(jié)果如下:
|