繁体   English   中英

有人可以解释一下 C 中的类型铸造吗?

[英]Can someone explain following type casting in C?

我已经关注了一段代码。 我想了解的是,为什么我们要使用*(uint8 *)而不是*(uint8_t)进行类型转换?

  • 不是*(uint8_t *)value读作: value is ptr to uint8_t ptr and
  • 不是*(uint8_t)value读作: value is ptr to 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是指向uint32_t的指针。 强制转换将其转换为指向不同类型的指针; (uint8_t *)value将其转换为指向uint8_t的指针。 然后取消引用,用于分配给该地址的 8 字节字段。

(uint8_t)value会将指针转换为 8 位 integer。 然后将*放在前面会尝试使用 integer 作为分配地址,这是无效的; 您不能取消引用 integer。 此外,指针大于 8 位(在大多数现代 CPU 上它们是 32 位或 64 位),因此将指针转换为uint8_t会丢弃大部分指针的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM