代码之家  ›  专栏  ›  技术社区  ›  klutt

为什么整数隐式转换为指针?

  •  0
  • klutt  · 技术社区  · 7 年前

    我看到一个 question 有了这句话: printf(scanf("%d",&a));

    当然它会发出警告 passing argument 1 of ‘printf’ makes pointer from integer without a cast.

    但这让我很疑惑。我完全理解为什么在浮点数和整数之间允许隐式转换,尽管它容易出错,但我不明白为什么允许从整数到指针。你什么时候会把一个整数转换成一个指针呢?

    2 回复  |  直到 7 年前
        1
  •  1
  •   DevSolar    7 年前

    我完全理解为什么在浮点数和整数之间允许隐式转换,尽管它容易出错,但我不明白为什么允许从整数到指针。你什么时候会这样做?

    考虑一个需要访问特定地址的软件。假设一个引导加载程序想要获取VGA文本模式缓冲区的句柄,该缓冲区位于物理地址 0xB8000 .

    uint16_t * terminal_buffer = (uint16_t*)0xB8000;
    

    这一行将 0xB8000型 指向指针 具有 一个演员,完全合法。如果你 省略 演员们,有可能你没有 你在做(就像你的 printf( scanf( ... ) ) 这就是编译器发出警告的原因。

        2
  •  1
  •   0___________    7 年前

    scanf 返回一个整数-成功扫描的项目数。在你的情况下,它将是零(没有成功)或1。

    printf 需要指向包含格式和零个或更多其他参数的字符串的指针。

    printf(scanf("%d",&a))

    从整数到指针的隐式转换通常是程序员的错误,但从语言的角度来看是合法的。由于这种类型的强制转换是可疑的,编译器会发出警告。从无符号整数到指针(显式)的强制转换通常用于微控制器编程-例如

    ((GPIO_TypeDef *) 0x4000000) 否则,访问内存中的特定地址将非常困难。这种if-cast的行为是由实现定义的。

    在你的情况下,你可能是指 printf("%d\n", scanf("%d",&a)); 它将打印格式中扫描的项目数。