為什麼索引值從 0 開始算?

為什麼索引值從 0 開始算?
credit: Laurynas

有沒有想過為什麼我們學的數學是從 1 開始算,但好像大部份比較主流的程式語言的陣列包括 Python 的串列,索引值卻是從 0 開始的?因為這是因為陣列的索引值並不是指向元素本身,比較像是記憶體位置的「偏移量」。

假設有一個陣列像這樣:

chars = ['a', 'b', 'c', 'd']

當我們說「變數 chars 指向 ['a', 'b', 'c', 'd'] 陣列」的時候,並不是 chars 這個變數直接指向這一整個陣列,而是 chars 變數指向這個陣列的「起始位置」,更精準的說是記憶體位置。陣列在記憶體裡的位置跟門牌號碼一樣都是連號的,假設這個陣列的起始記憶體位置是 1450,然後每個元素所佔的位置或說格子的大小我就先隨便假設是 8(先不管單位跟以及為什麼是 8)。大概示意圖如下:

為什麼索引值從 0 開始

這樣的話,你認為要怎麼取得第一個元素的 a 字元?不就是指向 1450 的位置就拿到了嗎?(你也可以說是從 14501458 這一塊空間)。

我們現在知道怎麼拿第一個元素了,接著要怎麼拿第二個?其實只要知道第一個元素的位置再搭配簡單的數學加法跟乘法就能算出來了:

起始位置 + (1 x 8) = 1458

同理可證,第三個、第四個直到第 N 個元素就能推導出計算公式:

起始位置 + (N x 8)

到這裡,大家有看出來上面公式裡的 N,剛好就是等於我們平常在講的索引值嗎?所以索引值其實就是記憶體位置的「偏移量」,因此才會從 0 開始算。

所以陣列索引值從 0 開始的概念從滿早期的程式語言開始就有了,大家用著用著也習慣了,Python 以及其它程式語言也都受到影響,所以 Python 的串列索引值也跟是從 0 開始算。

事實上,也不是所有程式語言的索引值都是從 0 開始算的,不同的程式語言對這件事有不同的觀點,像程式語言 LuaFortranCOBOLJuliaR 語言等都是從 1 開始算的,也許在他們的觀點來看,chars[1] 就是第一個或第一欄,看起來更簡單、直覺。

工商:想學 Python 嗎?我教你啊!

想要成為軟體工程師嗎?這不是條輕鬆的路,需要有足夠的決心、設定目標並持續學習,我們的 ASTROCamp 軟體工程師培訓營提供專業的前後端課程培訓,幫助你在最短時間內建立正確且扎實的軟體開發技能,有興趣而且不怕吃苦的話不妨來試試看吧 :)