我不明白为什么指针在数组中以半字节而不是字节递增。
例如,考虑一个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之间的空间是半字节,但每个空间都指向虚拟内存中的一个字节。这怎么可能?不应该指针增加一个字节吗?
答案 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);
但为什么要蚕食?