亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

C/C++語言中指向函數的指針

2019-11-17 05:27:03
字體:
來源:轉載
供稿:網友

  “在C語言中,函數本身不是變量,但可以定義指向函數的指針,這種指針可以被賦值、存放于數組之中,傳遞給函數及作為函數的返回值等”?。禩he C PRogramming Language Second Edition》

下面給出幾個簡單的例子來說明指向函數的指針。

第一個例子說明指向函數的指針如何說明、賦值、調用。

#include
#define TESTDATE 100

int func(int a)  /* func用于打印一個整數 */
{
return printf("%d/n",a);
}


main()
{
int (*FunctionPionter)(int a);
FunctionPionter = func;
(*FunctionPionter)(TESTDATE);
return 0;
}

其中重點語句的含義如下:
int (*FunctionPionter)(int a);
FunctionPionter: 指向一個返回整數的函數的指針,這個指針有一個整數參數。
FunctionPionter = func;
將FunctionPionter指向函數func;其中函數必須已經定義,且函數和函數指針的說明的返回值必須一致。 
(*FunctionPionter)(TESTDATE);
通過函數指針調用函數;因為函數指針已經指向函數,所以用*取出函數指針的內容就為函數本身。

下面這個例子顯示如何將指向函數的指針傳遞給函數、作為函數的返回類型。在這個例子中,有三個函數:
hello:返回字符指針的函數,用來返回字符串“hello world!/n”
RetFunc:返回一個指向函數的指針的函數,且返回指針所指的那個函數為一個返回字符指針的函數。
call:返回一個void *型的指針,且call有一個指向函數的指針的參數,且這個函數指針返回一個字符指針

#include
#define MAX 100

main()
{
void *call(char *(*)());
char *(*RtnFunc())();  

/* 上面兩個說明有些復雜 */

printf("%s",call(RtnFunc()));
return 0;
}

char *hello()
{
return "Hello World!/n";
}

char *(*RtnFunc())()
{
return hello;
}

void *call(char *(*func)())
{
return (*func)();
}

上面的例子中,main()無法直接調用hello函數,利用兩個函數分別返回hello和調用hello,實現了在main()中調用hello。雖然,似乎這個程序顯得多余但卻很好的說明了如何把指向函數的指針傳遞給函數、作為函數的返回。其中call函數利用了void *型指針的靈活機制,使得call的適用性大為增加,這也正是指向函數的指針的優點之一。同樣的例子是《The C Programming Language Second Edition》中下面這個函數調用:

qsort((void **) lineptr, 0, nlines-1, (int (*)(void *, void *))(numeric ? numcmp : strcmp));

其中,使用了兩次強制類型轉換,其中第二甚至是利用指向函數的指針,將函數的類型進行了轉換。當然上面語句在某些編譯器上無法通過,因為某些編譯器要求條件表達:
表達式1 ? 表達式2 : 表達式3
中表達式2與表達式3的類型相同。當然這樣的要求是不符合ANSI標準的。在ANSI標準中,假如表達式2與表達式3的類型不同,則結果的類型由類型轉換規則決定。當然,我們可以變同一下,先將兩個函數的類型進行強制轉換來達到目的:

qsort((void **) lineptr, 0, nlines-1, numeric ? (int (*)(void *, void *))numcmp : (int (*)(void *, void *))strcmp));

對于如何直接說明一個像RtnFunc一樣返回指向函數的指針的函數,我查閱了不少資料,都沒有找到答案,最后是自己硬著頭皮摸索出來的。由此,我也對C的復雜說明有了更深刻的體會,將在以后的技術日記中寫出來。當然在我看來,過多的、不合適的使用這些復雜說明,并不是一種好的編程風格,因為它將使程序變得難以理解,同時也增加了出錯的可能性。
一個比較好的折衷的方法是使用typedef來使程序的含義明朗。下面給出用typedef給寫上面那個程序的例子,其中定義個一個類型PtoFun,用typedef說明PtoFun是指向函數的指針類型,指針所指的函數返回一個字符指針,且沒有參數。

#include
#define MAX 100


typedef char *(*PtoFun)();

main()
{
void *call(PtoFun);
PtoFun RtnFunc();

printf("%s",call(RtnFunc()));
return 0;
}

char *hello()
{
return "Hello World!/n";

}

PtoFun RtnFunc()
{
return hello;
}

void *call(PtoFun func)
{
return (*func)();
}

