C語言基礎 函式指標 指標函式

2021-10-06 10:24:07 字數 2115 閱讀 8934

參考這位大佬的文章,加上自己的理解

定義

指標函式,就是乙個返回值是指標的函式,其本質是乙個函式,而該函式的返回值是乙個指標。

宣告格式為:型別識別符號* 函式名(參數列)

例如:

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 它首先是乙個函式,只不過這個函式的返回值是乙個位址值,函式返回值必須用同型別的指標變數來接受,也就是說,指標函式一定有函式返回值,而且,在主調函式中,函...