C 函式指標

2021-09-08 02:28:25 字數 3204 閱讀 1134

函式指標

函式指標就是乙個指向函式起始位址的指標變數。

普通函式指標

c/c++語言中,函式相當於彙編中的引數入棧和呼叫proc,

函式就是將這兩個過程封裝起來。函式名就代表函式的起始位址。

要呼叫這個函式,就要找到對應的起始位址。有了起始位址就可進入帶函式體中執行**。

下面看幾個例子:

typedef void (*ps_func0)(void);         //

指向返回值為void和無參的函式

typedef void (*ps_func1)(int); //

指向返回值為void和引數為int的函式

typedef void (*ps_func2)(int,int); //

指向返回值為void和兩個引數為int的函式

void func1()

int main()

//上面所有能編譯通過嗎? 或者那些地方會報錯?

下,均編譯通過,沒有任何警告和error,執行也正確。

//如果不加強制轉換,從語法的角度來說,是不能夠的,因為型別不同,且都

//是外部型別

//從記憶體和編譯器角度來看,加上前置轉換時沒有任何問題的

//因為函式在本質就是彙編中的過程的封裝,函式名就是這個過程的起始位址

//不同的函式名代就表了不同的位址

//既然都是位址,在本質上就都死相同的,任何指向函式的指標都可以指向任

//何函式 (也可能編譯器相關)

下面看一段c**與彙編**(摘自網路)

c**:

int function(int a, int b)

void main()

彙編**:(cdecall方式)

_function

push ebp

mov ebp, esp

mov eax, [ebp+8] ;引數1

add eax, [ebp+c] ;加上引數2

pop ebp

retn

_main

push ebp

mov ebp, esp

push 14h ;引數 2入棧

push 0ah ;引數 1入棧

call _function ;呼叫函式

add esp, 8 ;修正棧

xor eax, eax

pop ebp

retn

具體的可以體會一下。。。。

根據函式呼叫方式和引數壓入順序目前存在三種約定:

這都相關壓棧順序和棧的清理工作約定

他們的細節都不相同,但有一點是肯定的,引數比須從右向左壓入棧中

stdcall   函式必須自已清理棧

cdecall 由呼叫者清除堆疊 c的預設函式呼叫方式 所以這樣c支援可變引數

fastcall                是把函式引數列表的前三個引數放入暫存器eax,edx,ecx,其他引數壓棧

成員函式指標

1 定義

成員函式指標也是一樣指向函式的指標,但是是作為類成員的方式。

class base

int func1(int a)

};//

定義成員函式指標 (指向類成員函式,而不是類物件成員函式)

typedef int (base::*ps_mfuc0)();

typedef int (base::*ps_mfuc1)(int);

int main()

//可成功鏈結,為何執行是崩潰?如果使用dynamic_cast或者static_cast

//進行轉化,是無法通過的,可見類成員函式指標要求上是更嚴格的

//所以在c++中轉換,盡量使用static_cast或者dynamic_cast進行。

二 繼承

class base

int func1(int a)};"

0;}};

typedef int (base::*ps_mfuc0)();

typedef int (base::*ps_mfuc1)(int);

int main()

但是如果僅能支援基類向派生類轉換,那在實現框架中是非常不利的。

通常編譯器都是支援強制轉換。強制將派生類的成員函式指標轉換為基類的。

各種編譯器對這種轉換的支援和處理方式不一

int main()

這種情況應當是使用的比較多的,平台上隨處可見。

三 虛函式

支援多型

class base

int func1(int a)};"

0;}};

typedef int (base::*ps_mfuc0)();

typedef int (base::*ps_mfuc1)(int);

int main()

int main()

這裡就有疑問了:在物件定義之前定義成員函式指標,但是這個時候物件還是不存在的,

那麼之後定義了物件是如何通過成員函式指標正確找到要執行的函式?

這應當是和編譯器和c++物件模型相關聯的。(比較複雜太深奧不清楚這裡不**了)

參考文章:寫的非常不錯。

C 指標函式和函式指標

1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...

c 指標函式和函式指標

函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...

C 函式指標與指標函式

函式指標 函式名本身代表著函式的位址,因此給函數指標賦值使可以不用加 符號 加也可以!void func int 定義乙個函式 void pf int 定義乙個函式指標 pf func 給函式指標賦值 int f x,y 其中x,y是形式引數,f是函式名,呼叫後返回乙個指向整型資料的位址指標。f x...