考虑一个使用 16 位对齐和 16 位指针的架构(只是为了避免二进制数字过多!)。指针只会引用 16 的倍数的内存位置,但指针值仍然精确到字节。所以二进制指针是:
0000000000000100
指的是内存位置4(内存中的第五个字节):
┌────────────────────┬────────────────────┬──────── ──────┬──────────────┐
│ 十进制地址 │ 二进制地址 │ 8─位字节 │ 16位字 │
├────────────────────┼────────────────────┼──────── ──────┼──────────────┤
│ 0 │ 000000000000000
0 │ ┌──────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 1 │ 0000000000000001 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ 2 │ 000000000000001
0 │ ┌──────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 3 │ 0000000000000011 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ 4 - 这个 │ 000000000000010
0 │ ┌─────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 5 │ 0000000000000101 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ 6 │ 000000000000011
0 │ ┌──────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 7 │ 0000000000000111 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ ... │ │ │ │
└────────────────────┴────────────────────┴──────── ──────┴──────────────┘
使用 16 位对齐,永远不会有指向内存位置 5 的指针,因为它不会对齐,下一个有用的值是 6:
0000000000000110
请注意,最低有效位(最右边的那个)仍然是 0。事实上,对于该架构上的所有有效指针值,该位将为 0。这就是它们的意思通过保留 "...指针的一些最低有效位未使用。" 在我的示例中,它只有一位,但如果您有 32 位对齐,它将是 两个 指针值末尾的位始终为零:
┌────────────────────┬────────────────────┬──────── ──────┬──────────────┐
│ 十进制地址 │ 二进制地址 │ 8─bit bytes │ 32─bit words │
├────────────────────┼────────────────────┼──────── ──────┼──────────────┤
│ 0 │ 00000000000000
00 │ ┌──────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 1 │ 0000000000000001 │ ┌──────────┐ │ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ 2 │ 0000000000000010 │ ┌──────────┐ │ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ 3 │ 0000000000000011 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ 4 │ 00000000000001
00 │ ┌──────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 5 │ 0000000000000101 │ ┌──────────┐ │ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ 6 │ 0000000000000110 │ ┌──────────┐ │ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ 7 │ 0000000000000111 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ 8 │ 00000000000010
00 │ ┌────────┐ │ ┌──────────┐ │
│ │ │ └─────────┘ │ │ │ │
│ 9 │ 0000000000001001 │ ┌──────────┐ │ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ 10 │ 0000000000001010 │ ┌──────────┐ │ │ │ │
│ │ │ └─────────┘ │ │ │ │
│ 11 │ 0000000000001011 │ ┌──────────┐ │ │ │ │
│ │ │ └────────┘ │ └──────────┘ │
│ ... │ │ │ │
└────────────────────┴────────────────────┴──────── ──────┴──────────────┘