我是 C++ 新手,偶然发现了这种用我不完全理解的指针计算数组长度的方法。我到处看了看,但似乎无处解释它是如何工作的,我只是听说它应该是计算数组长度的一种不好的方法,但为什么会这样以及它是如何工作的?
代码如下所示:
int array[4] = [0, 1, 2, 3]
//...
int length = *(&array + 1) - array
据我尝试,它似乎确实有效,但我不完全明白为什么。我知道一点指针逻辑,但这个语句对我来说似乎很奇怪,因为你实际上是在获取数组的地址(我想是第一个元素)并向其中添加一个(我可以想象这会给你地址在最后一个元素之后,但我不明白你为什么要取消引用它)。最让我困惑的是,这一切都被数组本身减去了吗?!没有索引或任何东西。
如果有人能够向我解释这一点,以及为什么它应该是坏的,那真的很有帮助。
谢谢。
最佳答案
&array
这是一个指向对象array
的指针。它是一个数组类型的奇异对象。
&array + 1
向指针添加数字会生成指向对象数组中对象的连续兄弟的指针。加 1 产生下一个兄弟。出于此指针算法的目的,单个对象被视为单个对象的数组。因此,加 1 是允许的,它会在图形数组的末尾产生一个指针。
*(&array + 1)
严格来说,这通过一个指针间接传递到末尾,并且可能会认为程序的行为是未定义的。
但让我们假设这不是问题。间接操作在数组后面的地址处为(不存在的)对象生成一个左值。
*(&array + 1) - array
这里,减法的操作数是数组的左值。一个是实际数组,另一个是假设的数组数组中的假设兄弟元素。在这种情况下,这些数组隐式转换为指向相应数组第一个元素的指针。
从技术上讲,转换后的指针之间的减法是未定义的,因为它们是指向不同数组元素的指针,因此可以说程序的行为未定义还有另一个原因。
但让我们假设这不是问题。将指向同一数组的两个元素的指针相减的结果产生了元素的距离。相邻数组的第一个元素之间的距离正好是第一个数组的元素个数。
why it's supposed to be bad exactly.
请注意前面部分中提到程序行为未定义的部分。这很糟糕。
另外,您在理解它的作用时遇到了问题。这很糟糕。
获取数组大小的推荐方法是使用 std::size(array)
。
关于c++ - 这种计算数组长度的方法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72198985/