【发布时间】:2020-04-27 23:17:05
【问题描述】:
我已经关注了一段代码。
我想了解的是,为什么我们要使用 *(uint8 *) 而不仅仅是 *(uint8_t) 进行类型转换?
-
*(uint8_t *)value不是读作:value是指向uint8_t的 ptr 和 - 不是
*(uint8_t)value读作:value是指向uint8_t
我只是对这两个有点困惑。任何解释都非常感谢。
uint8_t read_8_function(uint8_t *addr);
uint16_t read_16_function(uint16_t *addr);
uint32_t read_32_function(uint32_t *addr);
int some_function(uint32_t size, uint32_t *value){
uintptr_t some_addr = (uintptr_t *)0xaaaa5555;
switch(size) {
case 1:
*(uint8_t *)value = read_8_function(some_addr);
case 2:
*(uint16_t *)value = read_16_function(some_addr);
case 4:
*value = read_32_function(some_addr);
}
return 0;
}
【问题讨论】:
-
第一个
*不是类型转换的一部分。 -
强制转换意味着只有
value的部分会被写入。具体取决于平台。它还打破了严格的别名。 -
你从哪里得到这个代码?这个功能是如何使用的?只是看起来……嗯,不好。
-
如果你想将泛型指针传递给函数,通常使用
void *。 -
转换
(uint8_t *) value将value转换为uint8_t *类型,这是一个可以取消引用的指针。转换(uint8_t) value将指针value转换为uint8_t值,它不是指针并且不能被取消引用。您可能想退后一步,重新了解指针和相关运算符(如解引用运算符*)?
标签: c pointers data-structures casting type-conversion