>> [音樂播放]
DOUG LLOYD：好吧。
單工作 變量是蠻好玩的。
但是，如果我們想要什麼工作 有很多變數，
但我們不希望有一堆 不同的名字到處亂飛我們的代碼？
在這種情況下，數組是 要來非常方便。
數組是一個真正的基礎數據 結構任何編程語言
你會使用。
他們是真的，真的很有用， 特別是，正如我們所看到的，在CS 50。
>> 我們使用數組來保存 同一數據類型的值
在連續的存儲單元。
這就是說，它是一個 這樣我們就可以組
一堆整數在一起 內存或一串字符
或者在內存中漂浮真的 併攏工作
與他們，而不必給每個 它的一個自己獨特的名稱，它可以
獲得過一小會兒繁瑣。
>> 現在，一種方式來類推陣列 是考慮當地郵局
辦公室一秒鐘。
因此，從編程一步之遙 而只是閉上眼睛
和可視化在你的心中 您當地的郵局。
通常，在大多數崗位 辦公室，有一個大的銀行
一個郵政信箱在牆上。
>> 數組是一個巨大的塊 連續內存，
相同的方式，一個郵件 在郵政銀行
是在一個大的空間 牆上的郵局。
陣列被劃分成小的， 相同的空間大小的塊，
其中的每一個叫做一個元件，在 同樣的方式，該職位的牆
辦公室已經被劃分成小的， 相同的空間大小的塊，
我們稱之為一個郵政信箱。
陣列的每個元素可以 存儲一定量的數據，
就像每個郵政信箱能 持有一定量的郵件。
>> 什麼可以存儲在的每個元素 該陣列是相同的數據的變量
類型，如int或字符，只 就像在你的郵政信箱，
你可以只適用的東西 相似類型的，
如字母或小包裝。
最後，我們可以訪問的每個元素 數組直接索引號，
正如我們可以訪問我們的郵局 通過了解其郵箱號碼框中。
我們希望，這個比喻 幫助你得到你的頭
圍繞陣列的想法 類比到別的
你可能 已經熟悉了。
>> 在C語言中，數組的元素 索引從0開始，而不是從1。
這是非常重要的。
而事實上，這就是為什麼我們在CS 50， 為什麼計算機科學家頻繁
會從0計數，是 因為C的數組
索引，它總是從0開始。
因此，如果一個數組由n個元素， 該數組的第一元素
位於索引0， 所述陣列的最後一個元素
位於索引n減去1。
此外，如果有n個元素我們 陣，最後的指數為n減1。
>> 所以，如果我們的陣列有50個元素，在 第一元件被設在索引0，
和最後一個元素 位於指數49。
遺憾的是，還是幸運的是， 這取決於你的觀點，
C是非常寬鬆這裡。
它不會阻止你 走出去陣列的界限。
你可以訪問減 你的數組的三要素
或者你的數組的第59件， 如果你的數組只有50個元素。
它不會停止你的程序 編譯，但在運行時，
你可能會遇到一個 可怕的分段錯誤
如果你開始訪問內存 這是一個什麼樣的邊界之外
你問你的程序給你。
所以千萬要小心。
>> 什麼數組 聲明是什麼樣子？
我們如何編寫一個數組存在 就像我們代碼的任何其他變量？
有三個部分到一個數組 declaration--一個類型，名稱，
和一個大小。
這是非常相似的一個 變量聲明，這
僅僅是一個類型和名稱， 大小元素是
的特殊情況為陣列， 因為我們已經看到了一群人
在同一時間。
>> 因此，類型是什麼樣的變化，你 希望成為該陣列的每個元素。
不要希望它整數數組？
然後，你的數據類型應該是int。
你希望它是一個 雙打或浮筒的陣列？
數據類型應該是雙重或浮動。
這個名字就是你 想打電話給你的陣列。
你想命名這個巨人 整數或浮點數或字符銀行
還是雙打，或任何有你嗎？
那你怎麼稱呼它？
漂亮的自我解釋。
>> 最後，大小，它進入 方括號內，
多少個元素是你會 喜歡你的陣列遏制。
多少個整數，你要不要？
多少花車你想要什麼？
>> 因此，例如，詮釋學生成績40。
該聲明呼籲學生數組 等級，其中包括40的整數。
漂亮的自我解釋，我希望。
這裡是另外一個例子。
雙菜單上的價格8。
這將創建稱為陣列 菜單上的價格，其中包括
房間在內存中為八對雙打。
>> 如果你覺得每一個元素 類型的數據類型的陣列，
因此，例如，一個單一的元素 int類型的數組，相同的方式，
會想到其他 int類型的變量，
所有熟悉的操作，我們 在操作前面討論
視頻將是有意義的。
所以在這裡，我們可以聲明數組 布爾叫Truthtable的，
其中包括空間10布爾值。
>> 然後，就像我們可以只分配 一個值類型的任何其它可變
布爾，我們可以說些什麼 像Truthtable括號
2，這是我們如何表示， 該真值表的元素？
的第三個要素 真值表，因為記得，
我們計數為0。
所以，這就是我們如何指示 真值表的第三個要素。
Truthtable 2等於假， 就像我們可以declare--
或者我們可以指定，相反，任何 布爾類型變量是假的。
>> 我們也可以用它的條件。
如果（truthtable 7 == 真），這是說，
如果第八元素 Truthtable是真實的，
也許我們要打印一個信息 給用戶，輸出（“真！N”）;
這使我們說Truthtable 10等於真的吧？
好吧，我可以，但它是相當 危險的，因為記得，
我們有10布爾數組。
所以指數最高的 編譯器已經給我們的是9。
>> 這一計劃將編譯，但 如果其他內存
存在在那裡我們將 預計Truthtable 10去，
我們可能遭受分割故障。我們 可能逃脫它，但在一般情況下，
相當危險。
所以，我在這裡做是合法的C， 但不一定是最好的舉措。
現在，當你聲明和 同時初始化一個數組，
實際上有一個漂亮 特殊的語法，您
可以用它來填滿陣列 它的開始值。
它可以變得很麻煩 申報大小100的陣列，
然後不得不說，元素0 等於這一點;元1等於這一點;
單元2等於這一點。
這有什麼意義，不是嗎？
>> 如果它是一個小陣，你 可以做這樣的事情。
布爾truthtable 3等於開 大括號，然後逗號
分離元素列表 你想要把數組中開始。
然後關閉大括號分號。
這產生的陣列 大小的3名為Truthtable，
與元素假的，真實的，真實的。
而事實上，所述實例化 語法我這裡是
完全一樣做 下面的各個元素語法。
編碼的這兩種方式將 產生完全相同的陣列。
>> 同樣的，我們可以遍歷 以上所有的元素
使用循環的陣列，其中，在 事實上，是一個非常強烈推薦
在家裡鍛煉。
你如何創建一個數組 的100個整數，其中
數組中的每一個元素是其指數？
因此，例如，我們有100陣列 整數，並且在第一元件，
我們希望把0。
在第二個元素，我們希望把1。
在第三個元素，我們希望 把2;等等等等。
這是一個非常好的 在家裡練習做。
>> 在這裡，它不看 喜歡太多改變。
但是請注意，在之間 方括號中，這一次，
其實我已經省略了一些。
如果你使用這個非常 特殊實例
語法創建 數組，你居然不
需要指出的大小 陣列的預先。
編譯器是足夠聰明 要知道，你其實
希望大小3的陣列， 因為你把三個要素
等號的右邊。
如果你已經把四，那就得 給你的尺碼4的真值表;
等等等等。
>> 數組不局限於單一 維度，這是很酷。
實際上，你可以有很多 側面說明符如你所願。
因此，舉例來說，如果你想創建 董事會為遊戲戰艦，其中，
如果你玩過，是一種遊戲，是 10格玩弄於10釘，
你可以創建一個這樣的數組。
你可以說布爾 戰艦括號10
封閉括號廣場 支架10關閉方括號。
>> 然後，你可以選擇 在你的心中解釋為一個10
10網格單元。
現在，實際上，在存儲器中 它確實只是
仍然是100元， 一維陣列。
而這，其實也適用於你 有三個維度，四個或五個。
這真的只是不乘 所有的indices--的
或所有的大小 specifiers--在一起，
而你只得到一個一維 數組的大小。
>> 但在組織方面和 可視化和人類感知，
它可以是一個容易得多 用電網工作
如果你工作在一個遊戲 像井字棋或戰艦，
或者類似的東西。
這是一個偉大的抽象， 代替具有
想想一個井字棋 板作為線九
廣場或戰艦板 作為一行的100個正方形。
10×10格或三 通過三格可能
很多更容易察覺。
>> 現在，一些真正 重要的有關數組。
我們可以把每一個人 數組作為可變的元件。
我們看到，前面 當我們分配
真值一定布爾 或者測試他們的條件句。
但是，我們不能把整個 數組本身作為變量。
我們不能，例如，分配一個陣列 使用分配另一個數組
運營商。
這是不合法的C.
>> 如果我們想，對於example--什麼 我們會做的那個例子
將複製一個陣列到另一個。
如果我們要做到這一點，我們實際上 需要使用一個循環來拷貝過來
每個單獨的元件一次一個。
我知道這是一個有點費時。
>> 因此，例如，如果我們有這些夫婦 行的代碼，將這項工作？
哦，不，它不會，對不對？
因為我們正在努力 糧食分配給吧。
這是行不通的， 因為它是一個數組，
而我們剛才所描述 這，這不是法律C.
>> 相反，如果我們希望 複製食物的內容
進入酒吧，這是什麼 我們想在這裡做，
我們需要這樣的語法。
我們有一個for循環去 從J是等於0到5，
我們增加J於每一個迭代 循環，這樣分配的元素。
這將導致酒吧還 是一，二，三，四，五，
但我們必須這樣做，這很 慢元素乘元素的方式，
而不是由跟 複製整個陣列。
在其他編程 語言，更現代的，
你可以，事實上，做到這 這麼簡單等於語法。
但是，C，不幸的是，我們 不允許這樣做。
>> 現在，有一個其他 的事情，我要提
有關陣列可以是一個小 有些棘手的第一次
與他們合作。
我們在視頻中討論 有關變量的作用域，
大多數變量在C中，當你調用 它們的功能，是按值傳遞。
你還記得這是什麼意思 通過一些由價值？
這意味著我們正在做的一個副本 這正在被傳遞的變量。
被調用函數，該函數 該真實接收變量，
沒有得到變量本身。
它得到了自己的地方 它的副本一起工作。
>> 當然，數組，做 不遵循這個規則。
相反，我們所說的這個 是通過引用傳遞。
實際上被調用者 確實接收陣列。
它不接收其 它自己的本地副本。
如果你想 它，這是有道理的。
如果數組是真的很大， 需要這麼多的時間和精力
使陣列的一個拷貝 100或1000或10,000元，
這是不值得的 函數接收的一個副本，
做一些工作吧，然後 只是在複印完成;
它並不需要有 它遊逛了。
>> 因為數組是一些 笨重，麻煩且
我們只是通過引用傳遞。
我們只相信功能 要，不要破壞任何東西。
因此，它實際獲得的數組。
它沒有得到它自己的本地副本。
>> 所以，這是什麼意思， 然後，在被叫時
操縱數組中的元素？
會發生什麼？
現在，我們將光澤 在到底為什麼這
發生，為什麼數組 按引用傳遞
和其他一切是按值傳遞。
但我向你保證，我們將 返回並給你答案
此在後面的視頻。
>> 這裡有一個多運動對你 之前，我們總結了東西陣列。
這裡的代碼串，這是 不是特別的好作風，
只是我會作出這樣的警告。
有沒有意見在這裡， 這是非常不好的形式。
但是，這只是因為我想成為 能夠在屏幕上容納一切。
>> 在頂部，你可以看到，我有 二元函數聲明為一組陣列
並設置INT。
設置陣列顯然需要一個數組 四個整數作為它的輸入。
並設置INT顯然需要 一個整數作為其輸入。
但他們都沒有輸出。
輸出，返回 類型，每一個都是無效的。
在主，我們有一個 幾行代碼。
我們聲明一個整數變量 稱為A和分配值10。
我們申報的四個整數數組 稱為B並分配元件0,1
2，和3中。
然後，我們有一個調用設置 int和調用設置陣列。
集陣列和組的定義 INT是向下跌破，在底部。
>> 所以，再一次，我問你的問題。
什麼被打印出來 在這裡主要的結束？
有一個打印山坳。我 打印出兩個整數。
我打印出A的內容和 的乙括號0的內容。
在這裡暫停視頻，並採取一分鐘。
你能弄清楚這是什麼 功能將在最後打印？
我們希望，如果你還記得 路過的價值之間的區別
並引用傳遞，這 問題是不是太棘手的適合你。
而答案，你會 發現是這樣的。
如果你真的不知道，以 為什麼是這樣的話，拿第二，
回去後，我回顧了一下剛才 討論有關傳遞數組
作為參考，與傳遞 其他變量按值，
並希望，它會讓 多一點點感覺。
>> 我是道格·勞埃德，這是CS50。