代码之家  ›  专栏  ›  技术社区  ›  Cheok Yan Cheng

“内存地址差异”是什么意思?”

c c++
  •  2
  • Cheok Yan Cheng  · 技术社区  · 14 年前

    考虑

    #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的意思吗。这是什么意思?

    4 回复  |  直到 14 年前
        1
  •  3
  •   YeenFei    14 年前

    编译器会根据指针的类型自动计算指针算法,这就是为什么不能使用 void* (无类型信息)或混合指针类型(不明确类型)。

    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 
    

    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;
    }
    
        2
  •  12
  •   Chubsdad    14 年前

    9表示在&a[9]和&a[0]之间的类型为“T”的元素的数目(其中T是char、int、double,分别按该顺序排列)。

    它们之间的实际字节数为 (&a[9] - &a[0])*sizeof(T) 相反,它是一个8位的内存位置,需要用来保存实现的基本字符集中的所有字符。

    EDIT:正如@pmg所指出的,字节被定义为一个内存位置,其宽度足以容纳实现的基本字符集中的所有字符。

        3
  •  6
  •   Vladimir    14 年前

    指向某个类型的指针之间的差异是它们之间的实例数(也就是说,它相当于数组索引之间的差异)。或者换句话说,它等价于(不确定是否正确的整数类型)

    ((int)end - (int)begin)/sizeof(type)
    

    6.5.6.9 当两个指针相减时,两个指针都应指向 相同数组对象的元素,或 超过数组最后一个元素的一个 两个数组的下标 元素

        4
  •  3
  •   Matteo Italia    14 年前

    r = b - a
    

    b = a + r
    

    指针也一样:

    ptrdiff_t res = end - begin;
    

    end == begin + res
    

    现在,了解了普通的指针算术规则,就可以很容易地推断出 res begin end )那是分开的 开始 结束


    注意,我没有使用 int 作为 物件 ,但是 ptrdiff_t :这是非常有意的,因为 ptrdiff\ 两个指针之间的减法运算返回的类型 " ( link