[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。