1. 程式人生 > >陣列的由來和為什麼陣列下標從0開始?

陣列的由來和為什麼陣列下標從0開始?

本文索引:

1.陣列的由來:

// 變數宣告
int a = 1;
int b = 2;
int c = 3;
int d = 4;
...
int n = 20;

// 一個int型別4個位元組,一個位元組佔8位

a.字面引申:

看到上面的這些int資料,都是int型別,有人就想,既然都是一種型別,為什麼不能把他們放在一起?用一個變數接收就行了,每一次還要取一個名字,特別麻煩!!

b.通俗解釋:

假設你是導遊,站在你面前的是20個人,10個男的,10個女的;
a:有一男想上洗手間,你會說去吧,左走有一個叫光天化日的洗手間!
在這裡插入圖片描述
b:有一女想上洗手間,你會說去吧,右走有一個叫月黑風高的洗手間!
在這裡插入圖片描述
c:大家都要上洗手間,你要是每個人都給指定一個洗手間,顯然,20個洗手間,出現在你的面前,恐怕可以申請吉尼斯世界紀錄了!!!

既然不可能都給每個人指定一個洗手間,讀者和導遊都知道怎麼做了吧?
導遊:男往洗手間左走,女往洗手間右走

假設:int
a,b,c,d…x 對應的是洗手間的名稱
1,2,3,4…20 對應在座的20個人

現在不分洗手間了,只分男女!按型別來分類
有陣列的話:現在可能只需要一個洗手間或者兩個洗手間

int [] a = {1,2,3,4,5,6,7,8,9,10}   // 男洗手間
int [] b = {11,12,13,14,15,16,17,18,19,20}   // 女洗手間

陣列的特點:

1.同類型元素
2.固定大小(洗手間的位置有限)

位置有限,那麼array當然得順應民意出來咯,畢竟陣列的複製沒那麼容易,解決問題也是不怎麼方便!!

2.陣列下標為什麼從0開始:

int[] a = new int[5];

a.初步理解:

a.上面的int陣列申請5片連續的空間地址,就像盜墓的機關門一樣,連續的!
b.盜墓的機關門,先看見第一個門,然後才能見到另一扇門,陣列的空間和機關門類似,如圖:
在這裡插入圖片描述

c.第一扇門,為了記住門,不迷路,於是你給門上弄了一個1001的門牌號:1001門開了
d.你進入1001這扇門之後,1001自己關上了,於是你看到另外一扇門,為了記住自己走過多少門,於是你講這扇門記為:
1002 = 1001 + 1,
類推:
1003 = 1001 + 2,
1004 = 1001 + 3,
1005 = 1001 + 4,
那麼:第一道門不就是
1001 = 1001 + 0,
好傢伙,闖機關門的你發現了規律,下次只要遇到機關門,那麼
int[0] 不就是第一道門1001嗎?都不用再花心思去寫什麼1001,1002…了
同樣的:其他型別的陣列
在這裡插入圖片描述
假如:1,2,3,4,5,6各位不同類的機關(每條線代表),每個機關都有機關門的話,你是不是還要分別取名字?
假設例如:
1號:int型別機關,取1001,1002各代表第一扇門、第二扇門
2號:string型別機關,取2001,2002,2003各代表第一扇門、第二扇門、第三扇門
多麼麻煩,取名字麻煩,索性按照發現的規律,int[0],string[0],節約了取名字的時間和空間!!

b.加深理解:

int[0] = 100;
int[2] = 200;

//int 佔4個位元組

既然在陣列的建立時,陣列小標為0的好處體現了,那麼存值,取值的時候呢?:
在這裡插入圖片描述
計算儲存值的時候:
a.找到第一個位元組格子,包含第一個格子然後向下,再找3個格子,就是四個格子,存放數值:100
int[0] = 100; 等價於: 2001 = 2001 + 0 * 4
int[2] = 200; 等價於: 2009 = 2001 + 2 * 4
存值也是一樣的道理!!
取值:位元組格子也是一樣
int[0]的位置不就是就是2001嗎?
你也告訴計算機你的位置是0了,int型別,那麼:
int[0]: <<==>> int[0] = int[0] + 0 * 4 = 200

怎麼看,不還是不用給房間命名了?還有一點呢,int[0] 中[0],中括號中的0 也正好是0 * 4中的0啊!!

希望讀者能有收穫,理解不對的地方多多指教!留言區歡迎您!