1. 河豚號(hào) > 生活百科 >

c函數(shù)指針函數(shù)(指針函數(shù)的定義及用法)

函數(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)入正題。

 

C語(yǔ)言進(jìn)階:函數(shù)指針的定義與使用

 

我們先來(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ù)的指針;

 

C語(yǔ)言進(jìn)階:函數(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;

}

 

C語(yǔ)言進(jìn)階:函數(shù)指針的定義與使用

 

代碼和結(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ù)組。

 

C語(yǔ)言進(jìn)階:函數(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

聯(lián)系我們

在線(xiàn)咨詢(xún):點(diǎn)擊這里給我發(fā)消息

微信號(hào):15705946153

工作日:9:30-18:30,節(jié)假日休息