源文是寫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家。也就是說可以利用兩個...