函数指针的两种调用方式
生活随笔
收集整理的這篇文章主要介紹了
函数指针的两种调用方式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
void test(int);
int main(void){
void (*fp)(int);fp=test;(*fp)(9); fp(9);return 0;
}
void test(int a)
{printf( "%d\n", a );
}這兩種形式是等價(jià)的,都是為ANSI C所接受的。
歷史上,貝爾實(shí)驗(yàn)室的C和UNIX的開發(fā)者采用的是第一種觀點(diǎn)
QUOTE:
(*fp)(9);
而Berkeley的UNIX的擴(kuò)展者采用第二種觀點(diǎn)
QUOTE:
fp(9);K&R C不允許第二種形式。
但是為了保持與現(xiàn)有代碼的兼容性,ANSI C把這兩者作為等價(jià)形式全部接受。正如 kernelxu 所言,按照標(biāo)準(zhǔn) C 的規(guī)定兩種函數(shù)調(diào)用方式都是正確的。
這是因?yàn)樵?C/C++ 中總是使用函數(shù)指針的形式來調(diào)用函數(shù)。即使在函數(shù)調(diào)用中使用的是函數(shù)指示符(代表函數(shù)類型),
也會(huì)被轉(zhuǎn)換為函數(shù)指針使用,這就是默認(rèn)的 function-to-pointer 轉(zhuǎn)換。例如,樓主程序中的 test 函數(shù)可以直接使用函數(shù)指示符形式來調(diào)用:test( 9 );。
然而,在這里的函數(shù)指示符 test 其實(shí)被編譯器自動(dòng)轉(zhuǎn)換為了函數(shù)指針來使用,即從函數(shù)類型轉(zhuǎn)換為了函數(shù)指針類型,
最終是使用函數(shù)指針的形式來完成對(duì)函數(shù)調(diào)用的。程序中的 fp( 9 ); 是直接使用函數(shù)指針 fp 來調(diào)用。既然 fp 已經(jīng)是函數(shù)指針了,所以在類型上就不需要任何轉(zhuǎn)換了。
(*fp)( 9 ); 也是合法的函數(shù)調(diào)用。在這里,fp 是函數(shù)指針,所以 *fp 是對(duì)于函數(shù)的引用,是函數(shù)類型。
根據(jù)標(biāo)準(zhǔn)規(guī)定的 function-to-pointer 轉(zhuǎn)換又把 *fp 由函數(shù)類型轉(zhuǎn)換為了函數(shù)指針類型,所以實(shí)際上 (*fp)( 9 );
相當(dāng)于 fp( 9 ); 這種直接的函數(shù)指針調(diào)用方式。另外,test 函數(shù)也可這樣調(diào)用:(*test)( 9 );??梢赃@樣來理解:根據(jù) function-to-pointer 轉(zhuǎn)換規(guī)定
首先 test 由函數(shù)類型轉(zhuǎn)換為函數(shù)指針,那么 *test 表示的又是函數(shù)類型,
最后又根據(jù) function-to-pointer 轉(zhuǎn)換為函數(shù)指針來調(diào)用函數(shù)。這其實(shí)和 (*fp)( 9 ); 是等價(jià)的。
甚至 test 函數(shù)還可以這樣調(diào)用:(**test)( 9 );、(***test)( 9 );、(****test)( 9 ); 等等,
或者函數(shù)指針形式:(**fp)( 9 );、(***fp)( 9 );、(****fp)( 9 ); 等等。對(duì)此的理解可參看上段中的分析。
從上面的分析可以看出,函數(shù)調(diào)用的時(shí)候可以使用函數(shù)指針的方式,也可以使用函數(shù)指示符的方式。
不過,后者會(huì)由編譯器自動(dòng)轉(zhuǎn)換為前者的形式,即函數(shù)指針的形式。和指向?qū)ο蟮闹羔樝啾?#xff0c;這是函數(shù)指針一個(gè)比較特殊的地方。
轉(zhuǎn)自:https://www.cnblogs.com/dayInAndOut/p/3636152.html
總結(jié)
以上是生活随笔為你收集整理的函数指针的两种调用方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 练习C语言二级编程题的一些问题
- 下一篇: M函数