日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

函数指针的两种调用方式

發布時間:2025/3/20 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数指针的两种调用方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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

總結

以上是生活随笔為你收集整理的函数指针的两种调用方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。