【问题标题】:Can someone explain following type casting in C?有人可以解释一下 C 中的类型转换吗?
【发布时间】: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 *) valuevalue 转换为uint8_t * 类型,这是一个可以取消引用的指针。转换(uint8_t) value 将指针value 转换为uint8_t ,它不是指针并且不能被取消引用。您可能想退后一步,重新了解指针和相关运算符(如解引用运算符*)?

标签: c pointers data-structures casting type-conversion


【解决方案1】:

value 是指向uint32_t 的指针。强制转换将其转换为指向不同类型的指针; (uint8_t *)value 将其转换为指向uint8_t 的指针。然后取消引用,用于分配给该地址的 8 字节字段。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2016-12-12
    • 2011-05-06
    • 1970-01-01
    • 2015-05-03
    相关资源
    最近更新 更多