如何正确取消引用 typedef 数组指针?

How to dereference typedef array pointer properly?

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

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 是从其他数组中获取的。我想我在这里使用了错误的指针算法,但无论如何,都无法弄清楚。这个 typedef 对我来说真的很新,我不知道 - 可能有什么问题?

这是对Operator Precedence的误解造成的bug。运算符具有应用它们的顺序。这类似于数学中的运算符优先级,例如,乘法比加法具有更高的优先级。 operator*(取消引用运算符)的优先级低于 operator[](下标运算符)。这意味着表达式 *(mData)[2] 被解析为 "dereference the third element at pointer mData"。第三个元素大概是一个包含 3 个浮点数的数组(如果你没有超出 mData 指向的数组的边界)。然后取消引用结果数组。取消引用数组会为您提供该数组中的第一个元素。本质上,您是在一遍又一遍地获取不同标记的第一个元素。您可以使用括号更改优先级。请尝试 (*mData)[0]。这将首先强制取消引用您的指针,为您提供 floats 数组,然后使用下标运算符通过索引访问该数组。

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 and std::vector