指標運算 算術運算 關係運算

2021-07-03 13:55:52 字數 3849 閱讀 1135

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

指標加上乙個整數的結果是另乙個指標。問題是,它指向**?如果你將乙個字元指標加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.關係運算

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

誤區一、輸出答案為y 和o

誤解:ptr 是乙個char 的二級指標,當執行ptr++;時,會使指標加乙個sizeof(char),所以輸出如上結果,這個可能只是少部分人的結果.

誤區二、輸出答案為y 和a

誤解:ptr 指向的是乙個char *型別,當執行ptr++;時,會使指標加乙個sizeof(char *)(有可能會有人認為這個值為1,那就會得到誤區一的答案,這個值應該是4,參考前面內容), 即&p+4; 那進行一次取值運算不就指向陣列中的第五個元素了嗎?那輸出的結果不就是陣列中第五個元素了嗎?答案是否定的.

正解:ptr 的型別是char **,

指向的型別是乙個char *型別

,該指向的位址就是p的位址(&p),當執行ptr++;時,

會使指標加乙個sizeof(char*),即&p+4;

那*(&p+4)指向哪呢,這個你去問上帝吧,或者他會告訴你在哪?所以最後的輸出會是乙個隨機的值,或許是乙個非法操作.

總結一下:

乙個指標ptrold 加(減)乙個整數n 後,結果是乙個新的指標ptrnew

ptrnew 的型別和ptrold 的型別相同,ptrnew 所指向的型別和ptrold所指向的型別也相同。ptrnew 的值將比ptrold 的值增加(減少)了n 乘sizeof(ptrold 所指向的型別)個位元組。

就是說,ptrnew 所指向的記憶體區將比ptrold 所指向的記憶體區向高(低)位址方向移動了n 乘sizeof(ptrold 所指向的型別)個位元組。

指標和指標進行加減:

兩個指標不能進行加法運算

這是非法操作

,因為進行加法後,得到的結果指向乙個不知所向的地方,而且毫無意義。

兩個指標可以進行減法操作,但必須型別相同

,一般用在陣列方面,不多說了

[cpp]view plain

copy

#include

intmain()    

誤區一、輸出答案為y 和o

誤解:ptr 是乙個char 的二級指標,當執行ptr++;時,會使指標加乙個sizeof(char),所以輸出如上結果,這個可能只是少部分人的結果.

誤區二、輸出答案為y 和a

誤解:ptr 指向的是乙個char *型別,當執行ptr++;時,會使指標加乙個sizeof(char *)(有可能會有人認為這個值為1,那就會得到誤區一的答案,這個值應該是4,參考前面內容), 即&p+4; 那進行一次取值運算不就指向陣列中的第五個元素了嗎?那輸出的結果不就是陣列中第五個元素了嗎?答案是否定的.

正解: ptr 的型別是char **,指向的型別是乙個char *型別,該指向的位址就是p的位址(&p),當執行ptr++;時,會使指標加乙個sizeof(char*),即&p+4;那*(&p+4)指向哪呢,這個你去問上帝吧,或者他會告訴你在哪?所以最後的輸出會是乙個隨機的值,或許是乙個非法操作.

總結一下:

乙個指標ptrold 加(減)乙個整數n 後,結果是乙個新的指標ptrnew,ptrnew 的型別和ptrold 的型別相同,ptrnew 所指向的型別和ptrold所指向的型別也相同。ptrnew 的值將比ptrold 的值增加(減少)了n 乘sizeof(ptrold 所指向的型別)個位元組。就是說,ptrnew 所指向的記憶體區將比ptrold 所指向的記憶體區向高(低)位址方向移動了n 乘sizeof(ptrold 所指向的型別)個位元組。

指標和指標進行加減:

兩個指標不能進行加法運算,這是非法操作,因為進行加法後,得到的結果指向乙個不知所向的地方,而且毫無意義。兩個指標可以進行減法操作,但必須型別相同,一般用在陣列方面,不多說了

指標++」和「指標--」表示指標所指位址的

。指標的

算術運算一般都是在運算元組的時候進行

,因為只有宣告陣列才可以得到連續的記憶體空間。如果我們對乙個單獨的變數位址進行加或減的算術運算,然後改變新位址的值,則可能會破壞該位址的資料,所以在對指標進行算術運算時要明確運算的結果是程式中分配可用的位址。

指標的關係運算說的是相同型別的指標之間的關係運算。不同型別的指標之間的關係運算沒有任何意義,指標和非0整數的關係運算也沒有任何意義,但是指標可以和0進行關係運算,兩個相同型別的指標相等,表示這兩個指標指向同乙個位址。

指標運算 算術運算 關係運算

是不是對指標的任何運算都是合法的呢?答案是它可以執行某些運算,但並非所有的運算都合法。除了加法運算之外,你還可以對指標執行一些其他運算,但並不是很多。指標加上乙個整數的結果是另乙個指標。問題是,它指向 如果你將乙個字元指標加1,運算結果產生的指標指向記憶體中的下乙個字元。float佔據的記憶體空間不...

指標運算 算術運算 關係運算

c c 允許將指標和整數進行相加操作,加1的結果就是等於原來的位址值加上指向物件占用的位元組數 如 int p int malloc sizeof int 5 p 1 表示p指向記憶體位址加4個位元組 兩個指標如果指向同乙個陣列,則兩個指標進行算術運算才有意義,即 int p int malloc ...

6 畫素運算 算術運算和邏輯運算

倆張進行算術運算的前提是倆張的大小是一樣的。引數說明 src1,src2 需要相加的兩副大小和通道數相等的影象或一副影象和乙個標量 標量即單一的數值 dst 可選引數,輸出結果儲存的變數,預設值為none,如果為非none,輸出影象儲存到dst對應實參中,其大小和通道數與輸入影象相同,影象的深度 即...