内存地址是如何创建的

问题描述 投票:0回答:1

我对内存地址有点困惑,据我所知,每个内存地址的大小都是 1 字节(8 位),每个内存地址都有自己的十六进制地址 0x122..,现在当我们存储一个 32 位 int 时,它需要4 个字节,现在计算机是否将每个 1 字节地址(0x123、0x124..)组合起来形成一个新的 4 字节地址。

c++ c memory computer-science ram
1个回答
0
投票

想想下面你迟早会遇到的代码:

#include <stdio.h>

int main()
{
    char arrayN[20] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20};

    char* charP = arrayN;
    short* shortP = (short*)arrayN;
    int* intP = (int*)arrayN;

    printf("sizeof(char) is %zu\n", sizeof(char));
    printf("sizeof(short) is %zu\n", sizeof(short));
    printf("sizeof(int) is %zu\n", sizeof(int));

    printf("charP address is %p\n", charP);
    printf("0x%x\n", *charP);
    charP++;
    printf("charP address is %p\n", charP);
    printf("0x%x\n", *charP);

    printf("shortP address is %p\n", shortP);
    printf("0x%x\n", *shortP);
    shortP++;
    printf("shortP address is %p\n", shortP);
    printf("0x%x\n", *shortP);

    printf("intP address is %p\n", intP);
    printf("0x%x\n", *intP);
    intP++;
    printf("intP address is %p\n", intP);
    printf("0x%x\n", *intP);

    return 0;
}

假设上面的代码在具有大端存储和

sizeof(char) is 1
sizeof(short) is 2
sizeof(int) is 4
的64位计算机上运行,这个假设仅用于解释问题,当然有时
sizeof(int) is 2
sizeof(int) is 8
,但我们不这样做想想看。

运行会输出:

sizeof(char) is 1
sizeof(short) is 2
sizeof(int) is 4
charP address is 0x7ffe68a9a920
0x1
charP address is 0x7ffe68a9a921
0x2
shortP address is 0x7ffe68a9a920
0x201
shortP address is 0x7ffe68a9a922
0x403
intP address is 0x7ffe68a9a920
0x4030201
intP address is 0x7ffe68a9a924
0x8070605

找到能让你理解起源问题的模式。

要找出为什么输出是这样的,你需要知道

little endian storage
big endian storage

© www.soinside.com 2019 - 2024. All rights reserved.