01
創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的隆昌網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
指針函數(shù)通常是指函數(shù)返回值是指針的一類函數(shù),如圖所示。
02
函數(shù)指針是指指向某個(gè)具體函數(shù)的指針變量,在程序設(shè)計(jì)時(shí)可以用來(lái)調(diào)用某個(gè)特定函數(shù)或者做某個(gè)函數(shù)的參數(shù)。其形式一般如圖:
03
指針函數(shù)與函數(shù)指針本質(zhì)上的區(qū)別是,指針函數(shù)是一個(gè)帶指針的函數(shù),總的來(lái)說(shuō)還是一個(gè)函數(shù),如圖就是一個(gè)帶*name指針的函數(shù)
04
函數(shù)指針是指向函數(shù)的指針變量,本質(zhì)上還是一個(gè)指針,其格式如下,可以看到和指針函數(shù)的格式非常像,所以一定要用心留意。
#includestring.h??//?導(dǎo)入頭文件string.h
#includestdio.h???//?導(dǎo)入頭文件stdio.h
char?*fun(char?*t)??//?定義函數(shù),?名稱fun,?輸入?yún)?shù)為char?*,?返回值為char?*
{
char?*p?=?t;????//?把t的值賦值給p,?相當(dāng)于p指向與t相同的字符串
return?p?+?strlen(t)?/?2;???//?strlen返回值為字符串長(zhǎng)度,?然后p位移其一半(向下取整)的距離并返回值
}
int?main(int?argc,?char?*argv[])
{
char?*str?=?"abcdefgh";?//?str指向字符串“abcdefgh”
str?=?fun(str);?????????//?str調(diào)用fun函數(shù),?參數(shù)為str,?并將返回值賦值給str
puts(str);??????????????//?此時(shí)str指向e,?輸出為“efgh\n”
return?0;
}
如果在程序中定義了一個(gè)函數(shù),那么在編譯時(shí)系統(tǒng)就會(huì)為這個(gè)函數(shù)代碼分配一段存儲(chǔ)空間,這段存儲(chǔ)空間的首地址稱為這個(gè)函數(shù)的地址。而且函數(shù)名表示的就是這個(gè)地址。既然是地址我們就可以定義一個(gè)指針變量來(lái)存放,這個(gè)指針變量就叫作函數(shù)指針變量,簡(jiǎn)稱函數(shù)指針。
那么這個(gè)指針變量怎么定義呢?雖然同樣是指向一個(gè)地址,但指向函數(shù)的指針變量同我們之前講的指向變量的指針變量的定義方式是不同的。例如:
int(*p)(int, int);
這個(gè)語(yǔ)句就定義了一個(gè)指向函數(shù)的指針變量 p。首先它是一個(gè)指針變量,所以要有一個(gè)“*”,即(*p);其次前面的 int 表示這個(gè)指針變量可以指向返回值類型為 int 型的函數(shù);后面括號(hào)中的兩個(gè) int 表示這個(gè)指針變量可以指向有兩個(gè)參數(shù)且都是 int 型的函數(shù)。所以合起來(lái)這個(gè)語(yǔ)句的意思就是:定義了一個(gè)指針變量 p,該指針變量可以指向返回值類型為 int 型,且有兩個(gè)整型參數(shù)的函數(shù)。p 的類型為 int(*)(int,int)。
所以函數(shù)指針的定義方式為:
函數(shù)返回值類型 (* 指針變量名) (函數(shù)參數(shù)列表);
“函數(shù)返回值類型”表示該指針變量可以指向具有什么返回值類型的函數(shù);“函數(shù)參數(shù)列表”表示該指針變量可以指向具有什么參數(shù)列表的函數(shù)。這個(gè)參數(shù)列表中只需要寫函數(shù)的參數(shù)類型即可。
我們看到,函數(shù)指針的定義就是將“函數(shù)聲明”中的“函數(shù)名”改成“(*指針變量名)”。但是這里需要注意的是:“(*指針變量名)”兩端的括號(hào)不能省略,括號(hào)改變了運(yùn)算符的優(yōu)先級(jí)。如果省略了括號(hào),就不是定義函數(shù)指針而是一個(gè)函數(shù)聲明了,即聲明了一個(gè)返回值類型為指針型的函數(shù)。
那么怎么判斷一個(gè)指針變量是指向變量的指針變量還是指向函數(shù)的指針變量呢?首先看變量名前面有沒(méi)有“*”,如果有“*”說(shuō)明是指針變量;其次看變量名的后面有沒(méi)有帶有形參類型的圓括號(hào),如果有就是指向函數(shù)的指針變量,即函數(shù)指針,如果沒(méi)有就是指向變量的指針變量。
這樣說(shuō)吧:
有2個(gè)箱子,編號(hào)分別是a,b,a裝了一個(gè)蘋果,b裝了一個(gè)梨子,
有2張紙,編號(hào)分別是p,q,p紙上寫著a,q紙上寫著b。
1、現(xiàn)在我準(zhǔn)備一張白紙,編號(hào)為t,把p紙上寫的a抄到t上,然后擦掉p紙上的a,寫成b;把q紙上的b摖掉,然后把t紙上寫的a抄到q紙上,那蘋果和梨子交換了嗎?
2、現(xiàn)在我準(zhǔn)備一個(gè)空箱子,編號(hào)為t,根據(jù)p紙上寫的箱子編號(hào)a,把a(bǔ)箱子中的東西取出并放到箱子t,根據(jù)q紙上寫的箱子編號(hào)b,把b箱子中的東西取出并放到p紙上寫的箱子a中,然后把t箱子中的東西取出放到q紙上寫的箱子b中,蘋果和梨子交換了嗎?