改寫后的程序的可讀性大為增加,給人一目了然的感覺。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产色综合久久不卡98口| 欧美性极品少妇精品网站| 国产成人久久精品| 成人激情免费在线| 国产精品手机播放| 日韩视频在线免费观看| 亚洲激情视频网站| 欧美性猛交xxxx富婆| 97精品国产97久久久久久| 在线播放精品一区二区三区| 亚洲欧美一区二区三区四区| 日韩视频第一页| 国产69精品久久久久久| 欧美中文字幕在线观看| 国产精品福利在线观看| 亚洲在线观看视频网站| 美日韩在线视频| 日韩高清av一区二区三区| 精品视频中文字幕| 欧美激情一区二区久久久| 亚洲国产成人91精品| 高清亚洲成在人网站天堂| 亚洲男人天堂网| 97国产精品视频人人做人人爱| 国产精品久久久久不卡| 亚洲理论片在线观看| 色小说视频一区| 神马国产精品影院av| 久久影院中文字幕| 国产精品自产拍在线观| 欧美亚洲在线观看| 欧日韩在线观看| 国产精品久久二区| 中文字幕日韩欧美在线视频| 福利精品视频在线| 色综合久久天天综线观看| 少妇久久久久久| 高清欧美一区二区三区| 亚洲成人动漫在线播放| 欧美激情中文字幕乱码免费| 亚洲激情第一页| 91夜夜未满十八勿入爽爽影院| 久久精视频免费在线久久完整在线看| 黄色精品在线看| 91产国在线观看动作片喷水| 国产一区二区视频在线观看| 91精品国产成人www| 超碰精品一区二区三区乱码| 亚洲国产精品va| 国产精品久久久久久久久影视| 国产69精品久久久久9| 日韩欧美视频一区二区三区| 久久久久国产一区二区三区| 欧美丝袜美女中出在线| 日韩a**站在线观看| 亚洲国产精品悠悠久久琪琪| 91亚洲精品一区二区| 亚洲日本aⅴ片在线观看香蕉| 91免费在线视频| 欧美成人在线免费| 国产精品男人爽免费视频1| 韩国精品美女www爽爽爽视频| 日韩av在线天堂网| 久久视频国产精品免费视频在线| 成人网在线免费看| 亚洲欧美日韩一区二区在线| 91精品成人久久| 久久免费视频在线观看| 91久热免费在线视频| 亚洲综合中文字幕68页| 日韩欧美a级成人黄色| 日韩欧美在线视频观看| 日韩欧美国产骚| 日本一区二区三区在线播放| 欧美激情手机在线视频| 国产精品草莓在线免费观看| 国产精品久久久久久婷婷天堂| 亚洲丝袜在线视频| 国产成人高清激情视频在线观看| 欧美专区福利在线| 欧洲精品在线视频| 成人久久一区二区三区| 精品国产欧美成人夜夜嗨| 久久精品电影网站| 欧美国产日韩一区二区在线观看| 欧美激情视频一区| 色综合老司机第九色激情| 国色天香2019中文字幕在线观看| 亚洲午夜久久久久久久| 国产亚洲欧美视频| 97视频在线看| 性色av一区二区咪爱| 色偷偷亚洲男人天堂| 亚洲成人av片在线观看| 在线免费观看羞羞视频一区二区| 97在线视频精品| 亚洲精品电影网在线观看| 青青草精品毛片| 国产精品69久久| 一区二区成人精品| 日韩视频中文字幕| 91黑丝在线观看| 91精品国产自产在线| 成人高h视频在线| 日韩高清电影好看的电视剧电影| 久久精品青青大伊人av| 国产视频精品免费播放| 日韩av一区二区在线| 欧美日韩在线视频一区| 亚洲视频免费一区| 精品国产一区二区三区久久狼5月| 热久久免费视频精品| 91在线色戒在线| 久久亚洲综合国产精品99麻豆精品福利| 992tv在线成人免费观看| 97在线视频观看| 在线成人激情黄色| 精品久久香蕉国产线看观看亚洲| 久热在线中文字幕色999舞| 97碰碰碰免费色视频| 国产欧美精品va在线观看| 成人国产精品av| 欧美成人精品不卡视频在线观看| 97在线看免费观看视频在线观看| 欧美成人精品激情在线观看| 国产精品成人一区二区三区吃奶| 日韩欧美在线国产| 国产精品欧美久久久| 日韩美女av在线| 久久久久久av| 色中色综合影院手机版在线观看| 色阁综合伊人av| 亚洲乱码国产乱码精品精| 亚洲精品久久久久久久久久久| 不卡毛片在线看| 91免费在线视频网站| 91精品久久久久久久久青青| 久久91精品国产91久久久| 欧美富婆性猛交| 91精品在线观| 欧美精品制服第一页| 精品成人av一区| 国产精品视频不卡| 久久久久久69| 日韩中文字幕精品| 日韩大陆欧美高清视频区| 色阁综合伊人av| 国产91久久婷婷一区二区| 欧美激情视频在线观看| 欧美性xxxx极品hd欧美风情| 国产97人人超碰caoprom| 欧美性理论片在线观看片免费| 91色在线观看| 国产精品视频精品| 国产精品第一区| 91精品久久久久久久久久另类| 亚洲三级免费看| 国产日韩中文在线| 美女av一区二区| 久久久久女教师免费一区| 国产午夜精品免费一区二区三区| 国产精品久久久久福利| 欧美中在线观看| 亚洲精品mp4|