1. 程式人生 > >指標運算——算術運算、關係運算

指標運算——算術運算、關係運算

    是不是對指標的任何運算都是合法的呢?答案是它可以執行某些運算,但並非所有的運算都合法。除了加法運算之外,你還可以對指標執行一些其他運算,但並不是很多。

    指標加上一個整數的結果是另一個指標。問題是,它指向哪裡?如果你將一個字元指標加1,運算結果產生的指標指向記憶體中的下一個字元。float佔據的記憶體空間不止1個位元組,如果你將一個指向float的指標加1,將會發生什麼?它會不會指向該float值內部的某個位元組呢?

   答案是否定的。當一個指標和一個整數量進行算術運算時,整數在執行加法運算前始終會根據合適的大小進行調整。這個“合適的大小”就是指標所指向型別的大小,“調整”就是把整數值和“合適的大小”相乘。為了更好的說明,試想在某臺機器上,float佔據4個位元組。在計算float型指標加3的表示式時候,這個3將根據float型別的大小(此例中為4)進行調整(相乘),這樣實際上加到指標上的整型值為12。

     把3與指標相加使指標的值增加3個float的大小,而不是3個位元組。這個行為較之獲得一個指向一個float值內部某個位置的指標更為合理。下表包含了一些加法運算的例子。調整的美感在於指標演算法並不依賴於指標的型別。換句話說,如果p是個指向float的指標,那麼p+1就指向下一個float,其他型別也是如此。

 1.算術運算

    C的指標的算術運算只侷限於兩種形式。第一種形式是:    指標+-整數  標準定義這種形式只能用於指向陣列中某個元素的指標,如圖所示:

並且這類表示式的結果型別也是指標。這種形式也適用於使用malloc函式動態分配獲得的記憶體。

對一個指標加1使它指向陣列中的下一個元素,加5使它向右移動5個元素的位置,依次類推。把一個指標減去3使它向左移動3個元素的位置。

第二種型別的指標運算具有如下的形式:   指標—指標

只有當兩個指標都指向同一個陣列中的元素時,才允許從一個指標減去另一個指標,如下所示:

兩個指標相減的結果的型別是ptrdiff_t,它是一種有符合整數型別。減法運算的值是兩個指標在記憶體中的距離(以陣列元素的長度為單位,而不是以位元組為單位),因為減法運算的結果將除以陣列元素型別的長度。

如果兩個指標所指向的不是同一個陣列中的元素,那麼它們之間相減的結果是未定義的。程式設計師無從知道兩個陣列在記憶體中的相對位置,如果不知道這一點,兩個指標之間的距離就毫無意義。

2.關係運算:   <   <=   >   >=  不過前提是它們都指向同一個陣列中的元素。根據你所使用的操作符,比較表示式將告訴你哪個指標指向陣列中更前或更後的元素。標準並未定義如果兩個任意的指標進行比較會產生什麼結果。

2011-11-26   10:19:13