/*
成都創(chuàng)新互聯(lián)公司專(zhuān)業(yè)為企業(yè)提供鞏留網(wǎng)站建設(shè)、鞏留做網(wǎng)站、鞏留網(wǎng)站設(shè)計(jì)、鞏留網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、鞏留企業(yè)網(wǎng)站模板建站服務(wù),十余年鞏留做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
函數(shù)指針,關(guān)鍵是后面兩個(gè)字“指針”,顧名思義,是一個(gè)指向函數(shù)的指針
原理:函數(shù)在創(chuàng)建好了后,函數(shù)的代碼會(huì)在內(nèi)存中占有個(gè)位置,這時(shí)我們創(chuàng)造一個(gè)指針來(lái)指向這個(gè)地址,這個(gè)指針就叫函數(shù)指針
函數(shù)指針不可以移動(dòng),想要移動(dòng)指針的位置來(lái)指向函數(shù)的下一個(gè)指令的想法是錯(cuò)誤的
函數(shù)指針的要求,
1,首先這個(gè)指針,要和函數(shù)的返回類(lèi)型一樣
2,指針的*和名字,要用小括號(hào)括起來(lái)//不括起來(lái)就是指針函數(shù)了,意思就變成,函數(shù)返回一個(gè)指針了
3,最右邊的小括號(hào)里形參位置的類(lèi)型,形參的個(gè)數(shù),也要和函數(shù)定義時(shí)的形參一致,只要類(lèi)型,不要形參名即可,
但是加上形參名也可以,沒(méi)毛病,看上去也更清晰
*/
#include
void swapchar(char *a, char *b)
{
char t;
t = *a;
*a = *b;
*b = t;
}
void swapchar2(char * a2, char * b2)
{
printf("this is swapchar2");
}
int main(void)
{
char chf = 'a', chg = 'j';
void(*p)(char * a, char * b);//定義函數(shù)指針、形參名字a、b可有可無(wú),但有的話(huà)看上去更清晰,只要函數(shù)定義的類(lèi)型、參數(shù)類(lèi)型、以及參數(shù)個(gè)數(shù),與這個(gè)指針一致,那么這個(gè)指針p,就可以指向它
p = swapchar;//p指針接管swapchar函數(shù),只要給函數(shù)名字,就可以給過(guò)去了
printf("chf=%c,chg=%c ", chf, chg);
p(chf, chg);
printf("chf=%c,chg=%c ", chf, chg);
p = swapchar2;//這里把swapchar2函數(shù)的地址,給了p,這時(shí)p從swapchar地址,轉(zhuǎn)移到了swapchar2這里。
p(chf,chg);
return 0;
}
1樓感覺(jué)對(duì)函數(shù)指針不是很了解,就不評(píng)論了. 2樓的基本還可以,但是int (*p)(),然后讓它指向max函數(shù),一個(gè)包含兩個(gè)未知量的函數(shù),這在后來(lái)的標(biāo)準(zhǔn)c里面是不支持的好像. 3樓吧,那么多*,感覺(jué)有點(diǎn)不大對(duì). *是取內(nèi)容,連著那么* ,我沒(méi)試過(guò),沒(méi)有多少意義至少.他11級(jí)了,應(yīng)該也不會(huì)怎么有錯(cuò),你可以試試(我不打算加那么多*, 就不調(diào)試了).
程序里面對(duì)函數(shù)的調(diào)用,就是通過(guò)函數(shù)的入口地址,然轉(zhuǎn)入函數(shù). 這樣的話(huà),函數(shù)指針的意義就明顯了.函數(shù)指針指向了函數(shù)的入口,即函數(shù)指針里是函數(shù)的入口地址. 指針不能指向函數(shù)這種說(shuō)法肯定是不對(duì)的.話(huà)說(shuō)回來(lái),1樓的老兄可能看錯(cuò)書(shū)了,或者記錯(cuò)了.
類(lèi)型匹配很重要,二樓的聲明和使用不一致,這在老版的編譯器里也是支持的.那時(shí)候ANSI標(biāo)準(zhǔn)還沒(méi)有制定出來(lái).現(xiàn)在而言,這種定義應(yīng)該不被支持了才是.
那個(gè)聲明應(yīng)該如下:
int (*p)(int , int);
這樣才能指向
int name(int,int)型的函數(shù).么有實(shí)驗(yàn)過(guò),但按這種寫(xiě)法是不錯(cuò)的肯定.
三樓那個(gè)********p,怎么都覺(jué)得不對(duì).
C語(yǔ)言的大多語(yǔ)法都是簡(jiǎn)單易懂的,這常常會(huì)給初學(xué)者一種“別人都說(shuō)C語(yǔ)言難,我看也不過(guò)如此”的感覺(jué)。但是這種感覺(jué)常常會(huì)停止在初學(xué)者學(xué)到指針時(shí),這是一些讀者跟我說(shuō)的。
鑒于很多C語(yǔ)言初學(xué)者都覺(jué)得指針?lè)浅ky,
小明定義了一個(gè)C語(yǔ)言函數(shù) int f(int * ),為什么 f(5) 不能正常工作呢?
如果希望傳遞 5 給函數(shù) f(),在C99中,可以使用下面這種方法:
f( (int[]){5} );
上面這行C語(yǔ)言代碼相當(dāng)于定義了一個(gè)數(shù)組,并且數(shù)組只有一個(gè)元素 5,函數(shù) f() 接收到的參數(shù)是該數(shù)組,只不過(guò)這一過(guò)程中的數(shù)組名沒(méi)有“顯示”。
拋開(kāi)C99的這個(gè)特性,C語(yǔ)言調(diào)用 f(5) 就不能這么寫(xiě)了,而是需要借助變量:
int five = 5;
f(five);
在C語(yǔ)言中,接受某個(gè)值指針的函數(shù)是有可能通過(guò)該指針修改該值的(即使程序員無(wú)此打算,C語(yǔ)言還是會(huì)一直這么認(rèn)為),因此只有變量才能勝任。在C語(yǔ)言中,常數(shù)是只讀的,只能作為右值, 運(yùn)算符是不能處理常數(shù) 5 的,f(five) 會(huì)引發(fā)編譯錯(cuò)誤。
f(five) 會(huì)引發(fā)編譯錯(cuò)誤
表達(dá)式 * p++ 增加了 p 指向的數(shù)值,還是指針 p 本身?
C語(yǔ)言中的 ++ 和 — 運(yùn)算符的優(yōu)先級(jí)高于 * 運(yùn)算符,所以 *p++ 其實(shí)就相當(dāng)于 *(p++)。顯然,++ 運(yùn)算符增加的是指針 p 本身的值,不過(guò)在指針 p 自增之前,*p++會(huì)先返回 p 指向的值。如果希望 ++ 運(yùn)算符增加 p 指向的值,應(yīng)該使用括號(hào)運(yùn)算符:(*p)++。
小明想使用指針操作數(shù)組里的數(shù)值,下面這段C語(yǔ)言代碼有什么問(wèn)題?
小明預(yù)計(jì)程序會(huì)輸出 3,但是程序卻輸出了“垃圾值”,他的C語(yǔ)言代碼如下,請(qǐng)看:
int array[5], i, *ip;
for(i = 0; i 5; i++)
array[i] = i;
ip = array;
printf("%d\n", *(ip + 3 * sizeof(int)));
加個(gè)注釋吧:
/*
函數(shù)x
參數(shù)1:?類(lèi)型?int?未標(biāo)注形參
參數(shù)2:?類(lèi)型?void(*)(int)?形參y
返回值:?類(lèi)型?void(*)(int)
*/
void(*x(int,void(*y)(int)))(int);
其中 “void(*)(int)" 代表接收一個(gè)int參數(shù)返回類(lèi)型為void的函數(shù)指針類(lèi)型,比如:
void?foo(int?i)
{
printf("%d",?i);
}
所以你可以這樣調(diào)用它:
...
void?(*pf)(int);
int?i?=?0;
pf?=?x(i,?foo);
...
新聞名稱(chēng):c語(yǔ)言函數(shù)接收指針 c語(yǔ)言接收函數(shù)返回值
瀏覽地址:http://bm7419.com/article22/ddejcjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、Google、網(wǎng)站策劃、網(wǎng)站內(nèi)鏈、網(wǎng)站改版、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容