如何在c语言中将void*转换为float**,将void指针转换为float指针
how to cast void* to float** in c, a void pointer to float pointer pointer
我有一个函数,它将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。这真是大错特错了。然后你让编译器把那个浮点值赋给一个浮点值,这是编译器不允许的,因为浮点和浮点是完全不同的东西。
- 没有从阵列<float>到阵列<int>的可行转换
- 没有合适的构造函数可以从"float"转换为"_D3DCOLORVALUE"
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 如何将 qml 的文本转换为 float 和 int
- 错误:无法将"float*"转换为"float"
- 缩小从double到float的转换
- 谷歌测试编译错误 Os X:函数式转换从"int"到"internal::FloatingEq2Matcher"的模糊转换<float>
- 如何有效地将一个大std::字符串的一部分转换为float
- 如何使用 std:from_chars 在 C++17 中从字符串转换为 int/float
- C++优化从 int 到 float 的数组转换
- OpenCL 将 float16 转换为 float*
- 在 C++ 中从 'const float*' 到 'float*' 的转换无效
- 如何修复"无法在初始化时将'Tmp'转换为'float'
- 如何将 std::array<double, 100> 转换为 std::array<float, 100> ?(避免明显的样板实现)
- 如何将可变字符串[]转换为float
- 警告:从 'char *' 到 'float *' 的强制转换将所需的对齐从 1 增加到 4 [-Wcast-align]
- 有没有一种优雅的方法可以将矢量<复杂<float>>转换为矢量<short>?
- MBED RTOS将Float转换为字符串/字符阵列
- 不知道参数 1 从 sf::Vector2i 到 const sf::Vector2i& 的转换<float>
- 显式类型转换 float(intvar) 结果为 int