如何在void中将void *转换为float **,一个指向浮点指针指针的void指针

时间:2014-07-29 15:17:18

标签: c++ objective-c c pointers floating-point

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

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

从我的研究铸造到浮动有一些限制。与void*类似,可以投放到float。我是否需要像这样提取Joe的地址:

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

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

2 个答案:

答案 0 :(得分:3)

演员表应该与左侧的变量类型相同,所以

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

答案 1 :(得分:2)

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

void* Joe;

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

float** Jim;

意味着吉姆是一个指针。我们知道它应该指向什么样的东西:它应该指向float *,即指向浮点数的另一个指针。

现在您可以指定:

Jim = (float **)Joe;

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

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

重复:赋值Jim =(float **)Joe;并没有改变Joe指出的内容。它改变了Jim指向的编译器认为的内容。如果编译器认为Jim指的是什么,以及Jim实际指向的是什么,那就不一样了,那么事情就会出错。

你的行

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

完全错了。乔是指向某事的指针。我们不知道是什么。 & Joe是该指针的地址,因此它是指向Joe的指针,指针指向我们不知道的东西(void **)。你将该指针强制转换为float *并给出一个指向Joe的指针,但是编译器知道变量Joe包含一个浮点而不是一个void *。 *(float *)& Joe;读取存储在变量Joe中的void *,但编译器认为它不是void *,而是float。那不可能是任何一个人。然后你要求编译器将浮点值赋给编译器不允许的float * *,因为float和float * *是完全不同的东西。