《C與指標》 高階指標話題

2022-01-24 13:39:03 字數 2641 閱讀 8617

指標真是讓人又愛又恨。。。。。

首先還是先來看一下c語言中的高階指標宣告。不要被表面迷惑最重要。

/*

** 《c和指標》——高階指標話題

*/int i; //

定義乙個整型變數

int *pi; //

指向整型變數的指標

int **ppi; //

指向乙個指標,而那個指標又指向乙個整型變數

/*高階宣告

*/int fun(); //

普通函式宣告,返回乙個整數

int *fun(); //

首先他是乙個函式,但是他想返回乙個指向整型的指標

int (*fun)(); //

這就是乙個指標了,他指向乙個返回整型的函式,這個fun叫做「函式指標」,指向函式的指標

int *(*fun)(); //

這個和上面那個差不多嘛,函式指標嘍,只是這個函式返回乙個指向整型的指標。

int f; //

這是乙個整型陣列啊

int *f; //

這也是乙個陣列,因為下標的優先順序高,只不過這個陣列裡面都是指向整型的指標啊

int f(); //

非法操作

int f(); //

非法操作

int (*f)(); //

首先他是乙個陣列,陣列裡面全是指標,這些指標指向返回值為整型的函式。

int *(*f)(); //

和上面一樣,只不過這個函式返回整型指標。

函式指標:主要用途是實現「**函式」和「轉移表」

(1)、**函式:把乙個函式指標作為引數傳遞給其他的函式。

在《c與指標》中,作者指出:任何時候,如果你所編寫的函式必須能夠在不同的時刻執行不同型別的工作,或者執行只能由函式呼叫者定義的工作,都可以使用**函式。許多視窗系統使用**函式連線過個動作,如拖拽滑鼠和點選按鈕來指定程式中的某個特定的函式。

比如我們我們平時寫的查詢函式,每乙個查詢函式只能查詢某一型別的資料,int型、char型,但是有沒有一種函式能查詢所有型別的資料呢?這時就需要函式指標來編寫乙個**函式了。

首先呼叫者需要編寫乙個函式,用來比較兩個值,然後把乙個指向這個函式的指標作為引數傳遞給查詢函式,然後查詢函式呼叫你編寫的那個函式來進行查詢。

其實這個樣子就像是,查詢函式像是乙個分揀機,你編寫的比較函式可以比喻成分揀機上的感測器,給他乙個能識別黑色的感測器,那麼分揀機就會只把黑色的東西分揀出來,給他乙個識別紅色的感測器,就把紅色的東西給分揀出來。

下面這個例子是《c和指標》裡面,作者給出的鍊錶中查詢的例子:

/*

** 在乙個單鏈表中查詢乙個指定值

*/node *search_list(node *node_,void

const *value,int (*compare)(void

const *,void

const *))

return

node_;}/*

** 使用者可以自定義自己的比較函式

** 比較整型就強制轉換為整型

*/int compare(void

const *a,void

const *b)

呼叫方式:

/*

** **函式的呼叫方式

** 因為函式名本身就是位址,所以並不需要取位址,不過也可以。

*/discard_node = search_list(root,&desired_value,compare_ints) ;

這位博主也說了一下**函式的乙個作用——開發者可以將自己實現的函式細節進行封裝,然後將標頭檔案提供給使用者。

(2)、轉移表:就是函式指標陣列,他把具體操作和和選擇操作的**分離,是程式結構更加突出。

比如我們有時可能需要在switch語句中呼叫函式,當情況很多的時候,這個switch語句將會很長,如果表示操作符的**是從0開始的連續整數,這時我們就可以使用轉移表來代替switch語句來實現不同情況的函式選擇。

還是直接來看例子:

/*

** 利用轉移表實現多個函式的選擇

*/double add(double,double

); double sub(double,double

); double mul(double,double

); double div(double,double

);//

.........

double (*oper_fun)(double,double) =

轉移表的呼叫方式:

result = oper_fun[fun_num](num1,num2);

特別注意:使用轉移表要特別注意下標的越界檢查,保證下標位於合法的範圍。

當然,上面提到的**函式與轉移表都只是很簡單的應用,目的在於理解最基本的操作與原理。

高階指標話題

來淺顯地 一下稍微複雜的指標.首先要有乙個不可動搖地認識,再厲害的指標也是指標,它存的內容永遠是位址.定義了指標的型別,該指標就只能與這種型別搭配使用.從二級指標開始說 int i int p i int pp p pp是乙個二級指標,指向指標的指標,存的內容是p的位址,型別是 指向整型的指標的指標...

C的指標疑惑 C和指標13 高階指標話題 上

int f f為乙個函式,返回值型別是乙個指向整形的指標。int f 兩對括號,第二對括號是函式呼叫操作符,但第一對括號只起到聚組的作用。f為乙個函式指標,它所指向的函式返回乙個整型值。int f f是乙個函式指標,指向的函式返回值是乙個整形指標。int f 下標的優先順序更高,所以f是乙個陣列,元...

C 高階指標話題之高階宣告的演進

在使用更高階的指標型別之前,我們必須觀察它們是如何宣告的。下面通過觀察一系列越來越複雜的宣告來 這個話題 int f 乙個整型變數 int f 乙個指向整型的指標這兩個例子十分簡單,我們來看下第2個宣告是如何工作的,這對後面理解更複雜的宣告非常重要。它把表示式 f 宣告為乙個整數。根據這個事實,你肯...