1.指針函數(shù)
先看下面的函數(shù)聲明,注意窜觉,此函數(shù)有返回值嘉熊,返回值為int *,即返回值是指針類型的疏咐。
[cpp] view plain copy
int *f(int a, int b);
上面的函數(shù)聲明又可以寫成如下形式:
int* f(int a, int b);讓指針標(biāo)志 * 與int緊貼在一起纤掸,而與函數(shù)名f間隔開,這樣看起來就明了些了浑塞,f是函數(shù)名借跪,返回值類型是一個(gè)int類型的指針。
下面看指針函數(shù)的實(shí)現(xiàn):
[cpp] view plain copy
int *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;
}
通過運(yùn)行結(jié)果酌壕,可以看出掏愁,指針函數(shù)f返回的類型是一個(gè)指針類型,因?yàn)閒是賦值給int類型指針p1的仅孩,如果不是指針類型托猩,編譯就會(huì)出錯(cuò)。
下面是運(yùn)行結(jié)果:
從上圖的運(yùn)行結(jié)果可以看出辽慕,指針函數(shù)f的返回值p和f賦值給的指針p1的地址是相同的京腥,都是指向指針函數(shù)內(nèi)部申請(qǐng)的內(nèi)存地址0x3b88d0。
下面是debug查看的指針p1和指針p的內(nèi)存地址溅蛉。
(1)指針p1剛定義時(shí)的指向NULL公浪,也就是空指針他宛,地址是0。p1的地址如紅色框內(nèi)所示,p1地址為0x00000000欠气。
(2)指針函數(shù)f內(nèi)的返回值p的地址如下圖中紅色框內(nèi)所示厅各,p的地址是0x003b88d0:
(3)執(zhí)行完指針函數(shù)f后,把f的返回值p賦給先前定義的地址p1预柒,此時(shí)p1的地址和p的地址相同队塘。p1的地址如下圖中紅色框內(nèi)所示,p1的地址是0x003b88d0宜鸯,與p的地址相同,p的地址如下圖中藍(lán)色框內(nèi)所示淋袖,并且兩者的值也都是3鸿市,因?yàn)槭侵赶蛲粋€(gè)地址,所以值必然相同:
所以即碗,指針函數(shù)就是返回一個(gè)地址給調(diào)用者焰情,用于需要地址的情況。
2.函數(shù)指針
顧名思義剥懒,函數(shù)指針說的就是一個(gè)指針内舟,但這個(gè)指針指向的函數(shù),不是普通的基本數(shù)據(jù)類型或者類對(duì)象蕊肥。
函數(shù)指針的定義如下:
[cpp] view plain copy
int (*f)(int a, int b); // 聲明函數(shù)指針
通過與1中指針函數(shù)的定義對(duì)比可以看到谒获,函數(shù)指針與指針函數(shù)的最大區(qū)別是函數(shù)指針的函數(shù)名是一個(gè)指針,即函數(shù)名前面有一個(gè)指針類型的標(biāo)志型號(hào)“*”壁却。
當(dāng)然,函數(shù)指針的返回值也可以是指針裸准。
上面的函數(shù)指針定義為一個(gè)指向一個(gè)返回值為整型展东,有兩個(gè)參數(shù)并且兩個(gè)參數(shù)的類型都是整型的函數(shù)。
下面是利用函數(shù)指針分別求兩個(gè)整數(shù)的最大值和最小值的用法炒俱。
[cpp] view plain copy
/*
- 求最大值
- 返回值是int類型盐肃,返回兩個(gè)整數(shù)中較大的一個(gè)
*/
int max(int a, int b) {
return a > b ? a : b;
}
/*
- 求最小值
- 返回值是int類型,返回兩個(gè)整數(shù)中較小的一個(gè)
*/
int min(int a, int b) {
return a < b ? a : b;
}
int (*f)(int, int); // 聲明函數(shù)指針权悟,指向返回值類型為int砸王,有兩個(gè)參數(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í)行結(jié)果如下:
[cpp] view plain copy