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

时间:2018-08-19 15:29:01

标签: c pointers casting

我看到一个question的声明:printf(scanf("%d",&a));

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

我非常清楚这句话出了什么问题。这不是问题。

但这让我感到奇怪。我完全理解为什么尽管容易出错,但为什么允许在浮点数和整数之间进行隐式强制转换,但是我看不到为什么允许从整数到指针。您什么时候应该将整数转换为指针?

2 个答案:

答案 0 :(得分:1)

这句话没有任何意义。

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

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

printf(scanf("%d",&a))将scanf的结果(零或1)作为指针传递给格式字符串。由于它不是有效的指针,因此该语句是UB。

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

((GPIO_TypeDef *) 0x4000000) 否则将很难访问存储器中的特定地址。这种类型的如果强制转换的行为是实现的定义。

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

答案 1 :(得分:1)

  

我完全理解为什么即使容易出错,为什么也允许在浮点数和整数之间进行隐式强制转换,但是我看不到为什么允许从整数到指针。您什么时候可以做到这一点?

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

uint16_t * terminal_buffer = (uint16_t*)0xB8000;

此行将整数 0xB8000强制转换为指针进行强制转换,这是完全合法的。如果您忽略演员表,则有可能您没有按照自己的想法 进行操作(例如您的printf( scanf( ... ) )例子),这就是编译器发出警告的原因。