天天看點

指針函數與函數指針

 指針函數與函數指針

對于沒有系統的學習過c++的同學來說,指針仿佛是一個難以逾越的鴻溝,但是其實指針沒那麼複雜,或者可以這麼說,

 我們選擇性的忽略指針,比如說就把指針當做一個執行個體對象

 例如 類person

 有兩種執行個體化方法

 1. person p; //在棧裡配置設定記憶體,作用域内有效,自動釋放

 2. person *p = new person(); //在堆内配置設定記憶體,需要手動調用 delete p; 來釋放

 其實在這裡,完全可以抛棄指針的概念,就認為兩個都是對象,隻是調用成員函數成員變量的方法不同,還有作用域不同就可以了。

 之是以提到這些,就是引出今天要談的一個概念,那就是指針函數和函數指針的概念,這兩個概念,相信很多人都不明白。

 今天我們就簡單探讨一下。

 1.指針函數

 在c語言這種面向過程的語言中,整個程式都是通過函數調用來一步一步實作的,對于函數,相信大家都再熟悉不過了。

 例如:

 void func();

 int func();

 float func();

 char func();

 char* func();

 int * func();

 float *func();

 我們看到前四個函數的傳回類型,是标準的系統類型,void ,int ,float,char。這個毫無疑問,後三個則傳回值都是指針類型,

 c語言函數的傳回類型,可以是指針類型。這就稱之為指針函數,概念很簡單。再簡單地說就是傳回一個位址指針。

 類型:

 類型名 *函數名(函數參數清單);

 2.函數指針

 函數指針是本文介紹的重點,什麼是函數指針,說白了就是一個指向函數的指針。首先它是一個指針,它指向的是一個函數的入口位址,

 函數的入口位址在哪裡呢,函數就是記憶體中的一片區域,函數有一個入口位址,函數指針就是指向的這個入口位址。

 void func(int a);

 void func(int a,char b);

 函數指針的作用是什麼呢,有兩方面,一個是為了調用函數提供另一種途徑,二是可以把函數當做一個變量來傳遞,起到回調的作用。

 個人認為後一點很重要,在實際的編碼中用到很多,可節省不少工作量。

 上述三個函數,我們可以寫成如下形式:

 void (*func1)();

 void (*func2)(int a);

 void (*func3)(int a,char b);

 這樣在調用的時候就可以用如下方法:

 (*func1)();

 (*func2)(1);

 (*func3)(1,'a');

 下面進行下一步操作,我們把它們聲明成一種類型:

 typedef void (*func1)();

 typedef void (*func2)(int a);

 typedef void (*func3)(int a,char b);

 這是就可以定義 func1,func2,func3類型的變量了,我們就可以把函數當做參數傳遞了。

下面附上代碼

輸出結果是:

指針函數與函數指針