深度剖析 函式指標

2021-09-07 04:54:11 字數 3562 閱讀 1263

宣告:下面**所有在windows7  vs2010環境下編譯通過。並執行無誤。

是指向函式的指標變數,在c編譯時。每個函式都有乙個入口位址。那麼這個指向這個函式的函式指標便指向這個位址。

函式指標的用途是非常大的,主要有兩個作用:用作呼叫函式和做函式的引數。

資料型別標誌符指標變數名(形參列表);

一般函式的宣告為:

intfunc ( int x);

而乙個函式指標的宣告方法為:

int (*func) (intx);

前面的那個(*func)中括號是必要的,這會告訴編譯器我們宣告的是函式指標而不是宣告乙個具有返回型為指標的函式,後面的形參要視這個函式指標所指向的函式形參而定。

然而這樣宣告我們有時認為很繁瑣。於是typedef能夠派上用場了。我們也能夠這樣宣告:

typedefint (*pf)(int x);

pf pf;

這樣pf便是乙個函式指標,方便了很多。當要使用函式指標來呼叫函式時。func(x)或者  (*fucn)(x) 就能夠了,當然。函式指標也能夠指向被過載的函式,編譯器會為我們區分這些過載的函式從而使函式指標指向正確的函式。

(*pf)(x);

pf(x);

int fun (inti)

int _tmain(intargc, _tchar* argv)

;//函式指標陣列;

pfarr[0](7);//函式指標陣列呼叫;

(*pfarr[1])(8);

int (*parr[5])(int);//函式指標陣列的定義

parr[0] = fun;

fun(9);

return 0;

}

全域性函式指標使用方法簡單凝視已經做了說明就不多說了。

是指向成員函式的指標變數,在c編譯時。每個成員函式都有乙個入口位址,那麼這個指向這個函式的函式指標便指向這個位址。相比較於指向函式的指標。在宣告、定義時多了函式的作用域。在呼叫時須要有個一類物件的實體或者指標進行呼叫。

好了廢話不多說了,切入主題。

資料型別標誌符函式作用域::指標變數名(形參列表);

而乙個函式指標的宣告方法為:

int (classname::*func) (int x);

跟全域性函式指標類似。

然而這樣宣告我們有時認為很繁瑣,於是

typedef

能夠派上用場了,我們也能夠這樣宣告:

typedefint (classname::*pf)(int x);

pf pf;

也跟全域性指標類似。

也能夠宣告類成員變數的指標:

int(classname::*pi) = classname::m_i;這個不是重點就不做具體介紹了。

(object.*pf)(x);

(objectpoint->*pf)(x);

怎樣宣告、呼叫指向成員函式的指標

classfuncptr

假設函式指標定義在類內部,作為乙個成員變數又該怎樣呼叫呢?請看我以下的樣例。

classfuncptr

void show(inti) };

int _tmain(intargc, _tchar* argv)

(funcp.*(funcp.pf))(9);//

借用類實體才幹實現;

想要直接用物件的成員變數呼叫函式指標就是如此的麻煩,所以推薦大家在類中定義乙個專門用來呼叫函式指標的函式來呼叫函式指標。

voidcallfuncptr (inti)

假設在b 類中定義了 a 類的成員函式指標,又該怎樣做呢?

class funcptr

void show(inti) };

class other

other(inti)

else

} void callfunptr(inti,funcptr&funcp) //在這裡須要外部傳入乙個物件實習抑或是乙個指標都能夠。這一點非常重要。 };

int _tmain(intargc, _tchar* argv)

假設類出現了繼承和派生又要怎樣處理呢?c++中的繼承本身就是乙個十分複雜的東西。各個不同的編譯器為我們做了不同的內部處理總是讓程式猿摸不著頭腦。明知山有虎偏向虎山行,那我們就來試試看出現了簡單的單繼承繼承又該怎麼辦呢?

case 4.1

簡單繼承不做擴充套件和改寫

classderive:publicfuncptr

;int _tmain(intargc, _tchar* argv)

derive der; //

在這裡不過用派生類物件替換了父類物件,顯然是滿足 「is-a」這樣的關係;

這裡用派生類和基類沒有不論什麼差別;

case 4.2

派生類覆蓋、改寫基類中的函式

classfuncptr

void show(inti) };

class derive:publicfuncptr

void show (inti)

other(inti)

else

}voidcallfunptr(inti,funcptr&funcp) //在這裡須要外部傳入乙個物件實習抑或是乙個指標都能夠,這一點非常重要。 };

int _tmain(intargc, _tchar* argv)

若在外部定義函式指標,在定義之初就已經確定了指向函式的作用域。與借用的物件實體沒有關係; 

class other

other(inti)

else

}voidcallfunptr(inti,derive* funcp) //在這裡須要外部傳入乙個物件實習抑或是乙個指標都能夠。這一點非常重要。 };

int _tmain(intargc, _tchar* argv)

以上的分析已經非常深入了,假設讀者能閱讀到這裡,那麼相信也已經對函式指標有了充分的了解。

綜上所訴:

總的來說就一句話

,函式指標就是函式入口位址

, 以下再依據不同種類指標分別總結.

全域性的函式指標儲存了函式的入口位址。這個是毋庸置疑的。

成員函式的函式指標

1.        

非虛函式

即該函式的入口位址;

2.        

虛函式即該物件的虛函式列表中對應虛函式的位址值,有可能派生類已經改寫過了這個虛函式。亦可理解為記錄了虛函式在虛函式列表中的廉價量,而不是記錄虛函式的位址值。

如有說明不對的地方肯請指正。

指標的深度剖析

在c語言中,指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元。指標變數和指標 將乙個變數的位址稱為變數的指標,存...

深度剖析指標和陣列

什麼是指標?什麼是陣列?在電腦科學中,指標是程式語言中的乙個物件,利用位址,它的值直接指向存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為指標。意思是通過它能找到以他為位址的記憶體單元。而陣列是乙個有限空間,他與指標是兩碼事,有時候...

C語言指標深度剖析

1.下標法,用a i 來訪問陣列元素 2.指標法,ptr i 形式間接訪問 3.陣列名,用 a i 形式訪問陣列 4.指標下標法,ptr i 形式訪問陣列元素 1.直接訪問法 printf d a i j 2.指標訪問法 int ptr ptr a 0 for i 0 i 3 i for j 0j ...