[Powered by Google Translate] 讓我們談論陣列。
那麼，為什麼我們要使用陣列嗎？
那麼讓我們說你有一個程序，需要存儲5個學生證。
這可能似乎是合理的，有5個獨立的變量。
我們會看到在一個位的原因，我們會從0開始計數。
的變量，我們就必須將int ID0，詮釋ID1，等等。
我們想要執行的任何邏輯上學生證需要進行複製和粘貼
這些學生的ID。
如果我們要檢查學生發生在CS50，
我們首先需要檢查，如果ID0代表學生的過程中。
然後做同樣的學生，我們需要的代碼複製並粘貼ID0
替換所有出現ID0 ID1等ID2，3和4。
>> 只要你聽到了，我們需要複製和粘貼，
你應該開始想有一個更好的解決方案。
現在，如果你知道你不需要5個學生證，而是7？
您需要返回到源代碼中添加一個ID5，ID6，
複製並粘貼的邏輯檢查，如果屬於這2個新的ID類的ID。
有沒有所有這些ID連接在一起，所以是沒有辦法的要求
程序做到這一點的ID 0到6。
現在好了，你知道你有100個學生證。
它開始似乎不太理想，需要單獨聲明這些ID，
複製並粘貼這些新的ID任何邏輯。
但是也許我們有決心，我們做的所有100名學生。
但是，如果你不知道有多少學生實際上是什麼？
只是一些有n個學生，你的程序有問什麼，n是用戶。
嗯哦。這是行不通的，非常好。
你的程序只適用於一些固定數量的學生。
>> 解決所有這些問題，是美麗的數組。
那麼，什麼是數組？
在一些編程語言中數組類型可能是能多做一點，
但在這裡，我們將重點放在數組的基本數據結構，就像你會看到它在C.
數組是一個大的內存塊。就是這樣。
當我們說我們有10個整數的數組，這只是意味著我們有一些塊
的內存是大到足以容納10個獨立的整數。
假設一個整數是4個字節，這意味著有10個整數的數組
是一個連續的塊的40個字節在內存中。
即使當您使用多維數組，我們不會在這裡，
它仍然只是一個大的內存塊。
多維符號只是為了方便。
如果你有一個3×3的多維數組的整數，
那麼你的程序會真的只是把這個作為一個大的塊36個字節。
整數的總數是3次3，和每個整數佔用4個字節。
>> 讓我們來看看一個基本的例子。
在這裡我們可以看到兩種不同的方式聲明數組。
我們不得不評論1編譯的程序
因為我們聲明x的兩倍。
我們就來看看一些之間的差異，這2種類型的聲明中位。
這些線路都聲明一個數組的大小為N，
在這裡我們定義N為10。
我們可以要求用戶為一正整數
及使用上，作為我們的數組中的元素數目的整數。
像我們的學生ID的例子之前，這是一種像宣布10完全獨立的
虛變量; X0，X1，x2和等xN的-1。
忽略我們聲明數組的行，注意方括號不變
在fo​​r循環內。
當我們寫的東西，比如x [3]，我只是讀為x支架3，
你能想到它是這樣要求的虛X3。
比與大小為N的括號內的數目，這意味著，一個數組的通知
我們稱之為索引，可以是任何東西，從0到N-1，
這是一個總的N個索引。
>> 要想想如何實際工作
請記住，數組是一個大的內存塊。
假設一個整數是4個字節，整個數組x是一個40字節的內存塊。
所以，X0是指非常的塊的第一個4字節。
X [1]是指在接下來的4個字節，等等。
這就是說，開始的x是所有的程序都需要來跟踪。
如果你想使用x [400]，然後程序就知道，這相當於
後僅1600字節x的開始。
在哪裡，我們得到1600個字節？這是只有400次4個字節的整數。
>> 在繼續之前，它是非常重要的實現，在C
在陣列中使用的索引，我們沒有強制執行。
我們的大的塊是只有10個整數長，但絕對不會罵我們，如果我們寫X [20]
甚至是X [-5]。
該指數甚至不必須是一個數字。
它可以是任意表達式。
在該方案中，我們使用變量i的循環索引數組。
這是一個非常常見的模式，循環從i = 0到該陣列的長度，
然後使用i作為指數為陣列。
這樣你整個陣列的有效循環，
，你可以指定數組中的每一個點，或者用它來進行一些計算。
>> 在第一個for循環中，我從0開始，
所以它會分配到0點的數組中的值0次2。
然後，我的增量，和我們指定的第一點在數組中的值1倍，2。
然後，我的增量再等等，直到我們就到了指定的位置N-1陣列中的
值N-1倍，2。
因此，我們創建了一個數組的第一個10個偶數。
也許埃文斯會是一個更好的變量名比x，
但這樣做東西拿走。
第二個for循環，只打印出的價值，我們已經存放在裡面的數組。
>> 讓我們嘗試運行的程序與這兩種類型的數組聲明
看看該程序的輸出。
據我們可以看到，程序的行為同樣的方式為兩種類型的聲明。
讓我們也來看看會發生什麼，如果我們改變了第一循環不停止在N
而是說10,000元。
超出了數組末尾的途徑。
哎呀。也許你已經看到了這一點。
一個分割錯誤意味著你的程序崩潰。
你會開始看到這些，當你觸摸你不應該接觸的內存區域。
在這裡，我們都在觸摸開始的X超過一萬個名額，
這顯然是在內存中，我們不應該接觸的地方。
所以，我們大多數人可能會不小心把10,000，而不是N，
但如果我們做一些更微妙的像說寫小於或等於N
在fo​​r循環中的條件，而不是小於N。
請記住，一個數組只具有從0到N-1的索引，
這意味著，索引N超出陣列的結尾。
在這種情況下，該程序可能不會崩潰，但它仍然是一個錯誤。
其實，這個錯誤是很常見的，它有它的自己的名字，
關閉1個錯誤。
>> 這是它的基本知識。
那麼，什麼是2種類型的數組聲明的主要區別？
一個區別是大的內存塊。
在第一個聲明，我會打電話給支架數組類型，
雖然這絕不是以往的名稱，
它會在棧上。
而在第二，我會打電話給指針數組類型，它會在堆上。
這意味著，當函數返回時，支架陣列會自動被釋放，
而你必須explicitily撥打免費的指針數組
否則，你有內存洩漏。
此外，在托架陣列實際上是不是一個變量。
這是很重要的。這只是一個符號。
你可以認為它是一個常量，編譯器供您選擇。
這意味著，我們不能做什麼，比如x + +的支架類型，
雖然這是完全合法的指針類型。
>> 指針類型是一個變量。
對於指針類型，我們有2個獨立的內存塊。
該變量x自身被存儲在堆棧中，並只是一個單一的指針，
但大的內存塊存儲在堆中。
只是存儲在堆棧中的變量x的地址
大的堆內存塊。
這方面的一個含義是與運營商的規模。
如果你問的支架數組的大小，它會給你的大內存塊的大小，
像40字節，
但如果你問的指針類型的數組的大小，
它會給你變量x本身，而在設備上可能只有4個字節的大小。
使用指針數組類型，它是不​​可能直接要求
大的內存塊的大小。
這是沒多大的限制，因為我們很少想的大小
大的內存塊，如果我們需要的話，我們通常可以計算出它。
>> 最後，支架陣列恰好為我們提供的快捷方式初始化數組。
讓我們看看我們如何可以寫第一個使用快捷鍵在實例10個偶數。
指針數組，有沒有一種方法可以做到這樣的快捷方式。
這僅僅是你可以做什麼與陣列的介紹。
他們出現在幾乎每一個程序，你寫的。
希望你現在可以看到一個更好的方式做學生證的例子
從一開始的視頻。
>> 我的名字是羅布·波頓，這是CS50。