【问题标题】:Array boundaries and indexes数组边界和索引
【发布时间】:2010-02-11 22:28:56
【问题描述】:

我有一个较早的帖子link text有人说我的指针初始化到了错误的元素,我不太明白为什么,除了他们是正确的并且它可以与他们的更正一起使用。所以这是基本问题:

如果我声明一个从 0 到 30 的数组

#define ENDPOINT 15
int record[2 * ENDPOINT + 1];
// and want a pointer to be at the middle of the array, so 0 is at the middle, and
// +15 is at 30, and -15 is at 0
// why is int *ptr = &record[ENDPOINT + 1] wrong?  why is the correct declaration
int *ptr = &record[ENDPOINT];

因为如果我将 ptr 放在 &record[ENDPOINT] 处,这意味着记录数组中的第 15 个条目是第 14 个索引,然后添加 15 将只有 29 对吗?谢谢!

【问题讨论】:

  • 这里不要使用宏。使用const int ENDPOINT = 15;enum { ENDPOINT = 15 };

标签: c++ arrays pointers


【解决方案1】:

record[ENDPOINT] 是第 16 个元素 - 数组的索引从 0 开始,所以 record[0] 是第一个元素,record[1] 是第二个元素...而 record[ENDPOINT](是 record[15])是第 16 个元素元素。

您的数组中有 2*15+1 或 31 个元素。将 14 添加到 ENDPOINT (15) 得到 29,record[29] 是数组中的第 30 个元素。 record[30] 将是数组中的最后一个或第 31 个元素。

【讨论】:

    【解决方案2】:

    因为如果我将 ptr 放在 &record[ENDPOINT] 处,这意味着记录数组中的第 15 个条目,即第 14 个索引

    没有。

    它表示record[15] 处的条目 - 换句话说,第 15 个索引。

    【讨论】:

      【解决方案3】:

      数组索引从零开始,所以record[ENDPOINT] 是第 15 个索引,也就是数组中的第 16 条记录。集合 [0, 15](含)包含 16 个数字。

      【讨论】:

        【解决方案4】:

        基本上,如果您想指向确切的中间,您希望有一个元素可以指向——这就是定义中的 +1。

        这是一张图片:

        123456789012345 x 543210987654321

        由于数组是基于 0 而不是基于 1,因此您有:

        012345678901234 x-1 432109876543210

        【讨论】:

          【解决方案5】:

          不,&record[ENDPOINT] 表示第 16 个条目,因为 &record[0] 是第一个,&record[1] 是第二个,依此类推。

          【讨论】:

            【解决方案6】:

            我的回复没有回答你的问题;相反,我想添加一个最佳实践。如果您在搞乱数组索引,并且您真的不能 100% 确定您是否正确并且您使用的是 VC++ 2008 或更高版本,请使用 /RTC1 编译代码,这将执行运行时检查以使确保您正确访问数组边界。

            基本上,如果运行时检测到您已经超出了数组边界,您的应用程序将终止,并以对违规代码的良好堆栈跟踪来终止。

            这是一个救生员。相信我!

            【讨论】:

              【解决方案7】:

              Nope record[30] 表示正好 30 条记录,从 0 开始

              【讨论】:

              • 他在做record[31],总共有 31 个条目,索引从 0 到 30,正如 OP 所说。
              猜你喜欢
              • 1970-01-01
              • 2018-04-17
              • 2014-05-04
              • 1970-01-01
              • 2023-01-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多