本文主要從x86彙編一級來檢視函式呼叫和函式指標呼叫函式的差別。
具體看如下的兩個函式:
void show()
void showdata(int a)
下面是兩者彙編**對比:
18: show();
00411aae e8 3d f6 ff ff call show (4110f0h)
19:
20: void (*ptrshow)() = show;
00411ab3 c7 45 f8 f0 10 41 00 mov dword ptr [ptrshow],offset show (4110f0h)
21: ptrshow();
00411aba 8b f4 mov esi,esp
00411abc ff 55 f8 call dword ptr [ptrshow]
00411abf 3b f4 cmp esi,esp
00411ac1 e8 84 f6 ff ff call @ilt+325(__rtc_checkesp) (41114ah)
22:
23: showdata(3);
00411ac6 6a 03 push 3
00411ac8 e8 0e f7 ff ff call showdata (4111dbh)
00411acd 83 c4 04 add esp,4
25: void (*ptrshowdata)(int a) = showdata;
00411ad0 c7 45 ec db 11 41 00 mov dword ptr [ptrshowdata],offset showdata (4111dbh)
26: ptrshowdata(3);
00411ad7 8b f4 mov esi,esp
00411ad9 6a 03 push 3
00411adb ff 55 ec call dword ptr [ptrshowdata]
00411ade 83 c4 04 add esp,4
00411ae1 3b f4 cmp esi,esp
00411ae3 e8 62 f6 ff ff call @ilt+325(__rtc_checkesp) (41114ah)
對比發現,採用函式指標的呼叫,採用間接呼叫的過程,即函式的位址首先存到乙個變數中,再通過這個變數實現對函式的呼叫。 通過函式指標呼叫函式
指標可以不但可以指向乙個整形,浮點型,字元型,字串型的變數,也可以指向相應的陣列,而且還可以指向乙個函式。乙個函式在編譯的時候會被分配給乙個入口位址。這個函式入口位址稱為函式的指標。可以用乙個指標變數指向函式,然後通過該指標變數呼叫此函式。定義指向函式的指標變數的方法是 int p int int ...
通過函式指標呼叫函式
指標可以不但可以指向乙個整形,浮點型,字元型,字串型的變數,也可以指向相應的陣列,而且還可以指向乙個函式。乙個函式在編譯的時候會被分配給乙個入口位址。這個函式入口位址稱為函式的指標。可以用乙個指標變數指向函式,然後通過該指標變數呼叫此函式。定義指向函式的指標變數的方法是 int p int int ...
使用指標呼叫函式
指向函式的指標的定義形式 資料型別 指標變數名 函式引數表列 double x,y,z scanf lf lf x,y z max x,y printf max num is lf z 以上是主函式中的內容,表示輸入x,y兩個雙精度浮點數,然後呼叫max函式求出,試執行結果如下 請輸入要比較大小的兩...