一、函式指標
乙個函式在編譯時被分配乙個入口位址,將這個入口位址稱為函式的指標,可以用乙個指標變數指向該函式指標,然後通過該變數來呼叫函式。
有關說明:
1、函式指標的宣告格式:
函式返回值型別(*指標變數名)(引數型別列表)
或者是:typedef 函式返回值型別 (*指標變數名)(引數型別列表)
2、乙個函式指標只能指向一種型別的函式,即具有相同的返回值和相同的引數的函式.
3.關於函式指標的加減運算沒有意義
二、函式指標陣列定義:
void(*fun[3])(void*);
等同於typedef void(*pfun)(void*);
pfun fun[3];
三、typedef可以用於定義函式指標型別:
【語法】
typedef 《返回型別》 (*《函式型別名》)(參數列)
typedef 《返回型別》 (《類名》::*《函式型別名》)(參數列)
【用途】
1、可以用來定義該函式型別的函式指標,就不用每次使用函式指標都要寫一次函式原型了;
2、有了型別名,就可以使用在容器裡面,譬如map
typedef int (*pf) (const char *, const char *);
pf register(pf pf);
等同於int (*register (int (*pf)(const char *, const char *))) (const char *, const char *);
為複雜的宣告定義乙個新的簡單的別名。方法是:在原來的宣告裡逐步用別名替換一部分複雜宣告,如此迴圈,把帶變數名的部分留到最後替換,得到的就是原宣告的最簡化版。
舉例:
1. 原宣告:int *(*a[5])(int, char*);
變數名為a,直接用乙個新別名pfun替換a就可以了:
typedef int *(*pfun)(int, char*);
原宣告的最簡化版:
pfun a[5];
2. 原宣告:void (*b[10]) (void (*)());
變數名為b,先替換右邊部分括號裡的,pfunparam為別名一:
typedef void (*pfunparam)();
再替換左邊的變數b,pfunx為別名二:
typedef void (*pfunx)(pfunparam);
原宣告的最簡化版:
pfunx b[10];
3. 原宣告:doube(*)() (*e)[9];
變數名為e,先替換左邊部分,pfuny為別名一:
typedef double(*pfuny)();
再替換右邊的變數e,pfunparamy為別名二
typedef pfuny (*pfunparamy)[9];
原宣告的最簡化版:
pfunparamy e;
理解複雜宣告可用的「右左法則」:
從變數名看起,先往右,再往左,碰到乙個圓括號就調轉閱讀的方向;括號內分析完就跳出括號,還是按先右後左的順序,如此迴圈,直到整個宣告分析完。舉例:
int (*func)(int *p);
首先找到變數名func,外面有一對圓括號,而且左邊是乙個*號,這說明func是乙個指標;然後跳出這個圓括號,先看右邊,又遇到圓括號,這說明 (*func)是乙個函式,所以func是乙個指向這類函
數的指標,即函式指標,這類函式具有int*型別的形參,返回值型別是int。
int (*func[5])(int *);
func 右邊是乙個運算子,說明func是具有5個元素的陣列;func的左邊有乙個*,說明func的元素是指標(注意這裡的*不是修飾func,而是修飾 func[5]的,原因是運算子優先順序比*高,func先跟
結合)。跳出這個括號,看右邊,又遇到圓括號,說明func陣列的元素是函式型別的指標,它指向的函式具有int*型別的形參,返回值型別為int。
也可以記住2個模式:
type (*)(....)函式指標
type (*)陣列指標
另外,函式的返回值是 函式指標的要注意,例如:
int (*register
(int (*pf)(const char *, const char *)))
(const char *, const char *);藍色的部分是引數,後面紅色的才是返回值的「引數列表」
int (*ff(int))
(int *,int);
C 函式指標和typedef
void signal int signum,void handler int int 等價於下面兩行 typedef void sighandler t int sighandler t signal int signum,sighandler t handler 1 signal int sig...
typedef 函式指標
關於c 中函式指標的使用 包含對typedef用法的討論 一 簡單的函式指標的應用。形式1 返回型別 函式名 參數列 char pfun int char glfun int a void main 第一行定義了乙個指標變數pfun。首先我們根據前面提到的 形式1 認識到它是乙個指向某種函式的指標,...
typedef 函式指標
形式1 返回型別 函式名 參數列 cpp view plain copy print?char pfun int char glfun int a void main char pfun int char glfun int a void main 第一行定義了乙個指標變數pfun。首先我們根據前面...