【发布时间】:2013-10-12 20:05:53
【问题描述】:
我正在对 C 中的指针进行一些审查,但我对遇到的一些代码感到有些困惑。我在qeeksquiz.com/pointers 上做一个测验来复习,我遇到了这段代码:
#include<stdio.h>
int main()
{
int a;
char *x;
x = (char *) &a;
a = 512;
x[0] = 1;
x[1] = 2;
printf("%d\n",a);
return 0;
}
当我遇到x = (char *) &a 时,我有点困惑。我知道 x 是一个包含 a 地址的指针,但是当我们分配 x[0] = 1 和 x[1] = 2; 时,打印出来的答案是 513。答案谈到它如何取决于我们使用的机器以及如何使用little-endian 机器改变了它读取二进制文件的方式。我对我们如何从 512 到 513 感到非常困惑。我猜这是因为 x[0] = 1 但我不是 100% 确定。有人可以帮忙解释一下吗?如果我们分配x[0] = 2,那么改变的价值是什么?
感谢您的帮助!
【问题讨论】:
-
int 存储为字节序列。这里只初始化了 2 个字节:然后 value 计算为 x[0]+ 256*x[1] = 1 + 256*2 = 513。如果它是一个不同字节序的机器,那么(假设 int 使用了 2 个字节,这并不总是正确的)它会反过来:x[1] + 256*x[0] = 2 + 256 = 258。
-
将 x[1] 乘以 256 是从哪里得到的?
-
256 是 2**8,8 是一个字节的位数。
-
@user1871869: 256 来自基地。正如 base-10 数字
12表示1 * 10 + 2 * 1,base-16 数字0x12表示1 * 16 + 2 * 1,base-256 数字(1, 2)表示1 * 256 + 2 * 1。
标签: c++ c arrays pointers char