指標型函式:函式型別 *函式名(形參定義表)
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...