關於c 函式指標的問題

2021-04-15 09:44:41 字數 1526 閱讀 6726

寫了乙個測試函式測試了一下: 

#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 成員函式指標的使用

在做專案的時候,遇到了在類中根據不同的呼叫函式,在被呼叫函式的某處需要做不同的處理,本來就想著直接在類中設個標記變數判斷下就好了,不過覺得這樣 可能看起來會有些凌亂,而且效率估計有些低,於是想起來使用函式指標。去網上查了查函式指標的使用,可能由於都沒提成員函式指標到底為什麼特殊及如何使用,只給了些例...