函数和指针
聲明指向函數(shù)的指針:
void ToUpper (char *); // 把字符串轉(zhuǎn)換為大寫 void (*pf) (char *); // 指向函數(shù)的指針第一對圓括號將運(yùn)算符*和pf結(jié)合在一起,這意味著pf是一個指向函數(shù)的指針。這就使得(*pf)是一個函數(shù),并使(char *)作為該函數(shù)的參量列表,void作為返回類型。創(chuàng)建這類聲明最簡單的方法是注意它用表達(dá)式(*Pf)代替函數(shù)名ToUpper。
根據(jù)運(yùn)算符優(yōu)先級的規(guī)則,第一個括號是必須的,省略括號會導(dǎo)致完全不同的解釋:
void *pf (char *); // pf是返回一個指針的函數(shù)?
有了函數(shù)指針后,可以把適當(dāng)類型的函數(shù)的地址賦給它。在這種場合中,函數(shù)名可以用來表示函數(shù)的地址:
void ToUpper (char *); void ToLower (char *); int round (double); void (*Pf) (char *); pf = ToUpper; // 合法,ToUpper是函數(shù)ToUpper( )的地址 pf = ToLower; // 合法,ToLower是函數(shù)ToLower( )的地址 // pf = round; // 非法,round是錯誤類型的函數(shù) // pf = ToLower(); // 非法,ToLower()不是地址?
使用函數(shù)指針來訪問函數(shù)。有兩種邏輯上不一致的語法規(guī)則來實(shí)現(xiàn)這樣的操作:
void ToUpper (char *); void (*pf) (char *); char mis[] = "Nina Metier"; (*pf) (mis); // 語法1 (pf (mis); // 語法2為了保持與現(xiàn)有代碼的兼容性,ANSI C把兩者作為等價的形式全部接受。
?
函數(shù)指針最普遍的用法之一是作為函數(shù)的參數(shù)。例如:
void show (void (* fp) (char *), char * str) {(*fp) (str); // 把所選函數(shù)作用于str }?
函數(shù)指針的數(shù)組
可以聲明并初始化函數(shù)指針的數(shù)組:
typedef void (* V_FP_CHARP) (char *); V_FP_CHARP arpf[4] = {ToUpper, ToLower, Transpose, Dummy};?
注意:存在“函數(shù)指針的數(shù)組”,但不存在“函數(shù)數(shù)組”
?
總結(jié)下使用函數(shù)名的四種方法:
- 定義函數(shù)
- 聲明函數(shù)
- 調(diào)用函數(shù)
- 作為指針
?
轉(zhuǎn)載于:https://www.cnblogs.com/qwertWZ/archive/2013/01/23/2873785.html
總結(jié)
- 上一篇: 0-1背包(及初始化问题)
- 下一篇: 利用jqueryRotare实现抽奖转盘