我创建了一个取void*的函数,并在get_value函数和基于类型的操作中对该值进行类型转换后,向它传递了不同类型的值,例如floatintdouble.

Compiler error:

main.c:17:27:错误:"float"类型的操作数无法转换为指针类型

Question
When using an int value, I can directly pass it with get_value((void *)10); and then access the data by casting back with (int). But float value gives the above compiler error. Why?

#include <stdio.h>
#include <stdint.h>
void get_value(void* data)
{
    printf("Value %f \r\n", (float)data);
}


int main(void) {
    float di = 10.10;
    get_value((void *)di); 
    return 0;
}

推荐答案

为了回答为什么它适用于int而不适用于浮点的问题:将浮点类型转换为指针类型/从指针类型转换的具体情况被明确指出为C无效,就这么简单.

C17 6.5.4演员操作员:

Constraints

指针类型不得转换为任何浮动类型.浮动类型不应转换为任何指针类型.

而C允许integer转换到/从对象指针转换,尽管这样做可能是危险的或不可移植的,例如请参阅C17 6.3.2.3:

integer可以转换为任何指针类型.除非前面指定,否则结果是实现定义的,可能未正确对齐,可能不指向引用类型的实体,并且可能是trap 表示.

值得注意的是,将int投射到/从void*投射到void*是不好的做法.通常在处理此类转换时,您会使用uintptr_t(stdint.h)的integer类型,保证该类型足够大以进行此类转换.当您想要将一个整除为一个指针时,大约唯一一次是当您想要一个指向硬件地址的指针时,因此指针类型更有意义,为volatile unsigned char*或类似类型.

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

为什么静态说明符为内联函数生成外部定义?

从STdin读写超过4096个字节

找出文件是否包含给定的文件签名

从组播组地址了解收到的数据包长度

自定义应用程序上的日志(log)轮换问题

使用额外的公共参数自定义printf

从纯C中访问通用项对话框

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

S的这种管道实施有什么问题吗?

我的C函数起作用了,但我不确定为什么

C语言中的数字指针

计算SIZE_MAX元素的长数组的大小

将某些内容添加到链接列表时,列表中的其他项将使用最后添加的项的名称

如何使用WRITE()以指针地址的十六进制形式写入标准输出

挥发性语义的形式化理解

如何在C中计算包含递增和递减运算符的逻辑表达式?

execve 不给出which命令的输出

是否可以在多字 C 类型中的任何位置混合存储和类型限定符?