C 函式指標2

2022-08-26 12:12:09 字數 1398 閱讀 2603

對於以下三個函式

const double *f1(const double ar,int n)

const double *f2(const double ,int n)

const double *f3(const double* ,int n)

第乙個引數雖然是三種形式, 但是表達的都是一種意思, 因此

可以使用乙個函式指標的陣列來同時儲存這三個函式的指標

和之前的方法一樣, 將函式原型的函式名, 改為 (*pf) , 注意指標陣列方括號的位置,

如果位置不對, 沒有加括號, 就會導致意義有偏差.  因為 運算子 的優先局 大於 * 

const double *(*pf[3] )(const double* ,int n) =

注意:雖然左邊的陣列看起來很複雜, 但是不能夠使用auto 關鍵字讓編譯器自行推斷型別, 

因為auto 只能用於單值初始化, 不能用於列表初始化.

但是當pf 確定之後, 就可以使用auto 關鍵字了:

auto pa = pf

當有了陣列之後, 陣列中的每個元素都指向乙個函式 , 所以可以按以下方式呼叫:

pa[0](3.14,3)  或者  *(pa[1])(3.14,3) 

因為要函式原型返回的是 double *型別的資料, 所以, 想取得返回值, 可以在外面再加乙個 * 號 解引用

double x= *pa[0] ( 3.14, 3)

可以做的另一件事是, 建立乙個指向陣列的指標,  即指標的指標, 雙重指標, 這個雙重指標的位址為, 含有三個函式指標的陣列 的位址;

雖然聽起來很複雜, 但是因為滿足單值初始化的條件, 所以可以用auto 關鍵字自行推斷

auto pc = &pa;

則此時, 從雙重指標中呼叫函式的**就變為

(*pc)[0](3.14,3)

如果把 auto 拆開來看, 他的原型應該如下:

const double *(*(*pd)[3]) (const double *, int ) = &pa;

很複雜, 有三個*號, 乙個乙個來看

最左邊的*號, 意思是宣告指標的原型是double * 型別, 所以最左邊的 * 和double 解釋在了一起. 意為函式返回值是double * 型別

左邊第三個*號, 意思是 宣告了乙個長度為3 的陣列, 陣列的內容存放的是函式的指標.

左邊第二個*號, 意思是乙個指標, 指向了乙個陣列.

再次強調 &pa 和pa 的不同

假設pa 是乙個陣列名

&pa 代表著整個陣列的起始位址

pa 代表第乙個元素的位址

雖然值一樣 但是pa +1 和&pa +1 卻有很大區別

另乙個區別體現在

要得到第乙個元素的值, 

**&pa== *pa = pa[0]

C 指標函式和函式指標

1 指標函式 1 基本概念 指標函式 顧名思義就是帶有指標的函式,即其本質是乙個函式,只不過這種函式返回的是乙個對應型別的位址。2 定義式 type func type type 如 int max int x,int y 3 例子詳解 cpp view plain copy 1.include 2...

c 指標函式和函式指標

函式指標與指標函式 1 函式指標 形式 返回型別 函式名 參數列 一種特殊的指標,它指向函式的入口 定義乙個函式指標p,只能指向返回值為int,形參為兩個int的函式 輸出結果 include stdafx.h include using namespace std int p int,int in...

C 函式指標與指標函式

函式指標 函式名本身代表著函式的位址,因此給函數指標賦值使可以不用加 符號 加也可以!void func int 定義乙個函式 void pf int 定義乙個函式指標 pf func 給函式指標賦值 int f x,y 其中x,y是形式引數,f是函式名,呼叫後返回乙個指向整型資料的位址指標。f x...