指向函數的指針(的數組)實例總結
指向函數的指針(的數組)實例總結
前言
C語言、C++、ObjectC中都有類似指向函數的指針(的數組)的概念,用起來還是很不錯的。運用得當能起到事半功倍的效果。
百度百科中“指向函數的指針”的定義
函數指針是指向函數的指針變量。 因而“函數指針”本身首先應是指針變量,只不過該指針變量指向函數。這正如用指針變量可指向整型變量、字符型、數組一樣,這里是指向函數。如前所述,C在編譯時,每一個函數都有一個入口地址,該入口地址就是函數指針所指向的地址。有了指向函數的指針變量后,可用該指針變量調用函數,就如同用指針變量可引用其他類型變量一樣,在這些概念上是大體一致的。函數指針有兩個用途:調用函數和做函數的參數。
</div>指向函數的指針
根據前面看到在百科中對 指向函數的指針 的解釋,我們能夠知道這其實就是一個指針的概念,只不過這個指針并不是指向一個數據類型,而是指向一個函數的。
這里可以借鑒指向基本數據類型的只針對概念對此理解。 指向int類型的指針變量可以這樣聲明
int a;
int *p;
對上面聲明的p指針可以這樣初始化
*p = &a;
使用p指針的方法:
*p = 10;
上述代碼就通過p指向的地址把變量a設置為10。
通過上面對指針int類型的指針的回顧,下面開始 指向函數的指針 。
設想有如下函數:
int process(const char *s, int value);
只是一個例子而已,不用管實現神馬功能。 如果不用指向函數的指針,直接調用應該是下面這樣子
int result = process("jileniao.net", 100);
如果換做指向函數的指針方法,則會看到如下的代碼。
int(*p_func)(const char *s, int value);
p_func = process;
實際調用時,將會是:
int result = (*p_func)("jileniao.net", 100);
記住 指向函數的指針 在使用時,原函數名就是在內存中所占的地址(相當于取地址符&)。
指向函數的指針的數組
本概念,結尾詞落在數組上,說明無論前面是神馬東西,最終這必然是一個數組,而數組中的每個元素就是上面所說的 指向函數的指針 。
知道了這個本質,用起來也就沒有太大的問題了。
請看實例:
int process1(const char *s, int value);
int process2(const char *s, int value);
int process3(const char *s, int value);
int process4(const char *s, int value);
int process5(const char *s, int value);
int process6(const char *s, int value);
int process7(const char *s, int value);
int process8(const char *s, int value);
int process9(const char *s, int value);
如上,有若干同樣參數,同樣返回值的一系列函數,想要在某種情況下依次調用,不通過 指向函數的指針的數組 ,可以順序寫一遍就OK了。但若想做的更優雅一些, 指向函數的指針的數組 就可以派上用場了。
int (*p_funcions[9])(const char *s, int value);
上面就已經聲明了一個數組長度為9的 指向函數的指針的數組 ,繼續往下看是對其初始化。
p_funcions[0] = process1;
p_funcions[1] = process2;
p_funcions[2] = process3;
p_funcions[3] = process4;
p_funcions[4] = process5;
p_funcions[5] = process6;
p_funcions[6] = process7;
p_funcions[7] = process8;
p_funcions[8] = process9;
想要使用這個數組,則可以這樣。
int results[9];
for (int i = 0; i < 9; ++i) {
results[i] = (*p_funcions[i])("jileniao.net", 100);
}
文末,歡迎留言提出意見。謝謝!
</div> </code></code></code></code></code></code></code></code></code></code></code>