为什么指针在数组中以半字节而不是字节递增?

时间:2015-06-23 22:57:43

标签: c++ c arrays pointers

我不明白为什么指针在数组中以半字节而不是字节递增。

例如,考虑一个32位的小端机器和一个4个整数的数组(1,2,3,4)

地址 - > (以十六进制存储的值)

0x002BF94C -> 01
        4D -> 00
        4E -> 00
        4F -> 00

0x002BF950 -> 02
        51 -> 00
        52 -> 00
        53 -> 00

...And so on

4C和4D之间的空间是半字节,但每个空间都指向虚拟内存中的一个字节。这怎么可能?不应该指针增加一个字节吗?

3 个答案:

答案 0 :(得分:6)

  

4C和4D之间的空间是半字节

不,这些地址表示为字节。 4D - 4C是1个字节,而不是1个半字节。

  

但每个都指向虚拟内存中的一个字节。这怎么可能?指针不应该递增一个字节吗?

指针值是字节。将它们递增1会使它们增加一个字节。

基本上我不知道你在哪里知道这里的任何东西都用半字节表示,但它们不是。回到以字节为单位思考。

答案 1 :(得分:2)

正如其他答案所说,指针以字节递增,而不是半字节。

我相信你会推断出地址和实际内存块之间不存在的关系。

byte-addressable machine中,每个字节都有自己的地址。您递增1以到达下一个地址。所以你有地址0x002BF94C,下一个地址是0x002BF94D。虽然地址的变化只会影响地址本身的最低半字节,但这与地址所指向的内存块无关。由于该机器显然是字节可寻址的,因此0x002BF94C寻址的块与0x002BF94D寻址的块之间的位数实际上是8位或一个字节。

选择使用什么作为地址是任意的。设计架构的人可以选择给每个字节命名,街道号码和邮政编码,但给他们提供数字显然更方便。选择大小的内存块获取自己的地址也是任意的。过去的一些机器没有字节可寻址的存储器;它们有word-addressable个内存,因此只有16或32位的组(或制造商想要的大小)才能获得自己的地址。理论上你可以有一个半字节可寻址的机器,虽然我认为没有人做过。地址与其引用的内存之间没有必然的关系。

问题中的图表可能会增加混乱。请记住,32位相当于4个字节,因此每个32位数字都有四个指向其各个部分的地址。图中的每个被寻址的段都是一个字节;如果它们是半字节,则整数只有两个字节,而且是16位,而不是32位。由于数字以十六进制表示,每个数字代表一个半字节,因此01实际上是两个半字节/八位/一个字节0000 0001

0x002BF94C -> 01  This is one byte
        4D -> 00  This is the next byte
        4E -> 00  etc.
        4F -> 00

如果这台机器是半字节可寻址的,那么图表将如下所示:

0x002BF94C -> 1  This is one nibble
        4D -> 0  This is the next nibble
        4E -> 0  etc.
        4F -> 0
        50 -> 0
        51 -> 0
        52 -> 0
        53 -> 0

答案 2 :(得分:-1)

可能是因为系统中的每个整数都有4个字节吗?比如说,在C:

int array[10];
int *pA = array;

printf("pA= %x", (size_t)pA);
pA++;
printf("pA= %x", (size_t)pA);

但为什么要蚕食?