要明白一個:declaration modifies usage.(宣告模仿使用)具體:int *p應該是:按照運算子的優先順序和*運算子的右結合性,可以看到*是與p結合,那麼*p就是一個int。但是這裡的int *p = &a是個語法糖,其實是分成兩步:第一步定義int *p,接著 p = &a。同理,const int *p 和 int *const p該怎麼理解呢?const int *p分成幾步來:*p(const int型), p就是指向const int的指標了。int *const p:*const p是int型,那麼p就是指向int的const指標了。 初學者會有很多相似的問題,一定要記住C語言的運算子優先順序和結合性,然後按照運算子的優先順序和結合性來看懂變數宣告。再舉個例子:int *a[5] 和 int (*a)[5]究竟是什麼呢?對於陣列,我們這麼來讀:先不管 [ ] 中的數字究竟是多少。int *a[] : 說明 *a[] 是一個int。a[] 就是指向int的指標。a 就是指向int的指標的陣列。加上維數,那麼a 就是5個指向int的指標所形成的陣列。int (*a)[]:說明(*a)[] 是一個int。(*a)是一個int型的五維陣列。那麼a就是指向五維int型的陣列了。我們可以看到:在按照宣告模仿使用的過程中讀宣告方式時,總是先去掉優先順序低的符號(如int *a[] 時候,先去掉*,然後再a[]),符號結合性也未改變,接著在後面的讀法中加定語就是了。再來看個例子(注意看如何加的定語):int *f() 和 int (*f)()。首先確定這是兩個函式宣告。int *f():*f()是一個int;f()是一個指向int的指標;f是返回指向int的指標的函式。int (*f)():(*f)()是一個int;(*f)是一個返回int的函式;f是指向返回int的函式的指標。【注意:( )在 C 程式碼中有兩個優先順序,括號表示函式呼叫時候的優先順序小於括號直接擴表示式的優先順序】還有些更復雜的宣告,你去看《C和指標》這本書,會對你有用的。
要明白一個:declaration modifies usage.(宣告模仿使用)具體:int *p應該是:按照運算子的優先順序和*運算子的右結合性,可以看到*是與p結合,那麼*p就是一個int。但是這裡的int *p = &a是個語法糖,其實是分成兩步:第一步定義int *p,接著 p = &a。同理,const int *p 和 int *const p該怎麼理解呢?const int *p分成幾步來:*p(const int型), p就是指向const int的指標了。int *const p:*const p是int型,那麼p就是指向int的const指標了。 初學者會有很多相似的問題,一定要記住C語言的運算子優先順序和結合性,然後按照運算子的優先順序和結合性來看懂變數宣告。再舉個例子:int *a[5] 和 int (*a)[5]究竟是什麼呢?對於陣列,我們這麼來讀:先不管 [ ] 中的數字究竟是多少。int *a[] : 說明 *a[] 是一個int。a[] 就是指向int的指標。a 就是指向int的指標的陣列。加上維數,那麼a 就是5個指向int的指標所形成的陣列。int (*a)[]:說明(*a)[] 是一個int。(*a)是一個int型的五維陣列。那麼a就是指向五維int型的陣列了。我們可以看到:在按照宣告模仿使用的過程中讀宣告方式時,總是先去掉優先順序低的符號(如int *a[] 時候,先去掉*,然後再a[]),符號結合性也未改變,接著在後面的讀法中加定語就是了。再來看個例子(注意看如何加的定語):int *f() 和 int (*f)()。首先確定這是兩個函式宣告。int *f():*f()是一個int;f()是一個指向int的指標;f是返回指向int的指標的函式。int (*f)():(*f)()是一個int;(*f)是一個返回int的函式;f是指向返回int的函式的指標。【注意:( )在 C 程式碼中有兩個優先順序,括號表示函式呼叫時候的優先順序小於括號直接擴表示式的優先順序】還有些更復雜的宣告,你去看《C和指標》這本書,會對你有用的。