这是一个简单问题的相当长的介绍,但是否则会出现“你为什么要在C ++中处理void指针?”这个类型的问题!你这个可怕的人!我宁愿(a)无效。:)
我正在使用一个C库,我可以从中检索一个它将操作的多边形列表。我使用的函数给了我一个指针数组(PolygonType**
),我从中创建了一个std::vector<MyPolyType>
我自己的多边形类MyPolyType
。这又用于创建boost::graph
,其中包含由向量中的索引给出的节点标识符。
在执行的稍后时间,我想计算两个多边形之间的路径。这些多边形以两个PolygonType*
的形式提供给我,但我想在我的图中找到相应的节点。如果我知道他们在上一个矢量形式中的索引,我可以找到这些。
现在,问题是:PolygonType
结构有void*
到“内部标识符”,似乎我不知道它的类型。但我确实知道指针以固定步长(120字节)增加。我知道指针的值,它将是第一个对象的偏移量。我可以使用它来计算(p-p0)/120
的索引,其中p
是我想要找到的多边形的地址,p0
是第一个多边形的偏移量吗?我必须将地址转发给int
,这可移植吗? (该应用程序可以在Windows和Linux上使用)
答案 0 :(得分:6)
你不能减去两个void指针。编译器会大声说它不知道大小。你必须首先将它们转换为char指针(char*
)然后减去它们然后除以120.如果你确定你的对象的大小实际上是120,那么它是安全的(虽然很难看) ,前提是p和p0指向同一数组中的对象
我仍然不明白为什么p0是偏移?我会说p是你的Polygon的地址,而p0是第一个多边形的地址......我误解了什么吗?
答案 1 :(得分:2)
鉴于指针指向“内部标识符”,我认为您不能对存储在其中的实际值做出任何假设。如果指针可以指向堆,您可能只是看到一组可能的值,并且它将在未来巧妙地(或明显地)中断。
为什么不创建PolygonType*
- &gt;的一次性反向映射? index
并使用它?