我正在使用第三方代码,其类型定义为:
typedef float MarkerData[3];
稍后在代码中,我将此标记位置数据的数组引用为:
MarkerData* Markers;
我正在使用此代码来迭代此数组:
for (int32 s = 0; s < totalMarkers; s++)
{
MarkerData* mData = (Markers + s);
markerPosition.X = *(mData)[0];
markerPosition.Y = *(mData)[1];
markerPosition.Z = *(mData)[2];
}
代码不会崩溃,但浮点值会混合。从调试我可以看到,我在每次迭代时都正确获得了markerPosition.X值,但Z和Y是从其他数组中获取的。我想我在这里使用错误的指针算法,但无论如何,都无法弄明白。这种类型的确对我来说真的很新,而且我不知道 - 可能会发生什么?
答案 0 :(得分:2)
这是由于对Operator Precedence的误解造成的错误。操作员有一个应用它们的顺序。这类似于数学中的运算符优先级,例如,乘法具有比加法更高的优先级。 operator*
(解除引用运算符)的优先级低于operator[]
(下标运算符)。这意味着表达式*(mData)[2]
被解析为“取消引用指针mData
处的第三个元素”。第三个元素可能是一个包含3个浮点数的数组(如果你没有超过mData
所指向的数组的边界)。然后取消引用生成的数组。取消引用数组会为您提供该数组中的第一个元素。实质上,你一遍又一遍地取出不同标记的第一个元素。您可以使用括号更改优先级。请尝试使用(*mData)[0]
。这将强制首先取消引用您的指针,为您提供float
的数组,然后通过索引使用下标运算符进行访问。
for (int32 s = 0; s < totalMarkers; s++)
{
MarkerData* mData = (Markers + s);
markerPosition.X = (*mData)[0];
markerPosition.Y = (*mData)[1];
markerPosition.Z = (*mData)[2];
}
使用适当的c ++容器(例如std::array
和std::vector
)可以避免大部分麻烦。