C 负数组索引

新手上路,请多包涵

我分配了一个包含 3 个元素的 int 数组,并想到了下面的代码:

 int a[3];
for(int i = -2; i < 3; ++i){
    a[i] = i;
    cout<<a[i]<<" ";
}

这是它的输出:

 -2 -1 0 1 2

看起来数组 a 有 5 个分配空间,而 a 位于这些空间的中间。有任何想法吗?

原文由 user8600953 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

要解释负索引是如何工作的,您首先必须了解(或记住)对于任何数组或指针 a 和索引 i ,表达式 a[i]*(a + i)

这意味着您可以有一个指向数组中间元素的指针,并将其与正或负索引一起使用,这是简单的算术。

例子:

 int a[3] = { 1, 2, 3 };
int* p = &a[1];  // Make p point to the second element

std::cout << p[-1];  // Prints the first element of a, equal to *(p - 1)
std::cout << p[ 0];  // Prints the second element of a, equal to *p
std::cout << p[ 1];  // Prints the third element of a, equal to *(p + 1)

从图形上看,它可以看起来像

+-----+------+------+
|一个[0] |一个[1] |一个[2] |
+-----+------+------+
^ ^ ^
| | |
p-1 p p+1


现在,当在数组中使用负索引时,如问题中的 a 示例,它将是这样的:

+-----+-------+--------+------+------+------+
| ... |一个[-2] |一个[-1] |一个[0] |一个[1] |一个[2] |
+-----+-------+--------+------+------+------+

也就是说,这里的负索引将 _超出数组的范围_,并会导致 _未定义的行为_。

原文由 Some programmer dude 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题