如何在c语言中将void*转换为float**,将void指针转换为float指针

how to cast void* to float** in c, a void pointer to float pointer pointer

本文关键字:转换 float 指针 void 语言      更新时间:2023-10-16

我有一个函数,它将float**作为输入变量Jim。我有另一个变量是从类型为void*的函数返回的。如何将void*转换为float** ?它们都应该是指向浮点数组的指针,但为什么float**是指向指针的指针?这是正确的吗?

void* Joe;
float** Jim = *(float*) Joe;

从我的研究,铸造浮动有一些限制。像void*一样可以强制转换为float。我是否需要像这样提取Joe的地址:

float** Jim = *(float*) &Joe;

Joe不是一个地址,因为它是一个指针吗?

转换类型应该与左边的变量类型相同,所以

float **Jim = (float**)&Joe;

如果不知道自己想要达到什么目标,就不可能给出合理的答案。

void* Joe;

表示Joe是指向某物的指针。我们只是不知道它指向的是什么。

float** Jim;

表示吉姆是一个指针。我们知道它应该指向什么样的东西:它应该指向float*,也就是指向另一个指针,指向浮点数。

现在你可以分配:

Jim = (float **)Joe;

现在发生的是Jim指向Joe所指向的东西。我们不知道乔指的是什么,但吉姆指的是同样的东西。如果Joe指向一个int型,那么Jim也指向同一个int型,但是编译器认为Jim指向一个float*型。由于int和float*是非常不同的东西,使用*Jim将导致灾难。

如果Joe碰巧指向一个浮点*,那么Jim现在将指向完全相同的浮点*,一切都很好。如果Joe碰巧指向一个浮点数(记住浮点数和浮点*不一样)或者一个双精度*(记住双精度*和浮点*不一样),事情就会出错。

重复:赋值Jim = (float **)Joe;不会改变乔指向的东西。它改变了编译器认为 Jim指向的内容。如果编译器认为Jim所指向的和Jim实际指向的不一样,那么事情就会出错。

你行

float** Jim = *(float*) &Joe;

是完全错误的。乔是某种东西的指针。我们不知道是什么。&Joe是那个指针的地址,所以它是一个指向Joe的指针,而Joe是一个指向未知对象的指针(void **)。你把那个指针强制转换为float*,然后给出一个指向Joe的指针,但是编译器知道变量Joe包含一个float而不是void*。* (float*) &Joe;读取存储在变量Joe中的void*,但编译器认为它不是void*,而是float。这真是大错特错了。然后你让编译器把那个浮点值赋给一个浮点值,这是编译器不允许的,因为浮点和浮点是完全不同的东西。