函数指针的两种调用方式
生活随笔
收集整理的這篇文章主要介紹了
函数指针的两种调用方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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 );
}這兩種形式是等價的,都是為ANSI C所接受的。
歷史上,貝爾實驗室的C和UNIX的開發者采用的是第一種觀點
QUOTE:
(*fp)(9);
而Berkeley的UNIX的擴展者采用第二種觀點
QUOTE:
fp(9);K&R C不允許第二種形式。
但是為了保持與現有代碼的兼容性,ANSI C把這兩者作為等價形式全部接受。正如 kernelxu 所言,按照標準 C 的規定兩種函數調用方式都是正確的。
這是因為在 C/C++ 中總是使用函數指針的形式來調用函數。即使在函數調用中使用的是函數指示符(代表函數類型),
也會被轉換為函數指針使用,這就是默認的 function-to-pointer 轉換。例如,樓主程序中的 test 函數可以直接使用函數指示符形式來調用:test( 9 );。
然而,在這里的函數指示符 test 其實被編譯器自動轉換為了函數指針來使用,即從函數類型轉換為了函數指針類型,
最終是使用函數指針的形式來完成對函數調用的。程序中的 fp( 9 ); 是直接使用函數指針 fp 來調用。既然 fp 已經是函數指針了,所以在類型上就不需要任何轉換了。
(*fp)( 9 ); 也是合法的函數調用。在這里,fp 是函數指針,所以 *fp 是對于函數的引用,是函數類型。
根據標準規定的 function-to-pointer 轉換又把 *fp 由函數類型轉換為了函數指針類型,所以實際上 (*fp)( 9 );
相當于 fp( 9 ); 這種直接的函數指針調用方式。另外,test 函數也可這樣調用:(*test)( 9 );。可以這樣來理解:根據 function-to-pointer 轉換規定
首先 test 由函數類型轉換為函數指針,那么 *test 表示的又是函數類型,
最后又根據 function-to-pointer 轉換為函數指針來調用函數。這其實和 (*fp)( 9 ); 是等價的。
甚至 test 函數還可以這樣調用:(**test)( 9 );、(***test)( 9 );、(****test)( 9 ); 等等,
或者函數指針形式:(**fp)( 9 );、(***fp)( 9 );、(****fp)( 9 ); 等等。對此的理解可參看上段中的分析。
從上面的分析可以看出,函數調用的時候可以使用函數指針的方式,也可以使用函數指示符的方式。
不過,后者會由編譯器自動轉換為前者的形式,即函數指針的形式。和指向對象的指針相比,這是函數指針一個比較特殊的地方。
轉自:https://www.cnblogs.com/dayInAndOut/p/3636152.html
總結
以上是生活随笔為你收集整理的函数指针的两种调用方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 练习C语言二级编程题的一些问题
- 下一篇: M函数