如何正确解除引用typedef数组指针?

时间:2017-06-15 19:19:16

标签: c++ pointer-arithmetic

我正在使用第三方代码,其类型定义为:

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是从其他数组中获取的。我想我在这里使用错误的指针算法,但无论如何,都无法弄明白。这种类型的确对我来说真的很新,而且我不知道 - 可能会发生什么?

1 个答案:

答案 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::arraystd::vector)可以避免大部分麻烦。