【问题标题】:Why does array-size declaration use "1" as the first index?为什么数组大小声明使用“1”作为第一个索引?
【发布时间】:2014-03-19 16:10:21
【问题描述】:

我注意到关于 C#/Java 的一点是(目前对我而言)数组大小声明和数组大小的默认第一索引似乎不一致的问题。

在处理数组时,假设您要创建一个新的整数数组大小3,它看起来像这样:

int[] newArray = new int[3] {1, 2, 3};

完全找到并且可读...对吗?

编程语言的标准似乎规定“第一个”索引是0

使用这个逻辑,如果我有兴趣创建一个大小为3 的数组,我真的应该这样写:

int[] newArray = new int[2] {1, 2, 3};

等一下.. VS 抛出一个错误,说an array initialize of length 2 is expected

那么循环数组中的第一个索引和数组大小声明有不一致的地方吗?前者使用基于0-th 的索引,第二个使用1-th 索引。

这不是以任何形式或方式破坏游戏/改变,但我真的很好奇为什么这里存在差异,或者地狱,如果这甚至是一个问题(就像我说的,这不是游戏破坏无论如何,但我很好奇为什么会这样做)。

我现在可以想到为什么要使用基于1-th 的索引:

在 for 循环中,您将使用 < newArray.Length 而不是 < newArray.Length - 1< newArray.Length

Lists 合作了一段时间,然后回到 size-needs-to-be-declared-arrays 让我有点措手不及。

【问题讨论】:

  • 如果你使用静态数组初始化器,你甚至不必声明长度:new int[] { 1, 2, 3 }
  • 无意冒犯,但我认为您并没有真正考虑到这一点。长度不是任何类型的索引,既不是从 0 也不是从 1。
  • 你没有看错——我绝对没有看到长度和索引之间的区别,我很高兴这篇文章可以澄清它。
  • 在@harold 所说的后面加上许多花哨的话,你会混淆cardinal numbers and ordinal numbers
  • 如果你想要一个边界为 [-15, -5] 的数组,你应该用 -5 个元素创建它吗? :) (不是每种语言都强制使用基于 0 的索引,即使是 .Net 一次 - 请查看 stackoverflow.com/questions/1301276/…

标签: c# java arrays


【解决方案1】:

因为您是用 number 个它将包含的元素声明数组。

我不确定这是否不一致。

你需要锯多少次才能将原木切成 3 块?提示:不是 3 次。

还要注意您在帖子标题中如何错误地将数组大小声明称为“索引”。

【讨论】:

  • 简短但很棒
  • 这是一个有趣的类比。
  • 然而,这个类比似乎与这一点相反。还是不错的答案。
  • 是的,我将大小声明与索引混淆了。我以为它们是~大体上一样的东西哈哈!
【解决方案2】:

我认为您将索引器与长度混淆了。你想在你的数组中保存三个元素(或变量),用

表示
...new int[3]...

大括号中的元素是值,不是索引。索引仍然是从 0 开始的。长格式看起来像这样:

int[] newArray = new int[3];
        newArray[0] = 1;
        newArray[1] = 2;
        newArray[2] = 3;

因此,您可以看到从零开始的索引与 int[] 的值相关的位置。

【讨论】:

  • 很高兴为您提供帮助。将其标记为答案将不胜感激。
  • 布局合理且具有指导意义。 +1
【解决方案3】:
int[] newArray = new int[2] {1, 2, 3};

在英语中,这会将您翻译为“我想要一个可以容纳 2 件物品但可以放入 3 件物品的容器”。您将数组的 length (它可以容纳多少个项目)与 index 混淆到数组中,该数组在基于 C 的语言(例如 C , C++, C#, Java, Javascript, Swift)。

另外,考虑一下数组索引到底是什么(至少对于像 C 这样的低级语言);它是数组变量基地址的内存偏移量。所以arr[n] 转换为“获取arr 的地址,在内存中提前n * (the size of my type) 字节,然后给我计算出的地址处的值。所以当n = 0 时,你引用的是基本内存地址处的值(数组的开头)。

【讨论】:

  • 我是要去询问 Java 是否真的被认为是一种基于 C 的语言,但是用谷歌搜索,发现我对真正的 C 基础语言的看法真的很短视......( see this)
  • 对于那些对基于 0 的索引感到困惑的人来说,第二段可能是他们需要学习和理解的内容。
【解决方案4】:

Wim Hollebrandse 提供的答案绝对很棒且正确,但希望对其进行一些扩展,以让 OP 更了解为什么大多数(但不是所有)语言中的索引都以 0 开头。

正如 Wim 所说,在声明时,它是一个数组中将存储多少个元素,这对于人类理解来说是很容易理解的。令许多人感到困惑的是为什么第一项实际上被称为第 0 项(即索引 0)......其原因是在数组中找到查找的元素所需的简单数学。

数组中的所有元素都按顺序存储在连续块中。例如,如果数组位于地址 100 并保存整数(每个整数大小为 4 个字节),那么在查找第一项时,它将位于数组的开头,即地址 100。第二项将在第一个之后立即存储,或 100+4=104 地址。第 3 项存储在第 2 项之后或地址 108。

所以要计算第i个元素的位置,如果索引以0开头,数学很简单:

I-th-address = address_of_array + I * sizeof(datatype)
e.g. for our example it is 100 + i * 4

如果索引以 1 开头,则数学需要更多操作:

Ith-address - address of array + (I-1) * sizeof(datatype)

...这比基于 0 的效率低且不必要。

【讨论】:

    【解决方案5】:

    您将数组的声明与数组元素的请求混合在一起。在声明数组时,您指定数组的 length(元素数),这是正确的 3。当你请求一个元素时,你指定索引,第一个索引是0。但你不应该混合索引和数组的长度。

    在for循环中,你应该取< newArray.Length:如果你的长度为3,那么循环将从0开始,经过索引0、1和2。然后它停止,因为3不是

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 2011-07-14
      • 1970-01-01
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多