[音樂播放] 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。