參考這位大佬的文章,加上自己的理解
定義
指標函式,就是乙個返回值是指標的函式,其本質是乙個函式,而該函式的返回值是乙個指標。
宣告格式為:型別識別符號* 函式名(參數列)
例如:
int *fun(int x,int y);
它的返回值是乙個int型別的指標;指標函式也沒什麼特別的,和普通函式對比不過就是其返回了乙個指標(即位址值)而已。
指標函式的寫法
int *fun(int x,int y);
int * fun(int x,int y);
int* fun(int x,int y);
這個*號可以寫在型別識別符號和函式名之間的任意位置(從可讀性來講,建議寫在int附近)
typedef struct _datadata;
//指標函式
data* f(int a,int b)
int main(int argc, char *ar**)
輸出如下
f(4,5) = 4 5
注意:在呼叫指標函式時,需要乙個同型別的指標來接收其函式的返回值。
定義
函式指標,函式指標是指向函式的指標。本質上是乙個指標,只不過這個指標指向乙個函式,這個指標的位址是這個函式
宣告格式:型別說明符 (*函式名) (引數)
int (*fun)(int x,int y);
必須加括號
函式賦值
fun = &function;
fun = function;
irqtable[i].irqhandler = &default_irqhandler;
irqtable[i].irqhandler = default_irqhandler;
取位址運算子&不是必需的,因為乙個函式識別符號就表示了它的位址
函式呼叫
如果是函式呼叫,還必須包含乙個圓括號括起來的參數列
fun();
(*fun)();
irqtable[intnum].irqhandler(intnum, irqtable[intnum].userparam);
irqtable[intnum].(*irqhandler)(intnum, irqtable[intnum].userparam);
兩種方式均可,其中第1種看上去和普通的函式呼叫沒啥區別,如果可以的話,建議使用第2種,因為可以清楚的指明這是通過指標的方式來呼叫函式。當然,也要看個人習慣,如果理解其定義,隨便怎麼用都行啦。
int add(int x,int y)
int sub(int x,int y)
//函式指標
int (*fun)(int x,int y);
int main(int argc, char *ar**)
輸出如下
(*fun)(1,2) = 3
(*fun)(5,2) = 2 2
上面說到的幾種賦值和呼叫方式都分別使用了,其輸出結果是一樣的。
通過以上的介紹,應該都能清楚的理解其二者的定義。那麼簡單的總結下二者的區別:
指標函式本質是乙個函式,其返回值為指標。
函式指標本質是乙個指標,其指向乙個函式。
指標函式:int* fun(int x,int y);
函式指標:int (*fun)(int x,int y);
可以簡單粗暴的理解為,指標函式的*是屬於資料型別的,而函式指標的星號是屬於函式名的。
再簡單一點,可以這樣辨別兩者:函式名帶括號的就是函式指標,否則就是指標函式。
總而言之,這兩個東西很容易搞混淆,一定要深入理解其兩者定義和區別,避免犯錯。
C 基礎 指標,函式指標
變數指標,函式指標 include using namespace std 做函式宣告,函式的實現可以在呼叫的後面,但是宣告必須在呼叫的前面 int add int,int int mutiple int,int int dooperate int a,int b,int opimp int,int...
C語言 指標函式和函式指標
指標函式和函式指標 指標函式其實是乙個簡稱,是指帶指標的函式,它本質上是乙個函式,只是返回的是某種型別的指標。其定義的格式為 型別識別符號 函式名 參數列 函式指標,從本質上說是乙個指標,只是它指向的不是一般的變數,而是乙個函式。因為每個函式都有乙個入口位址,函式指標指向的就是函式的入口位址。其定義...
C語言 指標函式和函式指標
1 指標函式是指帶指標的函式,本質上是乙個函式,函式返回值是某一型別的指標 定義 型別識別符號 函式名 參數列 int f int x,int y 它首先是乙個函式,只不過這個函式的返回值是乙個位址值,函式返回值必須用同型別的指標變數來接受,也就是說,指標函式一定有函式返回值,而且,在主調函式中,函...