我有一个函数,它将float**
作为输入变量Jim
。我有一个从void*
类型的函数返回的另一个变量。如何将void*
投射到float**
?它们都应该是浮点数组的指针,但为什么float**
是指向指针的指针?这是对的吗?
void* Joe;
float** Jim = *(float*) Joe;
从我的研究铸造到浮动有一些限制。与void*
类似,可以投放到float
。我是否需要像这样提取Joe的地址:
float** Jim = *(float*) &Joe;
不是Joe已经是一个地址,因为它是指针吗?
答案 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 * *是完全不同的东西。