寫了乙個測試函式測試了一下:
#include
void abc()
void kkk()
void (*fun)();
int main()
結果如下:
abcabc
abcabc
++++++
abcabc
++++++
dddbefore kkk
dddbefore abc
abc401018, 401018, 401018, 401018, 401018
404000, 401000, 401000
對printf("%x, %x, %x, %x, %x/n", kkk, &kkk, *kkk, **kkk, ***kkk); 進行反彙編,結果如下:
printf("%x, %x, %x, %x, %x/n", kkk, &kkk, *kkk, **kkk, ***kkk);
4010df: 83 ec 08 sub $0x8,%esp
4010e2: 68 18 10 40 00 push $0x401018
4010e7: 68 18 10 40 00 push $0x401018
4010ec: 68 18 10 40 00 push $0x401018
4010f1: 68 18 10 40 00 push $0x401018
4010f6: 68 18 10 40 00 push $0x401018
4010fb: 68 2d 30 40 00 push $0x40302d
401100: e8 2b 04 00 00 call 401530 <_printf>
401105: 83 c4 20 add $0x20,%esp
以上的問題可以歸結如下的問題:
int foo();
int (*pfoo)();
pfoo = foo;
pfoo = &foo;
請注意對pfoo賦值的兩種形式,它們是等價的。因為對c編譯器而言,函式名本身就代表函式的入口位址,所以第一種形式對c編譯器是正確的。但問題是在c的語法層講,對指標賦值而不取位址是講不過去的,因些第二種形式也應該被允許。
這時問題出就來了:foo這個函式名倒底是什麼?foo == &foo
其結果就是,編譯器在處理函式名時,從邏輯上將其做為「指向自己的指標」。由此foo, &foo, *foo, **foo的值就都是一樣的了。
至於為什麼不允許&&foo,不光是對函式名不允許,在c裡你就不可能見到這種語法形式,道理很簡單:對變數取址得到變數的位址,對位址取址得到什麼?這在概念上是講不過去的。
有關於指標函式的問題
哎呀,我剛剛寫了一大堆,點了提交之後什麼都沒了,簡單寫寫吧,暈死 typedef int fp int int fun int n void testfp int n,fp fun fp fp fun int main 這段 是看別人的,就是第一句我沒看懂,於是就有了我的實驗 includevoid...
關於C 中函式指標的使用
一 簡單的函式指標的應用。形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 第一行定義了乙個指標變數pfun。首先我們根據前面提到的 形式1 認識到它是乙個指向某種函式的指標,這種函式引數是乙個int型,返回值是char型別。只有第一...
關於C 成員函式指標的使用
在做專案的時候,遇到了在類中根據不同的呼叫函式,在被呼叫函式的某處需要做不同的處理,本來就想著直接在類中設個標記變數判斷下就好了,不過覺得這樣 可能看起來會有些凌亂,而且效率估計有些低,於是想起來使用函式指標。去網上查了查函式指標的使用,可能由於都沒提成員函式指標到底為什麼特殊及如何使用,只給了些例...