学习C,现在我学习简单的代码片段,显示原始值的字节表示:
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, int len) {
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_pointer(void *x) {
show_bytes((byte_pointer) &x, sizeof(void *));
}
如果我理解正确,&x
(一个&符号)显示内存地址(等于*x
)。
因此。程序例程显示每种数据类型的十六进制值,int
字节值如(sizeof(int))
。
我真的不明白它的工作原理。首先,我们typedef
指向unsigned char,然后将其与其他类型一起使用。当我们将byte_pointer定义为类型(byte_pointer) &x
的值时,unsigned char
的含义是什么?为什么它可以工作?我知道我们获取包含值的内存地址,但我不知道它是如何工作的以及为什么它与char指针一起工作。你能解释那个部分吗?
感谢。
答案 0 :(得分:1)
byte_pointer
被定义为unsigned char
的指针;这是show_bytes
可以打印出传递给show_bytes
的地址的每个字节(十六进制)。
我会声明start
为void*
,然后将其投放到show_bytes
内,使其更清晰show_bytes
无关心start
指向什么类型的事物,以及b)避免每次通话中的演员。
答案 1 :(得分:1)
代码简单地获取随机数据块的地址并逐字节地打印内容。代码获取传递给它的任何地址,然后将其转换为指向字节的指针(unsigned char)。 C中的任何指针类型都可以转换为另一种指针类型,尽管在某些情况下这样做是危险的做法。在char
的情况下,它是安全的,但您可以保证获得指向对象的最低寻址字节的指针。
请注意,将指针隐藏在typedef后面是一种糟糕且危险的做法。忘记那个typedef,它没有增加任何价值。编写相同代码的更好方法是:
void show_bytes (const uint8_t* start, int len)
或者
void show_bytes (const void* s, int len)
{
const uint8_t* start = s;
...