在计算中使用void指针

时间:2011-07-05 14:46:30

标签: c++ pointers

这是一个简单问题的相当长的介绍,但是否则会出现“你为什么要在C ++中处理void指针?”这个类型的问题!你这个可怕的人!我宁愿(a)无效。:)

我正在使用一个C库,我可以从中检索一个它将操作的多边形列表。我使用的函数给了我一个指针数组(PolygonType**),我从中创建了一个std::vector<MyPolyType>我自己的多边形类MyPolyType。这又用于创建boost::graph,其中包含由向量中的索引给出的节点标识符。

在执行的稍后时间,我想计算两个多边形之间的路径。这些多边形以两个PolygonType*的形式提供给我,但我想在我的图中找到相应的节点。如果我知道他们在上一个矢量形式中的索引,我可以找到这些。

现在,问题是:PolygonType结构有void*到“内部标识符”,似乎我不知道它的类型。但我确实知道指针以固定步长(120字节)增加。我知道指针的值,它将是第一个对象的偏移量。我可以使用它来计算(p-p0)/120的索引,其中p是我想要找到的多边形的地址,p0是第一个多边形的偏移量吗?我必须将地址转发给int,这可移植吗? (该应用程序可以在Windows和Linux上使用)

2 个答案:

答案 0 :(得分:6)

你不能减去两个void指针。编译器会大声说它不知道大小。你必须首先将它们转换为char指针(char*)然后减去它们然后除以120.如果你确定你的对象的大小实际上是120,那么它是安全的(虽然很难看) ,前提是p和p0指向同一数组中的对象

我仍然不明白为什么p0是偏移?我会说p是你的Polygon的地址,而p0是第一个多边形的地址......我误解了什么吗?

答案 1 :(得分:2)

鉴于指针指向“内部标识符”,我认为您不能对存储在其中的实际值做出任何假设。如果指针可以指向堆,您可能只是看到一组可能的值,并且它将在未来巧妙地(或明显地)中断。

为什么不创建PolygonType* - &gt;的一次性反向映射? index并使用它?