指針函數與函數指針
對于沒有系統的學習過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類型的變量了,我們就可以把函數當做參數傳遞了。
下面附上代碼
輸出結果是: