函式名與函式指標

2021-09-16 20:38:44 字數 1733 閱讀 4639

對函式名和函式指標存在一些疑惑,如下:

通過乙個簡單的測試程式,並對其進行反彙編,對其分析,對上述問題有了清晰的認識.

先貼上測試**和反彙編**,以供分析.

typedef void (*pfunc)(void);

void func()

int main(void)

​/*main() 函式的反彙編**段*/

pfunc p;

p = func;

1041e: f240 33f9 movw r3, #1017 ; 0x3f9 //向暫存器的低16bit寫入

10422: f2c0 0301 movt r3, #1 //向暫存器的高16bit寫入,0x103f9即函式的入口位址.

10426: 607b str r3, [r7, #4] //將函式的入口位址,寫入到儲存器位址 (r7, #4)中.從c語言的角度理解,即申請函式指標變數,並將func的值寫入到此函式指標變數中.

從此段彙編**分析可得,func函式名即標識func()函式的入口位址,是乙個位址常量0x103f9.

func();  函式呼叫,直接將func識別符號(0x103f8)作為立即數,bl跳轉.至於0x103f9和0x103f8的區別在這裡暫時不是討論的重點,應該和處理器架構相關.

10428: f7ff ffe6 bl 103f8 p(); //2.從[r7, #4]中讀取函式的入口位址到r3暫存器,並bl跳轉.

1042c: 687b ldr r3, [r7, #4]

1042e: 4798 blx r3

(*p)(); //3.與p()做了完全相同的操作,也就是說在編譯的彙編階段,將p()和(*p)()翻譯為相同的語句.

10430: 687b ldr r3, [r7, #4]

10432: 4798 blx r3

從函式呼叫的**分析可知:

printf("func:%p, p:%p, *p: %p\n", func, p, *p);

10434: 687b ldr r3, [r7, #4] //*p的值即為[r7, #4]儲存器位址中的值

10436: 687a ldr r2, [r7, #4] //和*p取值完全相同,即為[r7, #4]儲存器位址中的值

10438: f240 31f9 movw r1, #1017 ; 0x3f9 //而func為位址常量,0x103f9.

void func()

103fa: b082 sub sp, #8

103fc: af00 add r7, sp, #0

int a = 1;

103fe: 2301 movs r3, #1

10400: 607b str r3, [r7, #4]

printf("%d\n", a);

10402: 6879 ldr r1, [r7, #4]

10404: f240 40a4 movw r0, #1188 ; 0x4a4

10408: f2c0 0001 movt r0, #1

1040c: f7ff ef6c blx 102e8 }

函式指標與函式名

迷惑很久的問題了,今天正好又遇到這個問題,就抽了個時間研究總結了一下把它記錄下來。和同學討論乙個typedef的問題,實驗過程中偶然發現vs2005的行為 int fun wrong syntax constraint error f g wrong declares that g returns ...

函式指標與函式名

首先函式指標的定義,如果指向無參函式,定義的時候後面一定要加 否則編輯器無法分辨這是指向函式的指標 void f 指向void 的指標 void f 指向void void 函式的指標 int f 指向int void 函式的指標 寫這個主要是因為今天突然想到,函式名,函式指標,到底都是啥?先看 i...

關於函式名與函式指標

示例 如下 include int asdf int a int main 問題,為什麼asdf 5 p 5 p 5 三種呼叫都正確且都能輸出正確結果?解答 首先需要明確的一點 函式名不是指標,陣列名也不是指標。函式名只是在程式設計時候代指函式入口位址的符號,函式入口位址在載入到記憶體後就是固定的,...