從結合性看指標

2022-08-28 02:54:13 字數 1990 閱讀 2855

【問題描述】

看下列4組概念:

(1)(2)

(3)(4)

這4組概念怎樣區分呢?下面從結合性的角度出發,來分析考慮。

【分析】

(1)第一組概念,很多朋友都已經弄清楚了。

從結合性看上述概念,*(間接訪問)操作符優先於+(加法)操作符。故*dates+2等價於(*dates)+2。也就是先對指標dates解引用,取出dates的內容。再對dates的內容+2。

而對於*(dates+2),()操作符優先於*和+操作符。故先計算dates+2,即將指標指向dates的第3個記憶體位址。再對該位址解引用,取出記憶體的內容。

(2)

第2組概念,常見與字串陣列中。*str++一般用於將字串陣列指向下乙個記憶體單元,再取出str內容。

從結合性考慮,++操作符的結合性優先於*。有意思的是,++(自增)和*(解引用)操作符的結合性是自右向左的。

*str++等價於*(str++)。也就是先將str進行自增操作,再取出(str++)的內容。

(*str)++,由於()操作符優先於++操作符,故先對str解引用,即取出str的內容,再對str的內容進行自增操作。

*++str和*str++唯一的區別是,自增後,解引用的物件。*++str,解引用的物件是(++str),而*str++解引用的物件是(str++)

*(++str)和*++str是等價的。

關於自增操作符,詳見

(3)

第3組概念,如果靠死記硬背的方式理解,很容易就忘記了。

其實從結合性考慮,就很簡單了。注意:*的結合性是自右向左的。

這組概念,本身結合性沒有什麼難點。先看const int * pt,根據結合性,*解引用的物件是pt,說明pt不是const型別,那麼const的物件是什麼呢?其實,const修飾的是int *pt。即解引用後的物件。說明解引用後的物件不可變。

對於int * const pt,*解引用的物件是const pt。即指標pt是const的,說明指標pt不可變。而解引用後的物件使用int修飾的,並沒有宣告為const,說明解引用後的物件的內容是可變的。

(4)剛學指標時,這組概念感覺很暈乎。下面從結合性來看看。

int * func (int a, int b),func是乙個指標函式。()的優先順序高於*操作符。故func先與(int a, int b)相結合。很明顯,func(int a, int b)是乙個函式。func前面加了乙個*,難道是對func解引用嗎?顯然不是,其實int *是乙個整體,作為函式func(int a, int b)的返回值。

int (* func )(int a, int b),func是乙個函式指標。* func外面加了乙個()故func 與*先結合。說明func是乙個指標。將(* func)視為乙個整體,那麼(* func)將與(int a, int b)相結合。說明(* func)是乙個函式,該函式的返回值為int型別。那麼(* func)又是什麼呢?這個大家都明白,就是對指標func解引用,取出func的內容。從全域性來看,其實就是定義了乙個func指標,該指標解引用(* func)後,指向的內容是乙個返回值為int的函式。

【增·2012-1-6】

再看乙個例項:

書本中告訴我們,這其實只定義了乙個指標(f是指標,而g不是)。這是為什麼呢?

從結合性出發,就很好理解。「,」操作符的優先順序最低,而*操作符的結合性是自右向左的。故*先與f結合,f是指標。而g並未與*操作符結合,故g不是指標。

定義兩個指標,正確的做法是:

最後,有一點值得注意的是,?:這個唯一的三目操作符結合性是自右向左的,使用時,請注意結合性。

【增·2012-2-12】舉個例子吧,如下所示,最大值和最小值通常被定義為:

如果x,y的值是普通常量,不會出現什麼問題,試想如果x,y是表示式,會怎樣呢?

根據結合性,x,y從右向左進行計算。x,y可能被計算兩次,這樣就可能得不到正確的結果。看看linux中的處理方案:

linux-2.6.23/include/linux/kernel.h

這樣x,y就只計算了一次,避免了可能的錯誤。

C語言從記憶體上看指標

從下圖知道指標也是有位址的 在來看指標與變數的的記憶體塊 紅線是指標的位址 藍線是指標指向變數的位址ps 我把變數賦了初值 從上圖可以看出指標的位址裡面的值為 00 fe 6f 00 h x86的指標大小是4 因為大小端問題要從高位址向下 所以指標的值應該是 00 6f fe 00 h 而指標位址裡...

指標中的運算子的結合性

先回憶一下運算子的優先順序吧 c 語言與其他高階語言相比,乙個顯著的特點就是其運算子特別豐富,共有34 種運算子。c 語言將這34 種運算子規定了不同的優先級別和結合性。優先順序是用來標識運算子在表示式中的運算順序的,在求解表示式的值的時候,總是先按運算子的優先次序由高到低進行操作,可是,當乙個運算...

c語言的左結合性與右結合性

右結合性,就是在表示式中最右邊的操作最先執行,然後從右到左依次執行 左結合性的操作符 如位操作符 和 則是從左至右依次執行 在標準c語言的文件裡,對操作符的結合性並沒有做出非常清楚的解釋。乙個滿分的回答是 它是仲裁者,在幾個操作符具有相同的優先順序時決定先執行哪乙個。每個操作符擁有某一級別的優先順序...