簡體   English   中英

“內存地址差異”是什么意思?

[英]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是分開beginend的元素(由beginend指向的類型)的數量。


注意我沒有使用int作為res的類型,但是ptrdiff_t :這是非常有意的,因為ptrdiff_t被定義為“ 兩個指針之間的減法操作返回的類型 ”( 鏈接 ),所以它是完美的類型保持這樣的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM