以非零索引开头的数组的目的是什么?

时间:2011-01-14 13:45:51

标签: arrays programming-languages

我试图找到答案,但我得到的是如何实现以非零索引开头的数组的答案。某些语言(例如pascal)默认提供此功能,例如,您可以创建一个数组,例如

var foobar: array[1..10] of string;

我一直在想:你为什么要让数组索引不以0开头?

我想初学者可能更熟悉数组以1开头而最后一个索引是数组的大小,但从长远来看,程序员应该习惯于从0开始的值。

我能想到的另一个目的:在某些情况下,索引实际上可以代表相应数组条目中包含的内容。例如,您希望获得数组中的所有大写字母,将索引作为相应字母的ASCII代码可能很方便。但它很容易减去一个常数值。在这个例子中,您可以(在C中)简单地执行这样的操作,获取所有大写字母并使用ascii-code 67访问该字母:

#define ASCII_SHIFT 65
main()
{
    int capital_letters[26];
    int i;
    for (i=0; i<26; i++){
        capital_letters[i] = i+ASCII_SHIFT;
    }   
    printf("%c\n", capital_letters[67-ASCII_SHIFT]);
}

此外,如果您想通过某种键访问条目,我认为您应该使用哈希表。

有人可能反驳:为什么索引始终以0开头?嗯,这种方式很简单。当你在声明一个数组时必须输入一个索引时,你会更快。此外,您始终可以确保第一个条目是数组[0],最后一个条目是数组[length_of_array-1]。其他数据结构通常以0开头也很常见。例如,如果您读取二进制文件,则从第0个字节开始,而不是第一个字节。

现在,为什么有些编程语言有这个“功能”,为什么有些人会问如何用C / C ++这样的语言实现这个?有没有一种情况,以非零索引开头的数组更有用,甚至,从0开始的数组无法完成某些事情?

2 个答案:

答案 0 :(得分:2)

如果您的索引意味着什么,例如来自数据库或其他类似的id,然后它很有用。

哦,你不能使用哈希,因为你想将它与其他需要数组的代码一起使用。

例如,Rails复选框。它们作为数组从Web表单传递,但在我的代码中,我想访问udnerlying数据库对象。数组索引是id,et voila!

答案 1 :(得分:1)

基于非零的数组是具有非整数的序数索引的数组的自然扩展。在Pascal中,您可以使用以下数组:

var
  letter_count : array['a'..'z'] of integer;

或者:

type
  flags = (GREEN, YELOW, RED);
var
  flags_seen = array[flags] of boolean;  

经典是具有负索引的数组:

zero_centered_grid = array[-N..N,-N..N] of sometype;

这个想法是:

  • 如果索引声明更具体,则可以在编译时检测到许多索引错误。
  • 当最小索引与零不同时,一些算法(堆积之脑)会有更清晰的实现。

只有从零开始的数组的语言使用定义明确的后者,并为其余语言高效实现字典/地图。