函數(shù)指針
今天準(zhǔn)備和大家講解一下我們C語(yǔ)言編程的函數(shù)指針,為什么函數(shù)也需要指針呢?我是這樣理解的函數(shù)指針?lè)奖阄覀儗?duì)函數(shù)的調(diào)用,當(dāng)我們需要把一個(gè)函數(shù)作為參數(shù)傳給其他參數(shù)的時(shí)候就必須使用函數(shù)指針才能很好的完成。我希望今天能夠很清楚很詳細(xì)地和大家分享一下函數(shù)指針這一塊的重點(diǎn)和難點(diǎn)??赐曛竽銜?huì)對(duì)函數(shù)指針的理解、定義、使用有一個(gè)比較全面的認(rèn)識(shí),廢話(huà)不多說(shuō)我們進(jìn)入正題。

我們先來(lái)看下面的代碼:
1 int * fun1 (int *ptr1, int *ptr2);
2 int * *fun2 (int *ptr1, int *ptr2);
3 int *(*fun3)(int *ptr1, int *ptr2);
在這里定義1、2、3個(gè)表達(dá)式,首先看到比較復(fù)雜的表達(dá)式不要慌,不要對(duì)它產(chǎn)生畏懼,我們先來(lái)一個(gè)一個(gè)分析。
第1個(gè)定義是什么意思?fun3是我們的函數(shù)名字沒(méi)什么問(wèn)題吧,括號(hào)里面是fun3的參數(shù),類(lèi)型都是int 行指針,和今天講的沒(méi)什么關(guān)系,括號(hào)都可以不用看,最后我們看最前面的int * 是什么意思?那不就是函數(shù)的返回值嘛,返回的是一個(gè)整型的指針。
第2個(gè)定義我們看看和第1個(gè)定義有什么區(qū)別?是不是比第1個(gè)定義多了一個(gè) * 號(hào)那其他和第一個(gè)是一樣的呀,只是返回值是一個(gè)指針的指針,是一個(gè)二級(jí)指針。
第3個(gè)定義就是我們今天的重點(diǎn)內(nèi)容,打起精神了,精彩來(lái)啦!如果我們把第3個(gè)表達(dá)式的(*fun3)看作一個(gè)整體的話(huà)你發(fā)現(xiàn)他和第一表達(dá)式 int * fun1 (int *ptr1, int *ptr2);沒(méi)有什么區(qū)別了?那它就是返回值為整型指針,參數(shù)為兩個(gè)整型的指針對(duì)吧?好我們現(xiàn)在回過(guò)頭來(lái)分析(*fun3)是什么東西,我們先看一個(gè)比較好理解的:*ptr 看到?jīng)]有?是不是很類(lèi)似,我們都知道ptr是一個(gè)指針對(duì)吧,那我們的 *fun3 和它一樣也是一樣指針,然后再看: int *ptr ; ptr是不是變成了一個(gè)整型指針?為什么是整型呢?原來(lái)他前面是int類(lèi)型的對(duì)吧都理解那就對(duì)了我們來(lái)完整地分析第3個(gè)定義:
int *(*fun3)(int *ptr1, int *ptr2);
首先我們知道這是一個(gè)函數(shù):
函數(shù)的返回值:int * 一個(gè)整型指針;
函數(shù)參數(shù):int *ptr1,int*ptr2 兩個(gè)整型指針;
(*fun3)是一指針;
總結(jié):此時(shí)fun3不是一個(gè)普通的函數(shù)名了而是一個(gè)指針變量,是一個(gè)指向函數(shù)的指針;

函數(shù)指針的用法
#include
#include
int * fun(int a ,int b)
{
if(a>b)
printf("a比b大!!n");
else
printf("a比b小!!n");
}
void max(int * (fun1)(int a,int b),int c,int d)
{
printf("max函數(shù)里面調(diào)用的n");
fun1(c,d);
}
int main()
{
int a=10;
int b=20;
int *(*fun1)(int a, int b);
fun1=&fun;
printf("fun函數(shù)正常調(diào)用的n");
fun(a,b);
printf("函數(shù)指針調(diào)用的n");
(*fun1)(a,b);
max(fun1,a,b);
return 0;
}

代碼和結(jié)果分析:
我們可以看一下三種fun函數(shù)的調(diào)用都成功了第一種的話(huà)是普通的調(diào)用給她傳參數(shù)就可以了,第二個(gè)是函數(shù)指針的調(diào)用把fun的地址賦值給了函數(shù)指針fun1,然后調(diào)用也沒(méi)問(wèn)題,重點(diǎn)是第三個(gè)用法,我們把函數(shù)fun當(dāng)做一個(gè)參數(shù)傳到了函數(shù)max里面去了,也可以實(shí)現(xiàn)對(duì)函數(shù)fun的調(diào)用,這意義太大了,這也是函數(shù)指針的魅力所在。為什么呢?你想想如果我們有很多類(lèi)似的函數(shù)十幾個(gè)二十幾個(gè)的時(shí)候我們?cè)趺垂芾砗褪褂茫@時(shí)候我們可以用函數(shù)指針去管理和調(diào)用他們,把他們都裝進(jìn)一個(gè)函數(shù)指針數(shù)組,當(dāng)然如果你夠強(qiáng)你可以在定義一樣指針指向這個(gè)數(shù)組。

在這里提一下我們的函數(shù)指針數(shù)組和函數(shù)指針數(shù)組指針:
函數(shù)指針數(shù)組:
int * (*fun[5])(int *p,int *p2)
函數(shù)指針數(shù)組指針
int * (*(fun)[5])(int *p,int *p2);
后期準(zhǔn)寫(xiě)兩篇專(zhuān)門(mén)來(lái)介紹這兩種,想在評(píng)論區(qū)聽(tīng)一下各位對(duì)這兩個(gè)知識(shí)點(diǎn)的看法總結(jié)一下理清楚思路再寫(xiě),評(píng)論區(qū)交給大佬了!
感覺(jué)寫(xiě)的有些廢頭發(fā),不知道你們看完知道什么是函數(shù)指針沒(méi)有?
本文由網(wǎng)上采集發(fā)布,不代表我們立場(chǎng),轉(zhuǎn)載聯(lián)系作者并注明出處:http://m.zltfw.cn/shbk/38590.html