天天看點

int *與int*

 第一個例子是我們喜聞樂見的C語言的指針變量定義啦:

<code>int</code> <code>a, *b, **c;</code>

  相信很多人都被這種東西坑過,是以很多教科書都告訴我們,當定義一個變量的時候,類型最後的那些星号都要寫在變量前面,避免讓人誤解。是以很多人都會想,為什麼要設計成這樣呢,這明顯就是挖個坑讓人往下跳嘛。但是在實際上,這是一個文法的一緻性好的例子,至于為什麼他是個坑,問題在别的地方。

  我們都知道,當一個變量b是一個指向int的指針的時候,*b的結果就是一個int。定義一個變量int a;也等于在說“定義a是一個int”。那我們來看上面那個變量聲明:int *b;。這究竟是在說什麼呢?其實真正的意思是“定義*b是一個int”。這種“定義和使用相一緻”的方法其實正是我們要推崇的。C語言的函數定義參數用逗号分隔,調用的時候也用逗号分隔,這是好的。

  在C語言的聲明中,先給出一個基本類型,緊随其後的是一個辨別符清單,這些辨別符組成表達式,用于産生基本類型的變量。例如:

<code>int</code> <code>*a;</code>

  這條語句表示表達式*a産生的結果類型是int。知道了*操作符執行的是間接通路操作以後,我們可以推斷a肯定是一個指向int的指針。

  C在本質上是一種自由形式的語言,這很容易誘使你把星号寫在靠近類型的一側,如下所示:

<code>int</code><code>* a;</code>

  這個聲明與前面一個聲明具有相同的意思,而且看上去更為清楚,a被聲明為類型int*的指針。但是,這并不是一個好的技巧,原因如下:

<code>int</code><code>* b, c, d;</code>

  人們很自然地認為這條語句把所有三個變量聲明為指向整型的指針,但事實上并非如此。我們被它的形式愚弄了。星号實際上是表達式*b的一部分,隻對這個辨別符有用。b是一個指針,但其餘兩個變量隻是普通的整型。要聲明三個指針,正确的語句如下:

<code>int</code> <code>*b, *c, *d;</code>

摘自:《C和指針》(3.2.3 聲明指針)

*** walker ***

本文轉自walker snapshot部落格51CTO部落格,原文連結http://blog.51cto.com/walkerqt/1673626如需轉載請自行聯系原作者

RQSLT

繼續閱讀