深入理解函式指標

2021-08-29 03:58:51 字數 3604 閱讀 3530

指標型函式:函式型別   *函式名(形參定義表)

int   *fun(int x, int y)
函式指標:函式型別  (*函式指標名)(形參表)

int   (*fun) (int x, int y)
函式指標陣列:函式型別  (*函式指標名[陣列元素個數])(形參表)

int   (*fun [10]) (int x, int y)
上面是定義了乙個指標陣列,陣列元素為函式指標

下面有幾個問題可以更好的理解

問1:宣告乙個指向含有10個元素的陣列的指標,其中每個元素是乙個函式指標,該函式的返回值是int,引數是int*

第一步:定義返回值是int,引數是int*的函式指標pf為int (*pf) (int *)

第二步:含有10個元素的陣列的指標p為int (*p)[10]

最後:合成為

int (*(*p)[10]) (int *)
問2:定義乙個函式指標,指向的函式有兩個int形參並返回乙個函式指標,返回的指標指向乙個int形參且返回int的函式

第一步:定義指向的函式有兩個int形參並且返回為type型別的函式指標,為type (*pf) (int, int)

第二步:返回值為int *,引數為int的函式,為int *f(int)

最後:合成為

int (*(*f)(int, int)) (int)
問3:定義乙個函式指標,指向的函式的返回值為乙個函式指標陣列(陣列元素為返回值為int,引數為int *的函式指標),引數為int *

第1步:返回值的元素為       int (*s)(int)

第2步:指標陣列為              int (*p)[10]

合併為:                              int (* (*p)[10] )(int) 

第3步:指標函式的引數型別為 int (*f)(int)

最後合成:

int (*  (*  (p)(int*)  )[10]  )  (int *);
問4:下面的定義是啥意思

void (*func(void (*p)(void *), void *x)) (void *);
相信讀者應該了解了我就不解釋了

函式指標的一般用法是:

void (* fun)(void);  //定義函式指標

fun = (void (*)(void)) 0x12345678 //將位址強制轉換為函式型別位址

(*fun)(); //執行位址上的函式

例項**:

#include void fun1(void *x)

void fun2(void *y)

void (*func(void (*p)(void *), void *x)) (void *)

int main()

執行結果:

21.25

關於typedef的函式指標

在實際專案中,一般用typedef來產生新型別,那就和上面的情況有些不同。可能你了解了上面的內容,但是還是不能很好的完成下面的文題。

這裡有幾個問題:下面的語句是什麼意思?如何宣告或定義才使它們更易懂?

int (*foo())();

int (*(*foo)())();

int (*foo());

int (*foo)();

(*(void(*)())0)();

void (*signal(int,void(*)(int)))(int);

問題1:int (*foo())();

眨眼一看,你可能以為是乙個函式變數,其實它是乙個函式宣告,等價於:

typedef int (*pf)();

pf foo();

pf foo();這段**,如果沒有上面的提示,可能以為是定義乙個變數,但其實是宣告。

問題2:int (*(*foo)())();

這個就是定義了乙個指標,等價於:

typedef int (*pa)();

int (*(*p)())();

//給指標賦值

pa fun()

p = fun;

p(); //執行fun

問題3:int (*foo());

也是乙個函式宣告,等價於:

typedef int (*pa);

pa foo();

問題4:int (*foo)();

宣告乙個陣列,等價於:

typedef int (*pf)();

pf foo;

問題5:(*(void(*)())0)();

這是乙個函式呼叫,等價於:

typedef void (*pf)();

pf pf = 0;

(*pf)();

問題6:void (*signal(int,void(*)(int)))(int);

也是乙個函式宣告,等價於:

typedef void (*pf)(int);

pf signal(int, pf);

注意:

陣列元素不能是函式變數,只能是函式指標變數

返回值不能是函式變數,只能是函式指標變數

int ( a[10]) (int);   //錯:陣列元素不能是函式變數

int (*a[10]) (int);

int ( (*p)[10]) (int);//錯:陣列元素不能是函式變數

int (*(*p)[10]) (int);

int ( (*p)(int))(int);//錯:返回值不能是函式變數

int (*(*p)(int))(int);

總結:

沒有函式變數,只有函式宣告,函式指標和函式定義。

萬變不離其宗,函式指標只要搞清楚,返回值問題,函式宣告問題,函式指標陣列問題,再複雜的問題都是由這幾個問題引伸出來的。

深入理解指標函式

1.指標函式的定義 顧名思義,指標函式即返回指標的函式。其一般定義形式如下 型別名 函式名 函式引數表列 其中,字尾運算子括號 表示這是乙個函式,其字首運算子星號 表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個 指向返回值為 的指標 位址 型別名 表...

深入理解指標函式

顧名思義,指標函式 即返回指標的函式。其一般定義形式如下 型別名 函式名 函式引數表列 其中,字尾運算子括號 表示這是乙個函式,其字首運算子星號 表示此函式為指標型函式,其函式值為指標,即它帶回來的值的型別為指標,當呼叫這個函式後,將得到乙個 指向返回值為 的指標 位址 型別名 表示函式返回的指標指...

深入理解C C 函式指標

函式指標陣列的妙用 筆者在開發某軟體過程中遇到這樣乙個問題,前級模組傳給我二進位制資料,輸入引數為 char buffer和 int length,buffer是資料的首位址,length表示這批資料的長度。資料的特點是 長度不定,型別不定,由第乙個位元組 buffer 0 標識該資料的型別,共有2...