在使用更高階的指標型別之前,我們必須觀察它們是如何宣告的。
下面通過觀察一系列越來越複雜的宣告來**這個話題:
int f; //乙個整型變數
int *f; //乙個指向整型的指標
這兩個例子十分簡單,我們來看下第2個宣告是如何工作的,這對後面理解更複雜的宣告非常重要。
它把表示式 *f 宣告為乙個整數。根據這個事實,你肯定能推斷出 f 是個指向整型的指標。
c 宣告的這種解釋方法可以通過下面的宣告得到驗證。
int * f, g;
它並沒有宣告兩個指標。儘管 * 和 f 之間存在空白,但是 * 是作用於 f 的,只有 f 才是乙個指標, g 只是乙個普通的整型變數。
下面是另外乙個例子:
int f();
它把 f 宣告為乙個函式,它的返回值是乙個整數。 舊式風格的宣告就函式的引數並未提供任何資訊。 它只是宣告 f 的返回值型別。現在,我們將使用這種舊式風格,這樣可以使例子看上去簡單一些,後面我們在回到完整的原型形式。
下面是乙個新例子:
int *f();
要想推斷出這個函式原型的含義,你必須確定表示式 *f() 是如何進行求值的。首先執行的是函式呼叫操作符 (),因為它的優先順序高於間接訪問操作符。因此 f 是乙個函式,它的返回值型別是乙個指向整型的指標。
接下來的乙個宣告更有趣,但也更容易讓人疑惑:
int (*f)();
確定括號的含義是分析這個宣告的乙個重要步驟。這個宣告有兩個括號,每對的含義各不相同。第2個括號是函式呼叫操作符,第1個括號只起到聚組的作用。它迫使間接訪問在函式呼叫之前進行,使 f 成為乙個函式指標,它所指向的函式返回乙個整型值。
何為函式指標?
程式中的每個函式都位於記憶體中的某個位置,所以存在指向那個位置的指標是完全可能的。後面有博文專門介紹函式指標。
初識函式指標
int *(*f)();
這個宣告和上乙個宣告基本相同,只是函式的返回值需要經過間接訪問才能得到乙個整型值。
下面我們把陣列也考慮進去。
int f;
我們都知道這個宣告,表示f是乙個整型陣列。陣列的長度暫時省略,因為我們現在只關心它的型別,而不是它的長度。
需要注意的是,如果陣列是作用於函式的引數(作為函式的形參),這個宣告也是合法的。
下面這個宣告呢?
int *f;
下標的優先順序更高,所以f是乙個陣列,它的元素型別是指向整型的指標。
說了這麼多,大家別以為型別的宣告是乙個隨心所欲的事情,下面就給出幾個非法的宣告見識見識!看了上面的兩個例子,簡直毛骨悚然!這種奇葩的宣告簡直讓人費神!不過為了鍛鍊下自己,再看幾個合法的:真可怕!int f();
我們來分析下:首先f是乙個函式,可是之後呢?解釋不通了呀!如果非要解釋,它的返回值是乙個陣列?可是函式只能返回標量啊,不能返回陣列。因此這個宣告無論怎麼說都是非法的。
再給乙個:
現在,它似乎是乙個陣列,它的元素型別是返回值為整型的函式?同上面所說的一樣,這樣也是非法的。int f();
int ( *f )();
強行裝一波:先看第乙個括號內的內容,可知,f是乙個陣列,且要對陣列進行間接訪問操作,可見這個陣列的元素是指標。表示式末尾的()是函式呼叫操作符,那麼陣列元素的型別是函式指標,且指向的函式的返回值是乙個整型值。
最後乙個超級**的宣告:
int *(*f)();
與上面乙個宣告相比,多了乙個間接訪問操作符。
強行解釋一波吧:這個宣告建立了乙個指標陣列,指標所指向的型別是返回值為整型指標的函式。
和上面的宣告的對比,上面宣告的含義其實也是乙個指標陣列,這個指標是乙個函式指標,指標指向的的型別是返回值為整型的函式。
結束結束!受不了了了。。。
高階指標話題
來淺顯地 一下稍微複雜的指標.首先要有乙個不可動搖地認識,再厲害的指標也是指標,它存的內容永遠是位址.定義了指標的型別,該指標就只能與這種型別搭配使用.從二級指標開始說 int i int p i int pp p pp是乙個二級指標,指向指標的指標,存的內容是p的位址,型別是 指向整型的指標的指標...
《C與指標》 高階指標話題
指標真是讓人又愛又恨。首先還是先來看一下c語言中的高階指標宣告。不要被表面迷惑最重要。c和指標 高階指標話題 int i 定義乙個整型變數 int pi 指向整型變數的指標 int ppi 指向乙個指標,而那個指標又指向乙個整型變數 高階宣告 int fun 普通函式宣告,返回乙個整數 int fu...
指標的高階宣告
現在也不記得是在那裡看到這篇總結的,如果你是原創,麻煩跟我說下,希望不會有侵權之說。在使用指標之前,我們必須觀察它是如何宣告的 1,簡單的例子 int f 乙個整形變數 int f 乙個整形指標 2,不簡單的例子 int f 乙個返回整形指標的函式 int f 乙個返回整形的函式指標 3,較複雜的例...