函式指標和指標函式用法和區別

2021-09-30 21:52:07 字數 2325 閱讀 2144

前言

函式指標和指標函式,在學習 c 語言的時候遇到這兩個東西簡直頭疼,當然還有更頭疼的,比如什麼函式指標函式、指標函式指標、陣列指標、指標陣列、函式指標陣列等等,描述越長其定義就越複雜,當然理解起來就越難,特別是剛開始學習這門語言的童鞋,估計碰到這些東西就已經要崩潰了,然後好不容易死記硬背下來應付考試或者面試,然後過了幾天發現,又是根本不會用,也不知道該在哪些地方用,這就尷尬了。

今天這裡只講兩個相對簡單的,其實上面說那些太複雜的東西也真的很少用,即便是用了理解起來很麻煩,所以莫不如先深刻理解這兩個比較容易的,並且專案中比較常用到。

正文先來看看兩者的定義以及說明。

指標函式

定義指標函式,簡單的來說,就是乙個返回指標的函式,其本質是乙個函式,而該函式的返回值是乙個指標。

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

這似乎並不難理解,再進一步描述一下。

看看下面這個函式宣告:

int fun(int x,int y);

這種函式應該都很熟悉,其實就是乙個函式,然後返回值是乙個 int 型別,是乙個數值。

接著看下面這個函式宣告:

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);

這個寫法看個人習慣,其實如果*靠近返回值型別的話可能更容易理解其定義。

示例(由於本人習慣於 qt 中進行開發,所以這裡為了方便,示例是在 qt 工程中寫的,其語法是一樣的,只是輸出方式不同)

來看乙個非常簡單的示例:

typedef struct _datadata;

//指標函式

data* f(int a,int b)

return a.exec();

}輸出如下:

f(4,5) =  4 5

注意:在呼叫指標函式時,需要乙個同型別的指標來接收其函式的返回值。

不過也可以將其返回值定義為 void*型別,在呼叫的時候強制轉換返回值為自己想要的型別,如下:

//指標函式

void* f(int a,int b)

呼叫:data * mydata = static_cast(f(4,5));

其輸出結果是一樣的,不過不建議這麼使用,因為強制轉換可能會帶來風險。

函式指標

定義函式指標,其本質是乙個指標變數,該指標指向這個函式。總結來說,函式指標就是指向函式的指標。

宣告格式:型別說明符 (*函式名) (引數)

如下:fun = &function;

fun = function;

取位址運算子&不是必需的,因為乙個函式識別符號就表示了它的位址,如果是函式呼叫,還必須包含乙個圓括號括起來的參數列。

呼叫函式指標的方式也有兩種:

x = (*fun)();

x = fun();

兩種方式均可,其中第二種看上去和普通的函式呼叫沒啥區別,如果可以的話,建議使用第一種,因為可以清楚的指明這是通過指標的方式來呼叫函式。當然,也要看個人習慣,如果理解其定義,隨便怎麼用都行啦。

示例int add(int x,int y)

int sub(int x,int y)

//函式指標

int (*fun)(int x,int y);

return a.exec();

}輸出如下:

(*fun)(1,2) =  3

(*fun)(5,2) =  2 2

上面說到的幾種賦值和呼叫方式我都分別使用了,其輸出結果是一樣的。

二者區別

通過以上的介紹,應該都能清楚的理解其二者的定義。那麼簡單的總結下二者的區別:

###定義不同

指標函式本質是乙個函式,其返回值為指標。

函式指標本質是乙個指標,其指向乙個函式。

寫法不同

指標函式:int* fun(int x,int y);

函式指標:int (*fun)(int x,int y);

可以簡單粗暴的理解為,指標函式的*是屬於資料型別的,而函式指標的星號是屬於函式名的。

再簡單一點,可以這樣辨別兩者:函式名帶括號的就是函式指標,否則就是指標函式。

用法不同

上面已經寫了詳細示例,這裡就不在囉嗦了。

總而言之,這兩個東西很容易搞混淆,一定要深入理解其兩者定義和區別,避免犯錯。

函式指標和指標函式用法和區別

指標函式,簡單的來說,就是乙個返回指標的函式,其本質是乙個函式,而該函式的返回值是乙個指標。宣告格式為 型別識別符號 函式名 參數列 這似乎並不難理解,再進一步描述一下。看看下面這個函式宣告 int fun int x,int y 這種函式應該都很熟悉,其實就是乙個函式,然後返回值是乙個 int 型...

函式指標和指標函式用法和區別

前言 函式指標和指標函式,在學習 c 語言的時候遇到這兩個東西簡直頭疼,當然還有更頭疼的,比如什麼函式指標函式 指標函式指標 陣列指標 指標陣列 函式指標陣列等等,描述越長其定義就越複雜,當然理解起來就越難,特別是剛開始學習這門語言的童鞋,估計碰到這些東西就已經要崩潰了,然後好不容易死記硬背下來應付...

C 指標函式和函式指標的用法和區別

定義 指標函式,簡單的來說,就是乙個返回指標的函式,其本質是乙個函式,而該函式的返回值是乙個指標。宣告格式為 型別識別符號 函式名 參數列 int fun int x,int y 乙個普通函式,然後返回值是乙個 int 型別,是乙個數值。int fun int x,int y 在函式名前面多了乙個 ...