在我阅读CS:APP 3rd Edition的过程中,我偶然发现了这段代码,谁知道我在阅读本书的同时可能会得到正确的解释,但是直到现在我还不太明白这是如何检索正确的十六进制的数字。
我希望这里有人能够给我详尽的解释。
投射指向内存地址的指针有什么作用?
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len)
{
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_int(int x)
{
show_bytes((byte_pointer) &x, sizeof(int));
}
通过这种方式,我是指整数如何存储到内存中,因为当我将其打印为%d时,例如将100作为给定的int。它将打印:
100 0 0 0
但是当我使用1000时,它将打印:
232 3 0 0
答案 0 :(得分:1)
&x
给出了x所存储的指针,因为x是一个int,所以它给出了一个指向int的指针(4个字节)。
(byte_pointer) &x
给出一个指向char(单个字节)的指针,以便for循环可以遍历int的每个字节(start[i]
指向第i个字节,而不是第一个字节。第i个int)。
答案 1 :(得分:0)
将每个数组元素打印为两位十六进制数字,格式为%.2x
。您还可以看到它也写成%02x
或%02X
(使用大写字母),并以空格开头。您也可以将其打印为:
while (len--) printf(" %02x", start++);
以更紧凑的方式(新手很难理解)