C指標加整數 兩個指標相減的問題

2021-06-16 10:53:00 字數 1782 閱讀 9276

源文是寫c++情況下的,我做測試用的是c, linux環境下。我做的,就是寫下測試程式,來驗證c環境下的結果。

原文內容:

說來慚愧,寫c++有一段時間了。這個問題從來沒有認真考慮過,此次標記於此:

考慮如下問題:

1     char a[20];

2     int *ptr = (int *)a;

3     ptr++;

第3句ptr++實際為ptr右移乙個int空間(即4個位元組)的距離,此時ptr指向a[4]。

若第3句改為

int *p = ptr + 2;

則p指向a[8]

這裡說明當指標加整數時,指標向後偏移的距離看的是宣告該指標的型別(此處即int),而非指向的實際型別(此處即char)!!!

另外,如果我就是想在第3句處得到a後面乙個位元組的位址怎麼辦?

可以這樣:

void *p = a;

p = p + 1;

(這裡注意:c++不允許p++或++p)

void型別的指標加整數,即為指標實際向後偏移的位元組數。

同理,若

int *pa0 = (int *)&a[0];

int *pa4 = (int *)&a[4];

std::size_t s = pa4 - pa0;

則s等於1

那麼如果

int *pa3 = (int *)&a[3];

int *pa5 = (int *)&a[5];

std::size_t s2 = pa3 - pa0;

std::size_t s3 = pa5 - pa0;

這裡的s2,s3又分別等於多少呢,

是的,如你所想:s2等於0,s3等於1

可見,同類指標(當然也只有同類指標允許相減,如pa3和pa0)相減得到的整數值,等於兩指標減的距離除以sizeof(宣告指標的型別),然後取整(此處即static_cast((pa3 - pa0) / sizeof(int)))。

測試程式:

#include int main() ;

int *ptr = (int *) a;

ptr++;

printf("a = %p, ptr-1 = %p, ptr = %p\n", a, ptr - 1, ptr);

void *p = a;

p++;

printf("a = %p, ptr-1 = %p, ptr = %p\n", a, p - 1, p);

int *pa0 = (int *) &a[0];

int *pa4 = (int *) &a[4];

int s1 = pa4 - pa0;

int *pa3 = (int *) &a[3];

int *pa5 = (int *) &a[5];

int s2 = pa3 - pa0;

int s3 = pa5 - pa0;

printf("s1 = %d, s2 = %d, s3 = %d\n", s1, s2, s3);

}

測試結果:

[root@sucre-pc src]# ./test 

a = 0xbfa153b8, ptr-1 = 0xbfa153b8, ptr = 0xbfa153bc

a = 0xbfa153b8, ptr-1 = 0xbfa153b8, ptr = 0xbfa153b9

s1 = 1, s2 = 0, s3 = 1

[root@sucre-pc src]#

C 指標加整數 兩個指標相減的問題

說來慚愧,寫c 有一段時間了。這個問題從來沒有認真考慮過,此次標記於此 考慮如下問題 1 char a 20 2 int ptr int a 3 ptr 第3句ptr 實際為ptr右移乙個int空間 即4個位元組 的距離,此時ptr指向a 4 若第3句改為 int p ptr 2 則p指向a 8 這...

C 指標加整數 兩個指標相減的問題

考慮如下問題 1 char a 20 2 int ptr int a 3 ptr 第3句ptr 實際為ptr右移乙個int空間 即4個位元組 的距離,此時ptr指向a 4 若第3句改為 int p ptr 2 則p指向a 8 這裡說明當指標加整數時,指標向後偏移的距離看的是宣告該指標的型別 此處即i...

兩個指標相減

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