【歸納】C語言指針運算之算術、關係運算

轉載:https://www.cnblogs.com/candyming/archive/2011/11/26/2263090.html

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

        指針加上一個整數的結果是另一個指針。問題是,它指向哪裏?如果你將一個字符指針加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.關係運算:   <   <=   >   >=  不過前提是它們都指向同一個數組中的元素。根據你所使用的操作符,比較表達式將告訴你哪個指針指向數組中更前或更後的元素。標準並未定義如果兩個任意的指針進行比較會產生什麼結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章