指標真是讓人又愛又恨。。。。。
首先還是先來看一下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 宣告為乙個整數。根據這個事實,你肯...