[英]What is the meaning of “difference of memory address?”
考慮
#include <cstdio>
int main() {
char a[10];
char *begin = &a[0];
char *end = &a[9];
int i = end - begin;
printf("%i\n", i);
getchar();
}
#include <cstdio>
int main() {
int a[10];
int *begin = &a[0];
int *end = &a[9];
int i = end - begin;
printf("%i\n", i);
getchar();
}
#include <cstdio>
int main() {
double a[10];
double *begin = &a[0];
double *end = &a[9];
int i = end - begin;
printf("%i\n", i);
getchar();
}
以上三個例子也打印9
我可以知道,我應該如何理解9.這是什么意思?
9表示&a [9]和&a [0]之間的類型'T'的元素數(其中T分別是char,int,double)。
它們之間的實際字節數是(&a[9] - &a[0])*sizeof(T)
。 請注意,根據定義,sizeof(char)為1。 進一步注意,字節不是強制為8位。
相反,它需要多個8位內存位置來保存實現的基本字符集中的所有字符。
編輯:正如@pmg指出的那樣,一個字節被定義為足夠寬的內存位置,以容納實現的基本字符集中的所有字符。
指向某種類型的指針之間的差異是它們之間的實例數(也就是它等於數組索引之間的差異)。 或者換句話說它相當於(不確定正確的整數類型)
((int)end - (int)begin)/sizeof(type)
6.5.6.9當減去兩個指針時,兩個指針都指向同一個數組對象的元素,或者指向數組對象的最后一個元素的元素; 結果是兩個數組元素的下標的差異
編譯器將根據指針類型自動計算指針運算,這就是為什么你不能使用void*
(無類型信息)或混合指針類型(模糊類型)執行操作。
在MSVC2008(以及我認為的大多數其他編譯器)中,語法被解釋為計算兩個指針之間的元素差異量。
int i = end - begin;
00411479 mov eax,dword ptr [end]
0041147C sub eax,dword ptr [begin]
0041147F sar eax,3
00411482 mov dword ptr [i],eax
由於減法之后是右移,結果將向下舍入,因此保證N元素可以適合兩個指針之間的存儲空間(並且可能存在未使用的間隙)。 這在下面的代碼中得到了證明,其結果也是9。
int main()
{
double a[10];
double *begin = &a[0];
char *endc = (char*)&a[9];
endc += 7;
double *end = (double*)endc;
int i = end - begin;
printf("%i\n", i);
getchar();
return 0;
}
只要想一想減法的定義:一般來說
r = b - a
這意味着
b = a + r
它對指針也是一樣的:
ptrdiff_t res = end - begin;
從而
end == begin + res
現在,了解正常的指針算術規則,您可以很容易地推斷出res
是分開begin
和end
的元素(由begin
和end
指向的類型)的數量。
int
作為res
的類型,但是ptrdiff_t
:這是非常有意的,因為ptrdiff_t
被定義為“ 兩個指針之間的減法操作返回的類型 ”( 鏈接 ),所以它是完美的類型保持這樣的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.