typedef 和函式指標問題深入總結

2021-06-19 19:25:54 字數 2271 閱讀 4384

一、函式指標

乙個函式在編譯時被分配乙個入口位址,將這個入口位址稱為函式的指標,可以用乙個指標變數指向該函式指標,然後通過該變數來呼叫函式。

有關說明:

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。首先我們根據前面...