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

Che*_*eng 2 c c++

考虑

#include <cstdio>

int main() {
    char a[10];
    char *begin = &a[0];
    char *end = &a[9];
    int i = end - begin;
    printf("%i\n", i);
    getchar();
}
Run Code Online (Sandbox Code Playgroud)
#include <cstdio>

int main() {
    int a[10];
    int *begin = &a[0];
    int *end = &a[9];
    int i = end - begin;
    printf("%i\n", i);
    getchar();
}
Run Code Online (Sandbox Code Playgroud)
#include <cstdio>

int main() {
    double a[10];
    double *begin = &a[0];
    double *end = &a[9];
    int i = end - begin;
    printf("%i\n", i);
    getchar();
}
Run Code Online (Sandbox Code Playgroud)

以上三个例子也打印9

我可以知道,我应该如何理解9.这是什么意思?

Chu*_*dad 12

9表示&a [9]和&a [0]之间的类型'T'的元素数(其中T分别是char,int,double).

它们之间的实际字节数是(&a[9] - &a[0])*sizeof(T).请注意,根据定义,sizeof(char)为1.进一步注意,字节不是强制为8位.相反,它需要多个8位内存位置来保存实现的基本字符集中的所有字符.

编辑:正如@pmg指出的那样,一个字节被定义为足够宽的内存位置,以容纳实现的基本字符集中的所有字符.

  • 一个字节可以是9位,或36位,......它不需要是8位的倍数.所有实现都有一个预定义的宏常量,为该实现指定一个字节中有多少位:CHAR_BIT. (2认同)

Vla*_*mir 6

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

((int)end - (int)begin)/sizeof(type)
Run Code Online (Sandbox Code Playgroud)

6.5.6.9当减去两个指针时,两个指针都指向同一个数组对象的元素,或者指向数组对象的最后一个元素的元素; 结果是两个数组元素的下标的差异