2013-08-07 80 views
0

有什麼特別的原因嗎?我知道這就是這種語言的寫法,但我們不能改變它嗎? 如果索引從1開始,我們會面臨什麼樣的挑戰?爲什麼數組的索引/列表不以1開頭?

+3

您忘了選擇此語言的Eiffel,Smalltalk和序言。 – WhozCraig

+6

[爲什麼要編號從零開始:Dijkstra算法(http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF) –

+1

爲什麼它不與-1開始? – BenDundee

回答

6

出於歷史原因,以及與數組如何在內存中「製造」有關的原因。

在C中,數組是一塊內存(在其大小上具有編譯器級別的一些信息)。你有一個指向它的第一個元素的指針(一個引用)。要進入它的第二個元素,你可以做

int array[10]; // your array 

int *p = array; // reference to first element of array 
int *q = p + 1; // reference to second element of array 
int *r = p + 2; // reference to third element of array 

顯然,對於對稱:

array[0] // reference to first element of array 
array[1] // reference to second element of array 
array[2] // reference to third element of array 

C的[x]運營商實際上是在編譯爲array + x

你看?數組在C中是「基數0」。因此在許多其他語言中它是相同的。現在,C++的根源在C,Java有它的根源在C++和其他語言,C#的根源在C++,Java和其他語言中......同一棵樹。

基本顯然是另一個樹:-)

+0

偉大的,你提到「在許多其他語言」,因爲基於0的指數不是一個石頭法律graven。 – Hyperboreus

+1

事實上,在這個問題所有的語言都對C. – thagorn

+0

的頂部,但在'Matlab'從指數'1' :) –

3

的基本原因後面它是計算機在至極任何變量的第一部分記得地址/對象被存儲。所以這個指數代表了這個和你要找的東西之間的「距離」,所以第一個是0,第二個1 ...

1

的一件事是,你可以參考和使用指針導航陣列。事實上,數組操作會衰減到後端的指針運算。

假設你想達到的陣列的nth元件這時可以簡單地做(a + n)其中a是一個數組(1維)的基地址,但是,如果下標開始於1然後到達nth元件你必須一直做(a + n -1)

這是因爲僅僅通過取一個數組的名字就可以知道它的起始元素的地址,這是最簡單的方法!

2

在C和C++中,數組索引是用於解引用偏移指針的語法糖。即, array[i]相當於*(array + i)。指針指向內存塊的開始是有意義的,這意味着數組的第一個元素需要爲*array,這只是array[0]

相關問題