兩個指標之間的運算

2021-08-21 16:31:14 字數 1187 閱讀 8434

只有指向同一陣列的倆個指標變數之間才可以進行計算。否則是沒有意義的。

int* pf1, *pf2; 

int arr[10] = ; 

pf1 = arr; 

pf2 = arr+1; 

auto result = pf2 - pf1;

計算機具體運算是兩個位址值相減。應該是過載了運算子「-」,結果是指標值相減除以指標所指物件的大小。因為單純的位址值相減就會和指標所指的物件有關係,所指物件不同那麼它的偏移量就會不同。比如,所指的是字元型相減就是1,如果是雙精度型那麼就是是8。然而如果過載了之後指標相減了就僅僅是為了表示指標所指元素的距離。再說一遍這只是在連續的記憶體塊中才有意義(陣列)。那麼接下來這行**就有意思了。

auto result = (char*)pf2 - (char*)pf1;

這行**得出的結果是4,沒錯你沒有看錯。最後的結果就是4。因為過載的運算機制如下:

那麼偏移量怎麼計算呢?就是兩個指標的實際的差值。如果你通過強制轉換成字元型(char)那麼分母的大小就是1而不是4,這樣的話就是擴大了四倍。最後就是得出結果就是元素的距離乘以擴大的倍數。最終得出的結果就是4。 

指標相減是指兩個指標值(位址)相減之差再除以該陣列元素的長度(位元組數)的意思了吧!上次回答:得到 (指標尾 - 指標頭)/ sizeof(陣列的型別) = 中間有幾個元素;

但是 / sizeof(型別) 編譯器已經幫我們實現好了.所以就無需我們做這一步

請教一下,這個的結果是什麼?關於兩個指標相減的問題

p1=(int *)ox0500;

p2=(int *)ox0518;

value=p2-p1;

printf(「%d」,value)

p1=(int *)ox0500;

p2=(int *)ox0518; 這兩句是吧 0x0500和0x0518這兩個16進製制數強制的作為int型變數的位址。兩個int型變數的位址之差就是這兩個位址中間可以有多少個int型變數。(這是因為c語言可以根據變數的型別來決定位址增加的實際空間。比如你定義乙個int指標int *p,p=p+1時,其實在記憶體位址中實際加4,因為int在c中4個位元組。)

0x0518-0x0500=24  24/4=6  所以結果應該為6 即兩個位址之間可以有6個int變數的空間。

指向同一陣列的倆個指標變數進行運算可以表示它們所指陣列元素之間的關係,比如:

兩個指標之間的運算

只有指向同一陣列的倆個指標變數之間才可以進行計算。否則是沒有意義的。int pf1,pf2 int arr 10 pf1 arr pf2 arr 1 auto result pf2 pf1 計算機具體運算是兩個位址值相減。應該是過載了運算子 結果是指標值相減除以指標所指物件的大小。因為單純的位址值相...

兩個指標相減

原文 如果兩個指標指向同乙個陣列,它們就可以相減,其結果為兩個指標之間的元素數目。假設我住在廣場路124號,mag住在廣場路142號,每家之間的位址間距是2 在我這一側用連續的偶數作為街道位址 那麼mag家就在我家往前 142 124 2家,也就是說可以得到我們兩家之間相隔8家。也就是說可以利用兩個...

兩個日期之間的天數

被csdn各種大牛打擊的.繼續加油.今天翻了下 程式設計珠璣 其實這本書感覺對自己還是有點深,吃不透啊。看到一題,有一小問是給定兩個日子,計算這兩個日子的天數 碰巧前幾天做web作業也有差不多這題的,不過那一題直接呼叫系統函式的,兩個日期一減 1000 60 60 24就是天數了 c中還真不知道有沒...