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

2021-07-10 11:46:08 字數 1876 閱讀 9301

c/c++允許將指標和整數進行相加操作,加1的結果就是等於原來的位址值加上指向物件占用的位元組數(如 int*p =(int*)malloc(sizeof(int)*5), p+1 表示p指向記憶體位址加4個位元組)。

兩個指標如果指向同乙個陣列,則兩個指標進行算術運算才有意義,即

int* p =(int*)malloc(sizeof(int)*5);

int* q = p;

q++;

q++;

printf("%d",q-p);   此處q-p等於2, 相當於a[j],a[i]中 j-i

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

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

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

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

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

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

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

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