>> [音樂播放]
>> DAVIN：好吧，伙計們。
因此，這是審查 對於第一次測驗。
是每個人都準備好了 週三測驗？
艾里遜：嗚！
學生：嗚！
DAVIN：是的。
艾里遜：是啊！
DAVIN：那傢伙的準備。
那傢伙，兩隻手，美觀大方。
所以，今天的測驗審查，這是怎麼回事 為大約一小時半。
我們將繼續在所有主要的 概念你應該知道的知識問答。
我們將通過介紹一些編碼 手的例子，這是每一個測驗。
如果你有任何問題，請隨時 提高你的手，一切
這樣。
好了，關於物流 測驗是否在線。
所以，我們要拆分人 成不同的房間。
它是基於他們的名字。
所以，如果你有什麼地方有任何疑問 去或有關的材料是什麼，等等，
對正在發生的事情的官話 要對競猜，在網上查詢。
而這一切是最新的。
所以，如果沒有問題，以 首先，我們要開始。
和這裡的佳佳。
>> [CLAPS]
>> ALLISON：好的，謝謝，羅布。
欣賞它。
達文應該翻轉此。
這是其中的非窮盡列表 主題，一如既往地為達文剛說。
參考文檔 網上有關測驗為零。
但是，這是相當much-- 它是在大綱
是我們已經討論了迄今為止的一切。
這裡的一切都是公平的遊戲， 還有別的
可能被提到的講座。
>> 我的部分，在這裡， 只是很多審查。
有一對夫婦演習 那你們可能會工作。
但在大多數情況下，我們真的 想獲得達文與代碼
手練習。
>> 所以，我要通過這個飛行。
如果您有任何問題，我停下來。
舉起你的手。
我保證我可能會看到你的。
如果沒有，只是揮動它周圍。
我將要說話快。
我希望每個人與確定。
>> OK，特殊的詞，達文明顯 忘了翻閱這些幻燈片。
（笑）你有麻煩了，老兄。
因此，對於競猜零技巧， 練習編碼在紙面上。
你們會得到一些 實踐與現在達文，
所以你不會被自己徹底。
我認為我們實際上會 通過這兩個功能。
所以，你會做好充分的準備在那裡。
>> 熟悉你的習題集。
已經出現的問題 以前的測驗
會問你，例如，代碼 一些東西非常相似，馬里奧。
所以是很熟悉 您的問題集，以及
作為問題，我們問你 在窗體上的開始
您填寫，將 竭誠為您服務很好。
>> 做下以前的測驗 時間的限制。
這些測驗很長。
時間過得真快。
而往往，你不知道怎麼 很快它去，直到你真正
把自己在這些約束條件。
所以，如果你可以能開出，你要知道， 第75分鐘，無論是今晚或明天
把這些測驗中的一個下 這一點，你就會好得多。
>> 而且，創建您的參考表。
請記住，你只有一個 頁正面和背面
為您的測驗上週三的參考。
創造是學習的好方法。
什麼，你有麻煩了 你要包括在那裡。
凡是你的TF一直， 象，這是非常重要的。
你應該知道這一點，是 也許你對那裡的東西
如果你沒有這些記憶。
即使你知道他們真的 還有，有時有它的存在
僅僅是種安慰你， 我知道測驗的壓力。
所以，任何安慰你能有所幫助。
好吧，也讓睡眠和 吃，喜歡正常的事情
我們告訴你的測驗。
>> 所以出發方便， 數據類型和大小。
正如我所說，這只是會 被我扔了很多東西
在這裡，你應該知道。
因此，我們有我們的字符 這是1個字節，整型
這是4個字節，長 長，這是8個字節。
基本上，它只是你 想抱著更大的整數。
彩車，其中有四個， 雙打，這是8。
再次，只是給你更多 空間，為您的花車。
然後鍵入星，所以任何 指針在32位機器上，
這是所有你們需要 以知道，是4個字節。
>> 所以你應該所有的東西 知道了，也許事情
你想有 您的參考表。
OK，二進制轉換 為二進制，轉換
為十六進制，反反复复， 所有的事情你應該知道。
所以從二進制到十進制的。
你們想採取快速分鐘 並嘗試找出每種
然後告訴我他們是什麼？
>> 我也有糖果在我的包裡，所以任何人 誰回答得糖果，順便說一句。
我有很多很多的。
讓我抓住這一點。
我打算把這個交給加布。
所以，你可以把手伸到糖果 誰是很好的合作。
>> OK，我在後面看到一隻手出現。
>> 學生：是啊，第一個是42。
>> ALLISON：是的，第一個是42，正確的。
學生：[聽不清]。
[笑]
艾里遜：第二個， 背部有黃色的？
學生：110010。
ALLISON：正確的，這 最後一個，放在這兒的底部？
此外，啊，你知道想要什麼？
剛剛折騰出來的糖果。
如何糖果給大家？
>> 學生：[聽不清]的時候，我們就大功告成了。
>> 艾里遜：噓。
然後是最後一個。
誰願意回答？
就在那裡。
>> 學生：11100。
>> ALLISON：11100，看那個。
恭喜你，偉大的工作，每個人。
OK，大家種理解 這個過程這樣做？
你已經從二進制前往十進制 我傾向於這樣做的方式，是寫出來
2的冪。
所以我說，OK，0次2比0，所以 這是0，1次2的第一，
2要開始這樣的。
有沒有人要我明確 通過二進制的例子嗎？
OK，爽。
>> 十進制到二進制的非常相似。
我傾向於寫出來的2的冪。
先從一個是最大的，因此 但不走過去的十進制
你正在尋找的。
和種，然後以你的方式 向後加起來的東西是必要的。
>> 然後用另外，它們也 就像正常的加法。
如果你有你從哪來的情況下 加上兩個1，它顯然變成2。
2二進制現在是1 0，所以你需要 攜帶你的1到下一列。
涼爽。
>> 十六進制，這可能是什麼 這是稍微不太熟悉。
因此，作為羅布只是告訴我 事前，他的伎倆本
是只拆了它 成四個字節的塊，好不好？
位，對不起。
看到了嗎？
感謝羅布。
這就是為什麼你在這裡。 [NOISE] 好了，我們只是把它分解
為4位的塊。
所以用二進制代碼為十六進制， 我們看一下前4，
這是如果我們有四個1秒的 行，什麼號碼這是否象徵？
>> 學生：F.
>> ALLISON：因此在這種情況下， 什麼是11111111 or--是嗎？
學生：FF。
ALLISON：完美，FF。
如此之大，糖果給你。
現在，對於如何十六進制為二進制，我們 只是覺得那種相反它。
對於每一個數字或字母 我們在我們的十六進制，
只需將它轉換為它的四個位 （笑）到4位的轉換。
所以如圖5所示，在這種情況下，什麼是5，如果 我們代表這四個位？
>> 學生：010？
嗯。
然後，這是 其實10，會是什麼？
1010。
因此，我們有，在這裡。
因此，十六進制之間的轉換 和二進制其實並不壞。
如果你看它在4位 塊，將是黃金。
Everyone--是嗎？
>> 羅伯：這是愚蠢的， 但我永遠記得
A，因為A的應該是10。
和二進制只是10 10，so--
>> ALLISON：嗯，我們走吧。
>> 羅伯：嘿。
>> ALLISON：嘿，糖果羅布。
有非巧克力的東西在裡面。
所以，你可以有一些。
因此，ASCII數學。
行為方式。
所以ASCII數學，因為你們 大概還記得
P設置2的Visioneer和 凱撒，你做了很多了。
請記住，人物 從根本上只是數字。
因此，我們可以做數學與他們， 就像我們做數學與整數。
>> 因此，我們有一點點 在這裡簡單的事情。
我們有一個在這 初始化為65。
和B等於A的ASCII值 加1，燒焦ç等於d減1，
和焦炭d之比等於68。
那麼接下來我們要打印 所有的人，我們在這裡看到。
而誰能告訴我 這是什麼會打印出來？
學生：[聽不清]。
ALLISON：沒錯，所以 有一點要注意的是
我們要打印出來 每一次，這裡字符。
我們指定，即使A和B 是整數，當我們在上面宣布他們。
我們正在打印它們通過字符 百分比C和我們的printf語句，
所以他們將所有打印的字符。
當然，ASCII值65將 打印為A的加1的ASCII值
將是66，這將 自豪地B.所以，事實上，我們
獲得A B C D。每個人都很好嗎？
有問題嗎？
真棒。
>> OK，範圍。
所以，範圍顯然是一個非常 重要的是要明白，在這裡。
很多的你，如果你 有編譯錯誤，
它說你沒有 訪問某些變量，
這可能是因為你 一個循環內定義它
然後試圖訪問它 出來吧，反之亦然。
>> 所以範圍為核心， 它只是決定在哪裡
我們說一個變量存在，在這裡我們 可以改變它，我們可以訪問它。
種它只是說這些都是 在這裡你可以訪問的唯一場所
這個變量。
>> 所以這兩個領域，我們談談 在課堂上是全局和局部。
我們談了這麼全局變量 當你定義它們上面的主。
這意味著，你的整個 程序可以訪問它，
並且它的存在，只要 在程序運行時，OK？
地方意味著它 更局限的區域。
所以，只要你有特定的功能 類似的交換，我們總是談論。
我們總是在談論交換A和 B. A和B的函數中存在。
它們不存在任何其他地方。
>> 還有，當你有，如果 語句或循環。
每當我們有，例如，在 一個for循環，我們必須INT I等於0。
我們有一些條件，我們對其進行更新。
我只在存在 那for循環括號。
如果您嘗試在其他地方訪問它， 你的編譯器會罵你。
它會像，你想幹什麼？
本不存在。
所以，這兩個 不同類型的範圍。
這是否有意義大家？
>> 因此，對於這裡的例子，此 只是一些簡單的程序。
你們怎麼認為 將要在每一個點
我們嘗試打印？
因此，這一個在這裡， 什麼事情發生？
學生：這將打印三種。
艾里遜：對。
它會打印3。
怎麼樣嗎？
學生：這是行不通的。
艾里遜：這是行不通的。
你超出範圍了吧？
局部變量不存在 這些括號外，沒事吧？
然後怎麼樣嗎？
>> 學生：[聽不清]。
>> 艾里遜：什麼？
搶，走了。
>> 羅伯：我剛才說的。
全局變量應該是 全球下劃線變量。
>> ALLISON：啊，是的，對不起。
謝謝，羅布。
羅布的像我們的居民的編譯器。
他只會罵我們，當我們 需要它。 （笑）是的，
應該是全球性的下劃線變量。
因此，假設該 是全球性的下劃線
可變的，什麼會發生在這裡？
學生：那會工作。
艾里遜：它會工作。
所以它會打印，所以只 一個非常簡單的例子。
OK，原型。
所以，很顯然，我們真的 強調為你們
如果以它的功能 道理在你的程序中。
但當然，當你 使自己的職能，
通常你會經過的主要定義。
你會嘗試打電話給他們的主力。
如果你不使用的原型， 你的編譯器會罵你。
>> 原型基本上是 只是告訴編譯器
我有以下主要這個功能。
我要叫它之前，我定義它。
堅持下去。
我保證，它的定義，你 將有你需要的一切。
>> 所以我們做的方式就是你的回報 類型，你的函數的名字，你的輸入
列表中。
它基本上是在第一行 你的函數聲明。
這一切真的是。
但是，這僅僅是一個 一般的那種格式。
>> 所以，在這裡我們的例子中， 這你們應該
所看到的截面 在某些時候，我們有
一些INT多維數據集 需要輸入一些int類型。
我們有我們的主要 函數，該函數調用的立方體。
和多維數據集的事實後確定。
>> 所以，如果我們沒有整型立方體輸入 在頂部，當我們所謂的魔方
主，我們的編譯器內 會生氣我們。
它會像什麼 你在說什麼？
立方體不存在。
我不知道你在問什麼。
而我只是站。
>> 但是，因為我們做了我們的原型 在上面，我們已經說過了，
你知道，當你看到 立方體，不要擔心。
我保證它的後面定義。
它會讓你做你想做的。
因此，如果你曾經有一個函數 你怎麼稱呼它後聲明
第一次，你需要 有它的原型在頂部。
>> 是嗎？
>> 羅伯：它的平方，而不是魔方。
>> 艾里遜：哦，我的上帝。
我沒有have--加布，我想 你是我們的校對。
OK，大家好，多多包涵，在這裡。
我希望每個人都得到了主意。
OK，所以這應該有 被平方，立方不會。
但思路是一樣的。
我們以後要調用任何函數 事實上應該有一個原型。
每個人都好有嗎？
其他任何錯別字？
行。
在這裡的任何錯別字在我們開始之前，羅布？
（笑）好吧，那麼結構。
基本上，結構允許你 創建自己的數據類型。
那麼像int或char或 花車，它只是另一種類型。
我喜歡把它當作一樣， 創建自己的數據類型。
所以，它可以讓你做到這一點。
和它保持不同類型的數據。
>> 所以，如果你還記得，在一個數組中，我們 只能抱著相似類型的東西。
結構使我們能夠保持多個 不同類型的東西。
因此，在這裡這種情況下，我們 有一個叫學生結構，
這裡命名為底部。
和我們有一些整數ID 還有一些字符串名稱。
所以，這只是另一種數據類型。
我們現在有一個名為學生的數據類型。
>> 是因為我們能想到的 它只是另一種數據類型，
我們可以聲明變量 因為我們任何其他的。
因此，而不是只是有一樣，在 INT學生，我們只是有一個學生，
學生1。
哦，你看。
這是羅布。
所以在這裡我們聲明 一個結構或一個變量
所謂類型學生的學生1。
因此，這將有身份證 和與它相關聯的名稱。
>> 與我們的方式訪問這些 我們的結構中的元素
與點操作符，在這裡。
所以在這種情況下，我們 宣布一些學生1。
我們指定的ID為1。
我們指定的名稱是羅布。
好了，大家都好有嗎？
使用它只是like--是嗎？
>> 學生：是啊，typedef--時 我們需要使用的typedef？
>> 艾里遜：那麼剛才的typedef 說that--羅布，你
可以糾正我在這，如果我wrong-- 但類型定義僅僅是實際申報
它可以使用一個類型，對吧？
>> 羅伯：是的，這是基本， 所以它只是創造
別名或綽號的類型。
所以，你可以鍵入[聽不清]。
所以[聽不清]的存在， 現在我們只是有
[聽不清]手段 同樣的事情。
所以在這裡，我們打字，我認為， 某些結構類型2 [聽不清]。
所以它只是一個暱稱 對於給定的類型。
>> 學生：字符串[聽不清]庫 被打完了像燒焦的明星。
>> 艾里遜：對我們來說這裡， 如果你聲明一個結構，
只是做typedef結構。
OK，所以事前，這是 只是一個正常的位置變量。
我們訪問一個點。
如果我們有一個指針指向 一個結構，我們實際上可以
用一個箭頭，這是很酷。
>> 所以在這種情況下，我們有一個指針指向 學生1是類型的學生。
請記住，你的 指針結構，
你要什麼類型的指針 所指向的是在開始時。
因此，我們有一些學生1，點擊這裡。
而且，由於這名學生 1現在是一個尖，
我們其實可以去學生1名箭頭 而不是點，因為它是一個指針，
並分配羅布。
現在，如果我們想 改變搶到達文，
這只是顯示你 用不同的方式來做到這一點。
>> 因此，代替使用方向，則 可以also--我會完成這個再
採取question--你可以 也可做參考的學生1。
這是說喜歡去 無論是在學生的1，這
將是我們的學生結構。
以一個點和元素進行訪問 你想要的，然後再重新分配它。
有一個問題。
學生：是的，所以怎麼來的，你有 使用[聽不清]當你
做學生的沒有明星 [聽不清]學生嗎？
艾里遜：由於此 是創建一個指針。
羅伯：我們要談論它。
艾里遜：我們要談 關於以後的審查。
因此，只要守住這個想法。
如果仍然困擾你的 最後，再來說說我們的一員。
>> 因此，這些做同樣的事情。
我們只是在展示你們兩個 不同的方式來做到這一點。
學生1現在是一個指針，所以 您可以訪問Name元素
內帶箭頭的結構。
或者，你可以取消引用指針，並 然後訪問它，你通常會。
這是否有道理每個人？
如果整個指針的東西都有點 混亂，加布會談論，
然後也許這 會更有意義。
是嗎？
>> 學生：是的，所以怎麼樣 這從不同？
艾里遜：前一個？
所以在這個學生1 案不是指針。
這只是你的實際結構。
>> 學生：OK。
>> 艾里遜：雖然這一個 是一個指向結構體。
>> 學生：OK，但確實它種 結束工作的同[聽不清]。
>> 艾里遜：它有效的工作原理相同。
你的語法只是不同而已。
學生：OK。
>> ALLISON：是的，他們是 實際上是相同的。
這只是根據上下文， 您可能需要一個比其他。
是嗎？
>> 學生：當你做 引用到1--
艾里遜：嗯？
學生：你為什麼 有括號？
艾里遜：因為學生 圖1是指針。
所以，你需要確保你 剛提領的指針。
>> 學生：OK。
>> 艾里遜：那麼在這裡這種情況下， 它周圍的括號
意味著你提領學生1。
所以，你要去哪裡的學生 1分，這是你的結構。
所以，現在你能想到的 它作為結構，
因此，我們可以利用我們的網點正常運行。
還有沒有其他問題？
酷，真棒。
>> 所以過去的事情，我覺得 是我最後一張幻燈片，嗚！
OK，所以浮點不精確。
我們短暫交談約 本次講座中。
基本上，我們有 無窮多個實數。
如果你的任何球員 喜歡數學，有
各種很酷的東西與我們聯繫。
>> 但也有無限 許多實數。
但他們只有有限 有多少位，我們有。
所以，你總是會 有不精確，僅此而已。
這就是這正中下懷 喜歡的東西你應該知道。
這就像我們可能會問你為什麼 浮點不精確存在嗎？
所以只是你應該知道。
有了這樣的，我翻 它交給指針。
>> 賓基：你好，伙計們。
我叫賓基。
我要談的指針。
是啊，所以指針實際上是 我最喜歡的一部分，在這個過程中。
所以才弄清楚什麼佳佳 在這裡所說的，這樣的理由
這裡why--唯一的區別， 大的差異的方式
我們申報的東西。
因此，學生明星這意味著 是一個指向一個學生。
而幻燈片之前，學生是 實際的結構，像一個真正的學生，
含有這些東​​西。
>> 而我們之所以 想to--是，達文？
>> DAVIN：什麼是箭頭是什麼意思？
>> 賓基：箭頭手段 完全一樣，這一點。
所以，你並不真正需要的箭頭。
就像，如果你只計劃 在C中，你可以用這個。
對不起，我這樣做，是不是。
你可以使用這個語法。
>> 但有些人，當 他們在設計C，
他們想通的人 使用的語法那麼多，
他們會像剛才上來 與語法結構的。
而這發生在 這個箭頭的形式。
而且它是非常好的，因為 它象徵著什麼
就像我們實際上以下 此箭頭，這個指針，
對內存中的一些空間。
當我們到達那裡，我們要 看向那個學生的名字，
如果是有道理的。
行？
>> 因此，這是完全一樣的。
這也正是同樣的事情了。
它們被編譯一模一樣，好不好？
這裡的原因，我們的malloc 東西，是因為在這種情況下，
我們的變量實際上是 只是一個指針變量。
所以，我們只有在一定的空間 內存是抱著一個指針。
我們真的沒有任何空間 保存實際結構。
>> 所以這必須在兩個步驟中完成。
我們要創造的 內存放的結構。
我們必須創建 內存放的指針。
所以他們基本上有兩種 不同的變量，在這裡。
其中之一就是類型的學生， 但它並沒有真正有一個名字。
另一種是 類型學生的明星。
然後學生1分 還有，如果是有意義的。
行？
>> 那麼，為什麼我們使用的原因 指針是因為一切
在計算機中，每個變量 在一台計算機有兩件事。
它有它的價值。
並且它有它的地址。
而一個好辦法 概念化，這是有
很多問題當你 嘗試使用的功能。
我們要去嘗試 看看其中的一個。
也就是說，它要 認為內存盒。
>> 你一直以為變量 當你說吶等於5。
你以為把5成箱。
所以，如果你想傳遞什麼 這個int到一個函數？
你剛才pass--我不 知道 - X成一個函數。
但是，什麼情況是 通常作為人類，你
會覺得像我 通過盒子的人。
它並沒有真正 發生在計算機上。
會發生什麼事是你複製的價值 對應的複選框以人的箱子。
>> 所以，我想說的是，如果 你有function--這裡sorry--，
如果我們有像到5構成功能 還有，如果你試圖通過一個變量，
它只是去複製。
如果初始化NX等於3，這是怎麼回事 到拷貝該值設定為變量a
在那裡。
OK，這就是種原因 我們為什麼要使用指針。
由於代替 給剛值，
而不是僅僅只是路過 的值以一個函數，
我們希望通過引用傳遞。
我們所說的通過引用傳遞是一種 向功能，給予箱，
因此，該函數也可以 內框更改值。
>> 好了，只是一些基本的指針 東東是創造三分球，
你只需要聲明它的類型和 你把一個明星之後吧。
和類型只是 你所指的地方。
所以，如果它是一個int明星， 你指著一個int。
如果它是一個char明星， 你指著一個圖表。
如果它是一個學生明星， 你指著一個學生。
行？
>> 他們都是4字節長。
因為這個變量 它實際上並不
需要舉行一個char， 一個int或一個學生。
只需要持有一個地址。
這就是為什麼他們都是4個字節 長在一個正常的32位機。
行？
因此，這裡，x是指向一個變量 為int。 Ÿ指向一個字符。點z
為float。
這裡有什麼問題嗎？
涼爽。
並有兩個 它們具有不同的符號
要記住，當 未來的指針。
因此，參考和 非關聯化是大的。
所以在與號 變量名給你的？
學生：地址。
賓基：地址。
所以，如果你聲明一個整型 等於5，那麼符號
一個是要給你的地址。
而實際上你可以試試 打印該看看
什麼樣的內存地址 你變了。
然後dereferencing-- 使被引用，
獲得address--反引用 是完全相反的。
OK，就好像時間是 一個部門的對面，
明星是符號相反。
因此，提領方式去那裡。
所以，如果你給我star-- 不知道 - 50，這是
要嘗試去的地址 50號在你的電腦中。
確定，為什麼我們看到的 他們是對立的？
因為如果你這樣做會發生什麼 像明星AMPERSAND一個？
那麼，一個符號給你的地址 一個變量，a的地址。
但星意味著去那裡。
>> 如果你恰巧是什麼 去的地址？
你只得到一個，對不對？
所以要的地址 一個是同樣的事情的。
這就是為什麼他們通常 提到了same--這
這被稱為 作為另一運營商。
行？
太酷了。
>> 在內部，例如， 如果我們聲明整數x等於5，
我們有一個變量。
請記住，我說的每一個 變量 - 這是一件好事
保持在mind--它有兩個 不同的事物相關聯。
它的尋址和一個值。
行？
>> 所以在這種情況下，該值是5。
和地址is--比方說，我 使一些up--是0×04。
而唯一的原因，我們通常 表示十六進制地址
是的，因為它就像好。
它順利二進制。
可以很容易地轉換和從二進制文件。
和它沒有得到太大的話 你有一個非常大的數字。
所以我們喜歡用十六進制 在打印地址。
但我可以代表 這是一個整數。
它的罰款。
>> 因此它具有一個地址 圖4和5的值。
然後我說明星整型指針。
因此，這是一種不同類型的，另行通知。
INT明星指針等於 x的地址。
那麼，什麼將是PTR的價值？
這將是 x的地址，到這裡。
行，因此該值是要 是相同的地址。
這是分配工作，我做的事情。
然後PTR都將有 它自己的地址，該地址的出現，
在這種情況下，如圖8所示，行？
>> 然後我創建一個新的整數副本。
我說INT副本等於去那裡。
所以去什麼PTR指向。
那麼，這是什麼PTR有哪些？
PTR有0×04。
如果我試圖去那裡，會發生什麼？
我會找到那個誰了 地址x和誰擁有的地址4。
而誰擁有解決四個為x。
這是否有道理？
是嗎？
>> 學生：在這種情況下，是 在一個堆棧指針？
>> 賓基：在這種情況下， it's--很好的問題。
我真的沒有想到這 當彌補這些地址。
但是，如果這是一樣，所有 這些都是局部變量，
那麼x是要住in--一切 打算居住的堆棧。
所以，一切都 是指向堆棧。
你只能堆時 你開始使用malloc，對不對？
>> 所以，如果你還記得堆棧每次 你調用一個函數在程序中，
等，主要用於例如，或任何 其他功能，如printf。
所有的局部變量是 會被放到一個棧幀。
他們會得到 在堆棧中像雪片一樣飛來。
這就是被稱為堆棧。
和所有局部變量 將要出現。
和heap--，我們要 更多地談論這個later--
堆是所有的 動態分配的內存的生命。
很酷吧？
>> 我們去這個幻燈片。
是嗎？
>> 學生：為什麼不是int 複製返回0×04？
>> 賓基：為什麼不是int 複製返回0×04？
>> 學生：為什麼不說[聽不清]？
>> 賓基：原因是什麼PTR的值？
>> 學生：0×04。
>> 賓基：0×04。
如果你去0X04，會發生什麼？
你明白了什麼？
>> 學生：哦，好吧。
賓基：你看到了什麼？
學生：是的。
賓基：所以，你得到5。
所以副本都將有 5，如果是有道理的。
是嗎？
>> 學生：難道我們已經得到了 5，在值框中[聽不清]
如果我們把INT複製[聽不清]。
>> 賓基：Int--我們會的，是的。
這會做 幾乎同樣的事情。
但這樣一來，我們可以通過 要解決功能。
而這也是很酷的事情 我們打算做的事情。
>> 所以這種運動總是出現 on--很一般出現在測驗。
所以這是非常好的嘗試 做這種自己的事情。
所以，盡量保持跟踪什麼地址 是，想要的變量的值
是在每一個點。
因此，這也正是 我們所要做的。
這裡，我們有以下步驟，1， 二，三，四，五。
一，二，三，四，五。
而且我們要跟踪 的x和a的值。
>> 所以，這是什麼做的，如果這是一個 bug的代碼，我們正在試圖做五。
因此，我們試圖獲得一個 變量和它的值更改為5。
而記得我有一個類比 框和遞箱子的人？
因此，主有此框名為x。
它包含的值3。
我試圖用手 此框五。
>> 我想五改 此盒的5個值。
然後，我只是打印x的值。
這是我的function-- 這就是我想要做的事情。
我只是想更新 x的5個值。
它是明確的功能做什麼？
>> 好了，什麼都將成為 x和這裡權值，
第一行中，前右第一 line--我say--的程序？
>> 學生：大概垃圾。
>> 賓基：只是垃圾的東西。
所以，我只是把N / A。所以 我們真的不知道。
就像，一個根本不存在呢， 因為我們不叫五。
詮釋一個不宣。
並且x是要存 在這裡，但我們還沒有真正
指定任何值給它，這樣就OK了？
>> 然後，什麼都將成為 X和A的數量兩個值？
>> 學生：[聽不清]。
>> 賓基：所以X將是3。
這很簡單，因為 我們指派3到它。
和靜止不存在 因為只是住在五。
所以，我打算有3個並沒有什麼。
或像垃圾一樣，不管， 沒有真正定義。
而現在，這是最重要的線。
在這裡，我們要 其實叫五。
請記住我說的話。
我們從來沒有過在箱子裡。
我們剛才複製的價值 盒子到另一個盒子。
這是所有的電腦都複製 東西從一個地方到另一個地方。
>> 所以五，其實際作用 是x它複製到一個值。
那麼，什麼會是在這裡？
x和a的值。
3和3，我們只複製 它通過從x到一個。
涼爽。
>> 現在，我們在這裡。
現在我們要去 更新等於5。
怎麼會發生在四個行？
>> 學生：[聽不清]。
>> 賓基：一個被更新， 但X沒有得到更新。
由於X仍住在主，這是一個 完全不同的內存塊。
這是一個不同的變量。
一個是另一個變量。
他們碰巧有 相同的值，因為我
複製通過x的一個值。
但現在，當我做了等於5，它 並沒有真正影響X以任何方式。
這是棘手的部分。
是否有意義給大家？
是嗎？
學生：還有一個問題，你有3個。
為什麼一個already--哦，不，這是3。
對不起，沒關係。
我讀5。
>> 賓基：是的，3，3。
>> 學生：[聽不清]，是啊。
賓基：然後我們分配到5 一，但並沒有真正改變X。
好不好？
學生：是的。
賓基：是的？
你可以再次解釋 一個被複製[聽不清]？
>> 賓基：OK，所以當你調用到五 x的，所以這行代碼在這裡。
五x的，什麼是X？
x是僅有3在這一點上，對不對？
所以，你可能只是想放的 3在這裡，忘記關於x的。
只要把一個3這裡。
就像，我們要複製過來的 x的值到一個整型那是在那裡。
行？
>> 因此x的值是3。
我們要複製在3到。
和所有其他的這個塊 記憶中，這其他的變量
稱為一個將有3，以及。
這是否有道理？
是嗎？
>> 學生：如果你給五象 它作為整數X代替，
這會解決一切嗎？
>> 賓基：如果它是一個integer--沒有， 這不會解決所有問題。
所以這是一個非常好的問題。
它並不真正的問題是什麼 你叫這些變量。
再次，這將是對範圍的問題，請 因為它們不是相同的x。
他們是完全 在內存不同的空間。
學生：[聽不清]。
賓基：所以它並沒有真正 不管你怎麼稱呼他們。
不解決的事情，好不好？
更多問題？
是嗎？
>> 學生：這怎麼回 5 [聽不清]？
賓基：OK，我們還沒有做到這一點呢。
讓我們去第五，然後。
>> 學生：[聽不清]？
>> 賓基：什麼？
>> 學生：你有回報呢？
賓基：我們沒有 一個回報，而不是主要的。
但主要的自動返回0 如果不返回任何東西。
是嗎？
>> 學生：你能不能讓main--或 你能做出5歸路？
>> 賓基：我們可以有 五返回，是的。
但是，我們必須為x 等於五的返回值，
這將是一個略 不同的程序。
它會工作。
但是，我們想要做的是什麼 所謂改變的東西的地方。
因此，我們要真正 更改框，不用擔心
關於有回 值或任何東西。
行？
>> 這就像交換功能 大衛表現在課堂上，除了我
只處理一個變量。
他用了兩個，所以整數a和b 然後臨時變量和諸如此類的東西。
行？
那麼什麼是最後一行？
後到5的回報，這是 簡直就是一個將要消失。
我們將不具有了，並 只有X仍然會生活。
>> 你猜怎麼著？ X 並沒有改變它的值，
畢竟，因為我們 只改變a的值。
這就是為什麼x為3貫穿始終。
行？
不錯。
所以這個方案不 達到我們想要的。
現在讓我們來解決它。
>> 而修復程序是使用指針。
我們做的是我們有三個 線是不同的。
首當其衝是我們不通過X。
我們通過x的地址。
因此，而不是複製過 框的值，
我仍然要複製過來的東西。
不過，我複製了 盒子的地址。
>> 所以，如果我通過的地址 框到五，然後到五
將可以發現，在 內存和改變它的值。
>> 所以，再在那裡，我有 一個不是int了。
a是一個int明星。
這是一個指向整數的指針。
然後，因為我傳遞 在這裡討論，然後我做什麼
是不是等於5，因為 一個是抱著一個地址。
所以，我想要做的是去那裡 更新此地址的內容
5。
>> 好了，讓我們通過 所有的線逐個。
所以，當我從這裡開始，我 還有N / A，N / A，N / A
一切在第一 行，因為我還沒有真正
申報的東西呢。
然後線兩條，我有x等於3。
一個int值，明星不存在， 同樣的事情之前。
>> 現在，它變得有趣。
所以，我要過去。
讓我們假設地址 x的是十六進制12。
讓我們姑且認為此。
我做了起來。
那麼，我路過這裡是一個五。
我路過12。
>> 那麼什麼樣的價值做了有哪些？
>> 學生：[聽不清]。
>> 賓基：對不起？
>> 學生：[聽不清]。
賓基：是啊，像，以讓我們 假設我們在這裡，現在。
我問。
>> 學生：[聽不清]。
>> 賓基：它已被啟動。
>> 學生：[聽不清]。
賓基：因為我們通過 東西向的功能。
是嗎？
>> 學生：x的地址。
賓基：這將 有x的地址。
和x的地址是12，良好。
所以x為將是3，因 我們還沒有真正改變X呢。
然後將是12H處，所以 x的地址，因為這是
我們通過向5什麼。
>> 然後會發生什麼 如果我們試圖去那裡？
我們怎麼找？
因此，如果您嘗試打印一個明星， 我們要按照這個地址，
並得到裡面的值。
和值僅僅是 使得x的值相同
有因為這是 x的地址，這將是3。
我們是好？
>> OK，然後現在，我們實際上去那裡。
我們更新什麼 是在這個地址12。
我們讓5。
所以，現在x和明星有5個。
>> 這是為什麼？
因為x的地址是12。
和一也具有12作為它的值。
所以，如果我們按照12，我們 只是要找到X。
所以，無論我們做 明星會發生什麼
為x，因為一個包含 x的地址。
行？
>> 這就好比修復的關鍵。
所以，現在我們能夠， 從五，實際
存取存儲器住在主。
因此，該內存不能住到 5，像以前一樣，這個地址12。
而我們能夠去那裡 並改變其值設置為5。
>> 然後當我們返回時， 我們忘記了一個。
我們忘記了明星。
和X仍然是5。
所以，如果你想 實現交換功能，
你只需做同樣的事情， 除非你需要在這裡詮釋星，
等，等等。
行？
我們是好？
涼爽。
>> 所以，指針運算。
這是一個稍微棘手的話題。
所以，事實證明， 指針只是整數。
你可以把它們看作整數。
由於在內存中，你有一個像 存儲器地址的零個，一個，兩個，三個，
四，五。
因此，我們可以總結的內存地址。
>> 而這通常是你做了什麼時 你在與陣列，例如。
陣列就像是一個連續的 地段字符的內存塊，
例如，大量的整數。
所以，如果你想要去的 第二個int或到第三INT，
你可以總結一些東西到第一 地址，你會到達那裡。
所以這是真正有用的。
>> 而事情保持 記住，雖然是
它不只是喜歡 在這個意義上正常算術
如果你正在處理的，說， 一個int明星，你把它加1，
那麼你不會 加1到地址，
你要添加4到地址。
因為int是4個字節。
>> 因此，這就像 走在陣列上。
如果我們有大量的int數組和 那麼我們嘗試去到第二個，
它基本上只是求和 第1加1的地址。
但是，這不會be--只是假設 這是第一個的地址是4。
這裡，在這種情況下。
如果我們總結，所以這 是發生了什麼。
我們有一個int。
詮釋x等於5。
X有一個值5。
我們初始化這個指針，整型 ÿ整數明星Y等於X的地址。
>> 讓我們假定x的地址為4。
有什麼事情發生 現在如果我總結加1到y？
這將實際 之4，而不是僅僅1。
所以我添加了一個1，但它實際上 加4，由於計算機的智能。
因此，它會實際上是由我添加時間 指針的類型的大小。
行？
>> 所以，如果它是一個字符，例如， 如果這是一個char明星Y，
如果我們增加1，那麼這將 是如圖5所示，因為char是1字節長。
好不好？
>> 終於，我們到了 指針和數組。
事實證明，每一次 你正在處理一個數組，
你實際上是在處理一個指針。
非常漂亮的概念的理由 這是一個數組是非常大的。
因此請記住我說， 每次你繞過的東西的時候，
您複製的一切。
所以，如果你有一個數組 這是真的，真的大了，
你真的不想要 複製一切，每次
你把它傳遞給身邊的另一 功能，因為這只是
大量的工作。
所以你要做的就是剛剛過去的 的第一個字節的地址。
然後該函數將可 在該數組中的所有元素。
所以，你通過了數組的地址， 這樣的第一個字節的地址。
>> 因此，如果我們宣布INT 排列3，在這裡，我們知道
如何訪問所述第一元件 用括號表示法。
如果你還記得的支架 符號，陣列支架0等於1。
那麼，這將是完全 一樣的只是去那裡，把1。
OK，是完全一樣的東西。
所以在這裡括號表示法 將是相同的，因為這行。
>> 你猜怎麼的括號表示法 對於陣列支架1會是什麼？
這也只是同樣的事情，因為這。
所以，增加一個陣列。
移動一個沿在內存中。
去那裡，並把2。
行？
而這條線是一回事。
我們要進入第三 中，所以數組加2。
去那裡，並把3。
所以在內存中，什麼是 事情發生是我們
將有1，2和3作為 這個數組的三個元素。
>> 我們可以做這樣使用 我們熟悉的括號符號。
我只想你們知道 他們是同樣的事情。
好了，關於這個問題嗎？
不錯。
現在，我要出手 它交給漢娜，
>> 漢娜：耶，飴，山楂。
>> 賓基：談 內存條的東西。
[掌聲]
>> 漢娜：你好，性涼，所以我們 要談多一點
關於內存，這是我們剛剛 解決使用指針。
因此，有兩個主要部分 記憶是我們關心的。
我們具有層疊，生長 在底部，堆，其
隨著從頂端向下。
和棧將舉辦 我們所有的實例變量。
因此，每個調用一個函數獲取 自己的小幀在堆棧中。
因此，作為加布前面提到的，如果我們 一次次調用該函數，
我們將堆棧 事情在堆棧中。
>> 同樣，堆， 這開始於頂端
將要舉辦的所有記憶 我們動態分配。
所以當我們動態 分配內存，
這將回落走向底部。
幾件事情要注意的時 我們使用了棧和堆，
與堆棧，如果我們有太 many--讓我們say--遞歸調用，
而且我們再次調用一個函數， 又一次，又一次，又一次，
而且它疊加起來， 堆放，堆放。
而且它要撞上了堆。
我們將耗盡內存。
這是怎麼回事引起 問題的計算機。
這就是所謂的堆棧溢出。
所以，這絕對是你 應該認識到，並盡量避免。
和堆，一定要記住 不小心洩露內存。
您使用的malloc任何時候，不要 忘記釋放內存。
否則，它會只 上浪費了一堆，
和電腦將不知道 它是可以自由地使用該存儲器。
因此，這些都是有兩件事情 要非常小心，當
你處理 棧和堆。
這個有問題嗎？
真棒。
>> OK，爽。
所以這類具有相同的 想法是堆棧溢出，在那裡
我們要超越 什麼內存邊界
是我們應該能夠使用。
因此採取，例如，緩衝液，或者你 可以只把它看作是一個數組。
和我們說，好了，我們要 創建這個可愛的小陣。
這將是一個字符串。
或者，它會存儲字符。
它只是會打個招呼。
而且它是不確定的。
就是這樣。
>> 但如果我是邪惡的人，想 做壞事與此陣，是什麼
我所能做的就是盡量寫 過去的字符串的末尾。
正如你所看到的，如果 我寫的遠遠不夠，
其實我可以影響 返回地址。
如果我開始影響 的返回地址，
我影響程序的實際運行方式。
而不是和返回，你 眾所周知，一個幸福的串像你好，我
可以做壞事一樣去 其他地方的計算機，仍然
記憶，改變它， 無論我想做的事情。
所以，這就是這個看起來像 是正中下懷，如果我填起來
隨機垃圾的價值， 在這種情況下，僅僅一個。
然後其實我 到了存儲器地址，
我開始與一些加油吧 這確實是我想要做的事。
與緩衝區溢出的問題嗎？
真棒，飛行權 通過這個東西。
>> 好了，我們談了很多 約在終場前加布。
我們如何真正得到一個指針？
我們怎樣才能在內存中的地址？
好了，我們可以使用這個漂亮 函數調用malloc的，這
是會得到一個 小片的內存，
特別是在 堆，正如我們所討論的，
而且它會給你回 指針在存儲器中的地址。
和參數，我們 不得不放棄對malloc
是我們多大的空間在內存中想要的。
>> 所以，你可以看到在字節大小。
比方說，例如，或 實際上，在這個例子中，
我們分配足夠的 空間10的整數。
所以可能我們會想 把這裡的10個整數組成的數組。
所以我們給它int的大小，這 我們學到了多少字節？
學生：4。
漢娜：4，美觀，而且我們 要10中的那些行，
因此，我們有足夠的空間來 存儲所有的10個整數，在這種情況下。
一些超級重要的， 任何時候你調用malloc，
你要檢查空。
如果你不檢查空，好了， malloc的，如果它運行的空間
並且再也不能給你任何 更多的內存，它會返回null。
所以，如果你不檢查， malloc的可能返回null。
然後，如果我們試圖 取消引用空指針，
我們將得到一個段錯誤， 我們將談論現在。
真棒。
>> OK，使用malloc問題？
是嗎？
>> 學生：檢查是否為空 [聽不清]不要在測驗做呢？
>> 漢娜：當然，問題是 它matter--的測驗，
你會獲得積分，如果關閉 你不檢查空？
是的，你會得到點關閉 如果你不檢查空。
任何時候你調用malloc，無論在 測驗和你的pset和在現實生活中，
你要檢查空。
很好的問題。
>> 蓋柏：如果我不自由是什麼？
漢娜：加布想知道 如果我們做的不是免費的。
然後，我們將有一個 在我們的堆內存洩漏。
還有沒有其他問題？
是嗎？
>> 學生：你 - 可以走了 緩衝區溢出一次真正的快？
>> 漢娜：當然。
現在的問題是，我們可以走了過來 緩衝區溢出的真快。
讓我們回到那些幻燈片。
所以緩衝區，你可以 認為它是一個數組，對不對？
你必須在內存中的一些空間。
當我們第一次創建我們的數組， 我們知道數組有固定的大小，
或者我們的緩衝區具有固定大小。
>> 所以我們說在這種情況下，我們剛 足夠的空間來寫字符串hello。
如果我們走過去的束縛，如果我們走過去 什麼我們的數組，我們說，它可能保持，
我們可以真正開始 寫入到內存
該計算機不 要我們寫進去。
具體而言，如果我們打 類似的回報
該函數的地址，其中 像任何其它塊的存儲器，
只是放在你的 電腦，你其實可以
改變這種狀況，並開始做邪惡的事情。
回答你的問題？
真棒，什麼事嗎？
是嗎？
>> 學生：所以棧[聽不清]，你 從底部所說的去往上走。
在堆棧範圍，不 從一樣的內存去，
自上而下涉及各個擊破？
>> 漢娜：如何看待你 - 推遲搶在這一個。
>> 羅伯：這將在同一生長 方向堆棧增長。
漢娜：OK。
羅伯：所以我感到困惑。
這將是抽象。
漢娜：OK。
羅伯：這是正確的。
因此，如果堆棧的增長 起來，然後generally--它
並不一定是這樣。 但是你可以聲明INT X。
然後，您聲明整數年。
然後整數x將通常是 較低的堆棧比INT Y開。
但是，這只是一個事實。
這不像一個重要種子的事情。
>> 羅伯：所以問題又是剛剛 發生什麼事每一幀積聚。
因此，每個函數獲取 小片疊。
正如你走了，內 小片，該幀之內，
我們說的變量 該框架內也動了起來。
問題？
>> 羅伯：只是要對麥克風。
漢娜：哦，是的。
羅伯：我會對著你。
漢娜：哦，是的，確定。
羅伯：是個例外 對於數組和結構，
其中陣列，低級 索引數組中，
而在結構中以較高的 在結構領域
保證是在低地址 比陣列中的購買值。
因此，這些都是保證。
但是在任何特定的變量， 如int x和函數中的INT Y，
有沒有必然的關係 他們的地址之間。
漢娜：在這裡還有一個問題？
學生：所以在緩衝 流，只有緩衝區溢出
只有當發生了你 有一樣，分配
陣列的量 說那麼大？
就像，你能嗎？
所以，如果你問了 從user--東西
>> 漢娜：嗯。
學生：他們能強行 給你的東西回來
這比任何大 你已經分配給他們呢？
漢娜：當然，這樣的 問題是根本，
可以在用戶給你 比你要求什麼呢？
學生：是啊。
漢娜：嗯，你可以阻止 從做用戶。
你能具體說了不 給我更多的不是通過字節×號
我只給你空間X號 字節，X字符數。
所以這是要防止的東西。
是嗎？
之間的區別是什麼 堆棧溢出，緩衝區溢出？
>> 漢娜：OK，所以堆棧 overflow--哦，是什麼
是堆棧之間的差 溢出，緩衝區溢出？
因此，我們要思考的堆棧溢出 發生的事情，當我們真正
堆放這些函數調用。
比方說，你有一個遞歸函數， 因為我們知道，你的每一次
調用一個函數，它得到 自己的幀在堆棧中。
>> 因此，我們堆起來太高了， 然後我們開始溢出。
而我們使用太多的內存，並且 我們沒有在任何地方留下。
我們得到這個錯誤。
>> 緩衝區溢出是程序中。
我們想未必有 以相同的方式運行的內存
我們可能如果我們疊放 這麼多的函數調用，
但是我們過去寫的記憶 我們知道我們可以使用。
並允許我們做邪惡的事情。
是嗎？
>> 羅伯：是的，你可能想 只是重複這一點，
但你也可以認為 堆棧溢出
如象一個特定類型 緩衝區溢出。
或者你只是想你 堆棧作為一個非常大的緩衝區。
然後，當你漫過你疊， 這有點像一個緩衝區溢出。
但堆棧溢出只是一個 特定術語使用的堆棧時，
本身的溢出。
>> 漢娜：對，所以要 重複的視頻，
它，你能想到的堆棧溢出的 一種特定類型的緩衝區溢出。
很酷吧？
任何問題之前，我們去？
真棒。
>> OK，很酷，所以讓我們來談談 一些常見的錯誤信息。
這是值得擁有 在多個測驗顯示了，
這樣的東西，值得 取二看。
我敢肯定，你已經遇到了 至少其中的一些
因為你做你的習題集。
所以一定要確保你可以談 關於他們的測驗。
>> 所以，第一個是 分段故障。
這就是任何時候我們 嘗試訪問內存
那我們不允許訪問。
所以，你migh已經看到了這一點， 例如，在突破。
如果檢測到碰撞 返回null，然後你
嘗試做一些事情 與空值，
電腦會給 你分段故障。
所以有一個重要的事情 做才能盡量避免這種
要經常檢查是否為空。
>> 你可能也看到了 函數隱式聲明。
因此，這是什麼情況 當佳佳向您展示
我們如何做一個原型，對不對？
所以我們可以說我們有一些 函數，我們定義。
比方說，多維數據集。
而且去底部 我們的功能，在主。
>> 如果我們忘了告訴電腦 多維數據集，主要在嘗試調用立方體，
電腦會一樣，哦，我的天哪。
我不知道這意味著什麼。
我不知道該怎麼辦，在這裡。
因此，原型說不用擔心。
我要告訴你。
>> 它會來的。
不要罵我。
不要給我一個隱含的 申報功能。
所以，如果你得到這個錯誤，一是 事情你會想要做
為確保你有你的原型。
行？
>> 最後但並非最不重要的， 未聲明的標識符
基本上，當您嘗試使用 你沒有聲明的變量。
所以，突然你開始 他說像n與加。
和電腦說什麼是N +
你從來沒有告訴過我ñ是一件事。
>> 這麼一件事，你必須確保你 所做的是告訴一下，n是計算機。
因此，例如，n可以是一個整數。
然後你會避免這個錯誤。
在常見的錯誤有問題嗎？
是嗎？
>> 學生：對於隱 聲明函數，
難道也是你省略1 圖書館的你應該
以包括，而不是原型？
>> 漢娜：對，所以在 問題是，你能不能
也得到這個錯誤，如果你 忘了包括圖書館。
>> 學生：是的。
>> 漢娜：當然， 因為以相同的方式
我們希望把我們的原型 在main函數之前，
如果我們有一個庫中，那些打算 基本上包括了原型，
包括定義 的功能。
大的問題。
>> 學生：對於分割 故障，將也
發生，如果我們一樣，試過 訪問一個變量，
等，以不同的[聽不清] 比它在聲明？
漢娜：當然，所以我們會 得到段錯誤
如果我們試圖訪問一個 變量超出了範圍？
那是個問題嗎？
學生：是的。
漢娜：美麗的。
所以很可能，你會得到一個 未聲明的標識符錯誤信息。
所以它只是會說 我不知道那是什麼。
爽，什麼事嗎？
是啊，好，漂亮。
>> 所有用右手，所以遞歸。
所以我提到幾次 我們可能會得到一個堆棧溢出
因為我們調用我們 遞歸函數這麼多次。
我們正在所有這些堆棧 框架，等等，等等，等等。
什麼甚至是一個遞歸函數？
那麼，一個遞歸函數是 調用本身的任何功能。
>> 有些事情要注意的，當你 正在執行遞歸函數，
不要忘了包括基本情況。
一個基本的情況是 點，我們結束了。
所以，例如，如果我們的編碼， ，說，斐波那契遞歸，
我們要確保，當我們得到 到0或第一斐波那契數，
這兩個數字有這些情況下， 因為那些不依賴
在東西來到之前。
那些有自己的價值觀。
>> 有的優點來遞歸，這是一個 我們已經看到在過去的測驗問題。
它們可以導致更 簡潔，優雅的代碼。
和很多功能，一 許多不同的算法，
其實借給自己遞歸。
它們的定義可能是 在遞歸本身。
所以，斐波那契就是其中之一。
階乘是其中之一。
合併排序是埃德蒙頓所有 東西，你可以看看。
OK，什麼問題？
是嗎？
>> 學生：是的一角情況 類似於基本情況？
或者是，對於一些其他 種[聽不清]？
>> 漢娜：當然，這樣一 角落裡的情況是any--如此
是角落的情況下一樣基本情況？
一個角落的情況是什麼，你的 代碼的行為可能有點不同。
排序的基本情況是相關的，在 他們就像特殊情況
你想看看。
但是，一個基本情況的想法是， 你希望你的遞歸函數
停在某一點。
它不能讓自稱永遠。
它需要停止在某一點。
>> 羅伯：是的，頻繁的，您的基本情況 可能的轉角鹼的例子。
>> 漢娜：對，冷靜，什麼？
>> 學生：你能解釋一下 立足多一點點？
我不太明白 [聽不清]基地的情況。
>> 基地情況：漢娜？
>> 學生：基礎的情況下，是的。
>> 漢娜：哦，是的，肯定的。
讓我們來看看。
我們有粉筆在這裡？
是的，我們做的。
好了，真的很快，我就 試著寫夠大
這樣你就可以在屏幕上看到。
讓我們來談談，真的 很快，斐波那契。
所以，我給你的Fibonacci序列。
你可以看一下定義。
>> 本質上，序列中的每個數 是前兩個數字的總和。
OK，這樣的方式，我 剛才描述的斐波那契，
你能聽到的遞歸，對不對？
當我說的每一個號碼是 前兩個數字之和，
我們可以說OK。
那麼，第n個斐波納契 number--讓我們
說我們有這個功能 所謂的n fib-- FIB
將是等於謊 為n減1 plus--對不起，
我們將繼續到下一行 在N減去2這裡 - FIB。
>> 好了，這個工程很大，如果你 看，例如，零個，一個
兩個，三個，四個， 第五斐波那契數，
在那裡，你可以說， 圖5是等於2加3。
但是，如果你一開始是什麼？
如果你只是打什麼 前兩個值？
>> 為了得到這個1，你不能 說加了前兩個，
因為零還有 - 我不知道。
所以在某些時候，我們需要停止。
在某些時候，我們需要指出，這些 兩者正好有自己的定義。
0斐波那契數為0。
和第一斐波那契數為1。
>> 因此，這樣我可能會編寫這一點，我 會說，如果n小於2，
然後就返回否。
這將是我的基本情況。
這就是我怎麼知道停止 用一個遞歸函數。
清楚了嗎？
真棒。
別的遞歸？
美麗。
>> 讓我們趕緊說說 搜索和排序的運行時間。
然後我會給一些達文 時間談論編碼的例子。
因此，這裡是主要的搜索和 各種各樣的，你應該知道的。
Guarantee--我不能保證， 因為我還沒有看到quiz--
但出現競猜 測驗後，後退出。
所以肯定使用這個表。
像，藉此圖。
把它放到你的備忘單。
你會成為一個快樂的人。
>> 這告訴我們，每一個運行時間 這些排序和搜索算法。
所以線性搜索，你可以看到運行 時間，並且同樣與二進制搜索。
去了一下這些算法 這樣做，一般的想法。
看一些偽代碼， 如果不是代碼本身。
>> 你會看到，冒泡排序有上 束縛在n的最壞情況的平方。
所以，如果我們的數組是完全 倒退之前，我們想對它進行排序，
我們會說，這是 要取n的平方的步驟。
但是在最好的情況下，這樣的 下界為最好的情況下
將是，如果它是 已經完全排序。
那麼我們需要做的就是 檢查它的排序。
有一個問題在這裡？
>> 學生：什麼時候 要使用排序？
排序。
我只是好奇。
>> 漢娜：當你 要使用選擇排序？
這本嗎？
即n值的平方在這兩種情況下的人嗎？
>> 學生：[聽不清]。
>> 漢娜：所以這是非常不同的。
如果您有具體 為您的程序要求，
喜歡的東西，如果我們剛才說的一樣 實施搜索 - sorry--
實現一個排序，你會 大概想去
對於那些一說 具有n個最好的情況下，
或下界中n的最佳情況。
但也有可能是 喜歡，比方說某些事情，
掉期交易是真的 昂貴的某些原因。
然後，你會想要做的 冒泡排序，因為你
有這麼多 掉期之類的東西。
任何other--是嗎？
>> 學生：難道[聽不清] 說[聽不清]？
漢娜：這是一件事 這將告訴你
如果你正在尋找的實施。
順便我真的 想想為什麼它的ñ
方是我們必須要運行 通過我們的長度為n的數組，
每次做最多，正掉。
而我們要做的這個過程n次。
>> 所以，當你必須做出最多，正 掉期和n個貫穿陣列，
還有的要為n的平方。
但是，是的，這將揭示 通過這種雙重for循環，
因為這個問題asked--或 嵌套的循環，我應該說。
行？
>> 然後歸併排序，其中 是最快的排序，我們現在，
或者說，我們已經介紹了在CS50， 知道主算法是
這個想法闖入了 排序的片，然後
這些分類的位合併在一起。
並讓我們日誌N日誌N。
在搜索任何疑問和 排序之前，我通過它？
讓我們來看看。
>> 哦，鍊錶。
對不起，我多了一個話題。
OK，真棒，鍊錶。
問題的陣列， 它們具有固定的大小。
所以，如果你不知道有多大 您輸入的將是，
你不想創建一個數組。
因為如果我們創建一個 數組太小，
我們可能會遇到緩衝區溢出。
>> 因此，不是，我們可以做些什麼 用鍊錶，這
使我們能夠動態有 大數據結構
這將允許我們存儲 更靈活的數據量。
因此，在每個節點中我們 鍊錶，我們有兩件。
我們有它存儲的實際值。
所以這就是剛才的事情你會 看該陣列中，例如。
然後我們也跟踪了 指針在內存中的下一件事。
>> 不像數組， 我們知道都去
以be--數組元素都是一個 相繼在memory--鏈接
列表可以在內存中的任何地方。
他們的任意位置。
所以，如果我們要 實際上去找他們，我們
需要跟踪的 在我們的名單接下來的事情。
>> 然後才能知道 如該表作為一個整體，
我們所跟踪的是 在我們的鍊錶的第一個元素。
而這將讓我們能夠堅持到底。
>> 因此，這是你如何可以定義一個模式。
這是一個很好的機會 採取結構的優勢。
因為你有這樣的想法，那麼， 對於給定的節點，我有兩件。
我本身的實際價值。
然後，我有一個指針 在鍊錶中的下一個元素。
所以你看，我們有一個整數n， 這將是實際值，
然後指針 一個節點，稱為下一個。
所以這將是下一個 元素在我們的鍊錶。
學生：是的？
你有沒有指定 明星就像是一個結構？
>> 漢娜：是的，所以因為這 幾乎就像一種，
這似乎是一個遞歸 在我們的定義
需要知道什麼是節點 內找到一個節點。
因為它實際上並不 知道一個節點是完全
直到我們得到this--年底 而在此之後，我們可以叫它
本定義內的node--， 我們需要把它稱為一個結構節點。
大的問題。
還要別的嗎？
是嗎？
>> 學生：為什麼我們 不得不說結了兩次？
因為當我們在[聽不清] 我們剛剛做的分號，
但現在我們必須找到 結構節點？ [聽不清]。
漢娜：所以我相信 在最後一個例子，
我們只是創造任何時候你 希望之後，要使用一個學生，你
只好用結構node-- 我sorry--結構的學生。
這使我們能夠，事後，就 使用節點添加一個新的類型，基本上。
這有意義嗎？
因此，我們不得不回去 之前看一下代碼。
但我猜想， 我們沒有使用的typedef。
我們問這個問題， 為什麼我們需要使用的typedef？
的typedef使我們能夠避免 字結構的開端。
是嗎？
學生：是什麼樣 問題就來了
中在以下方面而言 節點和鍊錶？
>> 漢娜：那麼有一件事是我們可以說如何 也許你通過一個鍊錶搜索？
OK，因為它是一個 稍微複雜一點
比如果我們正在尋找 通過陣列。
我們只要看一下元素為零， 元素1，元素2，等等，等等，
等等。
如果我們要搜索 通過一個鏈接列表，
我們會居然要遵循 指針的這個小迷宮。
因此，讓我們真正去 通過這個真的很快。
我們可以做的 訂購to--假設我們
只想遍歷 我們完全鍊錶。
我們將開始在頭部。
然後，以 移動到下一個元素，
而不是僅增加一 就像我們可能會在經歷一個數組，
我們究竟要 按照下一個指針，
因此，我們可以找到在哪裡 內存中的下一個元素。
所以，我知道這是不夠的 採取這一切，現在，
但你有這些幻燈片。
所以，你可以通過 這一點更慢。
但實際上，我們想要的 要做的就是遵循這些指針
通過該鏈接的表中的全部內容。
因此，這是一個問題 你可能會問。
>> 東西要注意 插入，讓我們說
我們希望把一個新元素 在我們的鏈接列表的前面。
我們必須非常小心， 關於順序我們
重新分配的指針。
因為我們說，我剛才說的確定。
做頭指向這個新元素。
只是使它指向1以後，我們 基本上失去了列表的其餘部分，
因為我不記得在哪裡2的生活。
>> 所以，我們要做的 非常特定的順序。
首先，我們提出新的 元素指向頭部。
然後我們做了頭 指向新的元件。
所以，讓我們來看看是什麼樣子 與arrows--就這樣。
所以，你首先得新 元素指向老臉。
而現在，我們有頭 指向新的第一個元素。
這個有問題嗎？
>> 確定這裡的一些代碼再次，一些 看著有點後。
現在我會把它交給達文 為GDB和實踐一點點
編碼在紙面上。
美麗。
>> 羅伯：和Rob。
>> 漢娜：哦，達文和Rob。
對不起。
>> 學生：嗚！
>> 羅伯：謝謝。
>> DAVIN：你想說的話 一切真正的快？
羅伯：是啊，是啊。
DAVIN：一旦我了。
OK，而羅布放 麥克風，有啥GDB？
每個人都應該看到在GDB 類以及在辦公時間。
你應該使用它。
那麼，什麼是GDB？
任何人？
>> 學生：這是一個調試器。
>> DAVIN：這是一個調試器。
又是什麼讓你做什麼？
喜歡，為什麼我們喜歡GDB？
學生：要減慢程序。
DAVIN：對，所以你可以走 通過它像人類的步伐。
還等什麼一些 命令你可以做什麼？
好了，休息可能是 你最喜歡的命令。
因為這可以讓你打破 程序，並通過它實際上走
一行行。
>> 運行允許你運行它。
接著，就像踩著通過。
下一步做什麼和步驟之間的的？
等待，很大聲地說。
這是正確的。
>> 學生：[聽不清]。
>> DAVIN：是的，真棒。
所以像，旁邊並步，如果you're-- 假設你有一個函數，你
定義。
比方說，一些在主函數， 而你只是打下一步，下一步，
下一個。
你究竟要 執行該功能，
但你要跳過去。
如果你打的步驟，或 s或什麼的，你
要真正跳 進入該功能，
然後你就可以打到旁邊 看到不同的呼叫
內的特定功能。
是嗎？
>> 學生：有沒有一種方法 跳一樣，退了出去？
DAVIN：完成，是啊， 與完成跳躍你。
所以它要完成的 功能，然後你
將回到在主，例如。
打印將其打印出來一次。
這是我經常使用的顯示器。
顯示器將它打印出來 不斷地貫穿整個
你的程序。
>> 例如，如果你是 在fo​​r循環中，你
想看看有什麼地方改變， 你不希望一樣，不斷
可以做這樣的打印， 印刷，打印，顯示
將顯示該變量 不斷，每次點擊Next。
並繼續。
因此GBD，這是GDB。
>> 學生：什麼是一個 在這裡你[聽不清]？
DAVIN：這是什麼？
>> 學生：什麼是the-- 的局部變量。
羅伯：也有一些是實際 像當地人什麼的。
我can't--
>> DAVIN：這可能是 類似的東西，是的。
>> 漢娜：在當地人？
>> DAVIN：就是這樣。
這是一個。
羅伯：美麗的。
>> DAVIN：是的。
>> 學生：這是什麼做的下去？
>> DAVIN：這continues--所以它只是 要繼續你的節目。
所以，如果你打破，打 繼續，這是怎麼回事
只運行該程序，直到 它再次達到了突破。
因此，例如，如果 打破了一個函數，
而你要做的像 環或類似的東西，
而你繼續打，這將 繼續回到那個破。
或者有沒有突破，這將 繼續並完成該程序。
>> 羅伯：所以就像停止運行 在第一個斷點
你打，如果你再 繼續打，它會不斷
去，直到它的下一個斷點。
然後繼續會 到下一個斷點。
DAVIN：在GDB還有沒有其他問題？
所以我認為，在過去， 我們問你什麼
GDB是，給一個 例如有些事情你
可以用GDB做，所以 很簡單的，但是，是的。
你去那裡。
和節點？
>> 羅伯：是的，所以它的方向是什麼呢？
學生：就是這樣。
DAVIN：等待。
羅伯：這傢伙？
DAVIN：那一個。
羅伯：這傢伙，哦，我不知道。
因此，我們並不清楚 對我the--不
誰知道它was--，但這個問題。
我們不知道到底是什麼你 在問這個問題，所以只是
澄清一些事情。
因此，首先，就像我之前說的， 類型定義你總是只用正
創建一個暱稱為一個類型。
所以在這裡，這個綽號我們 創造是這種類型的結構節點。
>> 因此，首先，忽略此的節點 類型定義，所以這個結構節點捲髮
振奮下降到下一個捲髮 支架是結構節點類型。
我們需要的節點 在那裡，因為我們
需要參考節點位置。
所以用這種遞歸結構的， 你需要給這個結構的名稱，
否則你不能 說結構節點在了這裡。
而與之前的學生 當我們打字，我認為，
我們沒得說 學生在那裡，因為我們
沒得說的結構 學生本身的結構裡面。
因此，它是遞歸的 迫使我們要說的節點出現。
>> 這個節點僅僅是我們的名字 給節點的類型定義。
使節點不 相同的節點。
但這種結構節點是 相同結構的節點。
DAVIN：所以每當你打電話， 像，在主功能節點，
你不會 不得不說結構節點。
你可以說節點，因為 節點是一個different--基本上
你說好不好。
而不必調用 在我的代碼結構的節點，
我只是想將其重命名 作為節點，使其更容易。
>> 羅伯：如果你總是 使用的typedef，那麼這
是你要擁有的唯一的地方 申報與結構節點變量
明星，是的。
>> DAVIN：OK，所以最後一部分 是很難教因為 -
羅伯：什麼？
>> DAVIN：因為它的編碼在紙面上。
所以每年我們 在紙上的問題代碼。
所以我認為，去年12出 80分是在紙上的代碼。
一年之前，10出80， 一年之前，20（總分100）
所以相當多的這些。
所以，你要必須能 手工編寫向上這些功能。
>> 所以我想我們可能會經歷一個 他們夫婦，看別人怎麼做，
通過種行走 他們慢慢地與人交往。
所以一般情況下，strlen的和 ATOI已經非常流行。
去年，我覺得我們有 GetPositiveInt和RandomInt。
但POW，所以功率，也 一個積極的了。
就讓我們通過可能 一個或兩個這些在一起。
什麼人想看？
>> 學生：ATOI。
學生：是啊。
DAVIN：ATOI？
學生：[聽不清]。
DAVIN：OK，我要去 這樣做在黑板上。
你有偏好 如果我在這裡或那裡做呢？
在那裡，加布說，有。
>> 羅伯：這是一般的想法 在這些編碼的問題。
嘗試寫一些東西。
不要讓它空白。
>> DAVIN：是的。
羅伯：如果你能得到的 返回類型正確，
也許我們可以給它 你，但如果你能一樣，
寫一般的函數簽名， 如果你能得到基礎的情況下正確的，
或角的情況下，或 記憶的空檢查，
只要你有一定的 事情的話，說不定我們
可以給你一對夫婦 分的問題。
不要讓它空白。
>> DAVIN：是的，如果你 只是完全
難倒在如何 居然變成代碼。
如果你寫的偽代碼， 這是相當不錯的了。
所以它的樣子，它是一個6點的問題， 你寫出正確的偽代碼，
你會得到至少兩分。
所以，不要只是將其留空。
盡量把一些東西。
>> 羅伯：它需要的 正確的偽代碼，但。
>> DAVIN：是的。
羅伯：所以我們一般都不太 寬大的偽代碼的bug。
DAVIN：好了，你們 想看看ATOI。
OK，所以才really-- 所以你想要做什麼
是你要會 鑑於某種數量。
但這個數目是不 將是一個int，不是嗎？
它是什麼打算呢？
>> 學生：[聽不清]。
>> DAVIN：這將是一個字符串，對不對？
所以，如果你被給予 一個string--讓我們say--
>> 羅伯：我應該拉了一個編輯器？
我可以拉up--
>> DAVIN：哦，你想這樣做on--
>> 羅伯：你寧願板？
>> DAVIN：你想怎麼辦？
我的意思是，你想不想做手工嗎？
或者你想用電腦做呢？
>> 羅伯：手工做的。
>> DAVIN：[笑]
羅伯：手工做的。
>> DAVIN：OK，所以這將是ATOI。
那麼，什麼是它 - 我的意思是，我們將 可能是你給這個。
但是，什麼是它要回來嗎？
>> 學生：詮釋。
>> DAVIN：這將返回整型，對不對？
So--我並不想這樣做在那裡。
我會在這裡做。
>> 羅伯：你可以拉下來 然後向上推就可以了。
>> DAVIN：是啊。
[笑]遊戲的變化。
好了，這將是int ATOI， ，什麼是它要採取？
一個char明星，所以只是一 串，星星S，這樣的。
>> 羅伯：尼斯明星，漂亮。
DAVIN：這可能不是沒有，OK。
羅伯：是啊。
DAVIN：OK，所以第一 事情要do--我
不知道有沒有人看 在實踐中solutions--
但是你要什麼 想要做的就是你
會希望有 一個循環，因為你
會想實際 單步執行該字符串。
所以helpful--所以我們說 我們要一個for循環，
而且我們要通過一步 串中的每個元素。
是多久呢？
多少次我們要 在fo​​r循環遍歷？
學生：Sterln？
DAVIN：Sterln，是的。
所以我們可以說INT長度等於sterln秒。
而只是好奇，為什麼它總是一種 更好的做到循環這外面？
像，為什麼它更好地叫 一環以外的這個功能？
只是一個快速合理性檢查？
是嗎？
學生：所以你不 要繼續檢查它。
你可以[聽不清]。
>> DAVIN：沒錯，所以是的， 她究竟說了什麼​​。
所以，我們沒有繼續檢查它。
因此，舉例來說，如果我打電話 這個功能在循環中，
然後我會不斷的打電話 這個函數多次。
而這將降低 你的程序的效率。
因此，它總是有用 對外界宣稱它。
>> 羅伯：這是說，在 任何這些問題，
幾乎只要你得到一個 工作液，你得滿分。
所以，如果你的設計不用擔心 絕對是可怕的。
它可能使我們心煩 閱讀你的代碼。
但只要它的工作原理， 你會得到積分。
>> DAVIN：是的。
好了，然後我要去 聲明一些變量。
它只是要調用int總和。
而且我要設置這個 等於零，那樣。
而這只是要 是一個佔位符。
所以這將是 我什麼都返回。
所以我打算最終 返回總和這一計劃的。
所以，我有這兩個變量。
我有長度。
我有一筆。
現在，讓我們跳進我們的字符串。
>> 所以讓我們有我們的for循環。
所以4 INT I等於0 W，而 我是小於長度我加再加。
和now--
羅伯：尼斯。
DAVIN：OK，現在這裡 說到我們的代碼肉。
所以，你實際上可以做 這基本上是在同一行。
因此，沒有任何人有一個想法 是什麼，我們要怎麼做？
好吧，沒關係。
因此，我們正在做的說的總和equals-- 讓我飛奔這over--總和
等於總和乘以10 plus--我們 要帶的I減一
報價1報價完成的，這樣的。
羅伯：非常直觀。
>> DAVIN：粉碎它。
好了，someone--我得到了它，我得到了它。
好了，這顯然是往上走。
這是什麼意思？
因此，沒有任何人知道這是什麼意思？
大家可以看到這個？
不，沒有人能看到這一點，OK。
我要去to--
>> 羅伯：我打算寫的 公式只是在這裡。
DAVIN：OK，羅布的要做到這一點 在電腦上，這是有趣的。
羅伯：哦，我的上帝。
不然我不會。
DAVIN：待機。
學生：我有一個問題。
DAVIN：是的，當然。
學生：[聽不清]？
DAVIN：OK，所以它實際上是， 像，只是在一般情況下，
如果你把一樣， 在此聲明INT
我等於0逗號長度 等於sterln，that--
>> 學生：[聽不清]。
>> DAVIN：這很好，因為that--
學生：你為什麼會 即使需要使用長度是多少？
我們為什麼不能只是[聽不清] sterln S，就像整個時間[聽不清]？
>> DAVIN：你的意思是在這裡？
>> 學生：是的。
DAVIN：因為每 這個時間循環運行，
它要評估這種狀況。
學生：對。
DAVIN：如果你有 sterln存在，那麼它的
不得不實際調用 該函數每一次。
因此，而不是只 它比較為int，
你會被調用 函數，然後比較它
到的返回值。
是啊，所以它的公正，是啊。
>> 不錯，好了，現在每個人都可以看到它。
什麼does--這就像，這是它。
這是果醬，就在這裡。
這意味著什麼？
我在做什麼？
是啊，一個想法？
是嗎？
>> 學生：嗯，所以當 你進入一個數組，
你將要去 從左至右，
所以你將要前往的 從按下[聽不清]小數。
DAVIN：沒錯。
學生：所以每一個 你要乘
你看到的整型的值 到時候你就會繼續前進，超過1。
>> DAVIN：完美的，完美的， 因此，例如，讓我們
說我給你 - 我 會寫在這裡了。
不，我不是。
我要在這裡寫了。
比方說，我給你76吧？
比方說，我給你76。
這是一個字符串開始，好不好？
>> 那麼長的是什麼？
2，對吧？
總和為0。
然後，我們在跳躍的循環。
行中，在第一次迭代 這一點，它是什麼打算呢？
這將是總和為0。
所以，綜上所述次10 0。
這是毫無意義的。
那麼，這是什麼呢？
學生：[聽不清]。
>> DAVIN：這將反過來說 字符轉換為整數，對吧？
這有點像你 set--這個light--問題
它有點像用 問題設置的Visioneer。
你正在處理的ASCII值。
所以，如果我給你一樣，一 7，但它是一個字符，
你想知道， OK，有什麼數字是什麼？
是的，你可以，是的。
那麼，什麼數字是什麼？
你可以減去0的，但你 必須減去0，字符。
>> 並在一些人 得到絆倒，他們
就像，OK，好了，我必須要知道 ASCII碼值這個測驗？
不，你絕對不 需要知道的ASCII
的一樣，小寫值 一，大寫的A，為零。
>> 羅伯：我們沒有理由永遠 立此備忘單。
>> DAVIN：絕對不 廢物這是你的空間。
您可以literally--只是代替 說法48，如直到
還有，也就是等同於 說一，一撇號，
這樣，如出一轍。
>> 羅伯：你幾乎可以認為 它作為if--上帝，我需要我的，
oops--你幾乎可以把它 因為如果我們有類似的東西散
0定義為48。
這是行不通的。
但把它看作是單引號0 單引號，並為所有字符。
把它看成是一個常數， 表示ASCII值。
>> DAVIN：是的。
好了，第一次通過，所以 與76--所以第一次通過，
這僅僅是一個字符 7減去字符0，
而這些都是7 integers--好，那些
有7位相距 其他ASCII表或其他的。
所以這是要返回7的整數。
所以，現在，和等於7。
>> 好了，好了，讓我們跳 這個for循環一次。
好了，現在它的總和乘以10。
所以你有效 移動7至左側。
這是否有道理？
你是有效的 它移動到左邊。
>> 然後你add--這 將是6減去0。
這是6。
因此，這將是70加6。
76，這是你的電話號碼。
所以，不管是什麼數 我給你的，它是慢慢地只
要轉移的較大值 到左側，1 10因子
在fo​​r循環中，每次， 然後添加必要的。
>> 在後面？
學生：我們沒有做 在程序的任何檢查？
>> 羅伯：所以只要檢查 無二的程序，
我們會告訴你漂亮 很多東西你需要檢查。
如果我們不告訴你 任何事情的話，一般
假設你要檢查的大多數事情。
就像你可能，為了安全起見，你 也許應該檢查哎，是S空？
然後，我不知道該怎麼回報。
但是，我們會告訴你 這樣的事情。
0，我不知道。
>> DAVIN：為什麼你要 如果s等於null重新檢查？
學生：[聽不清]。
DAVIN：由於CHAR星。
這是一個指針。
因此，一個完全可以接受的 聲明，我可以說，OK，
上的equals空，因為它 可以是一個指針為NULL。
所以，只要你有指針 在這樣的路徑中，
你應該檢查一下。
因為如果你不檢查，並 然後你再進入你的for循環，
而你doing--就跑了下來。
SCOOT下來。
>> 羅伯：對不起，僅此而已。
>> DAVIN：所以，就像，如果 它是空的，那麼你
這樣做，有什麼錯誤 你要得到什麼？
學生：你會得到一組故障。
DAVIN：你要設置 錯，正確的，因為你
試圖索引空。
所以你要盡量指數 到你沒有自己的內存。
所以這一點，如果這是空值，和 你這樣做，你會週期。
>> 羅伯：我也覺得在考試中 我們問到這個問題，我們告訴你
你可以只是假設 它是一個正數。
由於ATOI也有望 處理負數，
所以你將不得不特例。
嘿，是第一個字符 一個破折號，在這種情況下，OK，
現在它是一個負整數。
我們會告訴你這些事情。
我們將告訴你什麼是你需要處理。
DAVIN：是的。
所以，我敢肯定，有些人可能會have-- 如果你開始尋找舊的考試，
你見過sterln。
這是一個流行的一種。
而且我覺得在sterln，你必須 做此項檢查為空，則返回
0或類似的東西。
就像，你必須檢查null。
如果你沒有，那 是在測驗點關閉。
所以無論如何，每個人都做 感覺跟ATOI OK？
有誰想 再說明一下部分？
羅伯：哦，是的，我認為 我們告訴你
可以假設，一切is--那 他們實際上是輸入號碼，
你不必擔心， 喜歡，英文字母的字符串中，所以。
DAVIN：是的。
是嗎？
學生：你可以去 在一次的時候
您使用雙引號和單引號？
>> DAVIN：當然，這樣的雙引號，很 簡單地說，就是雙引號的字符串。
所以，如果你雙引號 任何事情，這是一個字符串。
所以，就像，如果我有這個0在這裡， 我這樣做，這是一個字符串。
這不再是一個字符。
所以，我找不到我的ASCII值這個 圖表，因為它是一個字符串，是的。
>> 好了，其他問題嗎？
是嗎？
>> 學生：所以，你 已經回答了這個，
但像，當我們真正 在測驗寫這個，
你要我們寫 斜線零[聽不清]？
DAVIN：第
現在的問題是，你應該 把一個斜線通過零
以表明他們是否為零？
不，我們要搞清楚。
是啊，謝謝，他們是很好的。
好了，別的什麼嗎？
有誰想to--所以我想 我們已經運行了一點點時間。
難道你想看到一個又一個，還是？
學生：RandomInt。
>> DAVIN：RandomInt，OK，沒錯。
因此，讓我們做RandomInt。
我在這裡做了。
所以RandomInt實際上是要簡單得多。
我覺得ATOI可能是最難的 我們問過往年。
學生：[聽不清]。
>> DAVIN：什麼？
羅伯：我看到的，如果它是一種 可查看來自這裡。
DAVIN：是嗎？
羅伯：我不認為這是going--我想 它會向右跑了出去。
DAVIN：OK，所以我會做這個。
然後你只要把它在屏幕上。
>> 羅伯：好吧。
>> DAVIN：你想成為我的文士？
>> 羅伯：是啊。
>> DAVIN：尼斯。
OK，我可以抹掉呢？
>> 學生：是啊。
>> DAVIN：這是如此艱難。
（唱）你正在做的 你在做什麼。
而在做什麼，你不知道。
行。
>> 好吧，如果我沒記錯的話，上 測驗的RandomInt很喜歡，
好吧，我去給你2 號，像一個和第b。
我要你給我一個 這些數字之間RandomInt。
所以RandomInt是怎麼回事 取兩numbers--
所以RandomInt--和它的 會返回一個int。
>> 那麼什麼是返回值？
我只是告訴你。
詮釋，對不對？
像這樣的，然後它 要採取兩個整數。
因此，要採取INT 一個和INT B，這樣。
那麼，什麼是RandomInt 要做的是它會
返回一些隨機值 在這兩個值之間。
因此，這將是更大的 比，小於b。
所以，我想你大概可以假設 一個是兩個值中的較小者。
所以，如果我們正在處理 隨機性，有什麼功能
我們已經看到， 讓我們隨意的事情？
學生：Drand。
DAVIN：Drand，正好。
所以，你要大概 想用你的drand。
所以，你可以說INT隨機的，我們將 只是說等於0，現在。
而且他們我們會說， OK，隨機平等drand 48。
而且，這是什麼回報？
這是什麼功能給你？
>> 學生：在0和1。
>> DAVIN：是的，0和1之間。
因此，這將be--
>> 羅伯：這is--我想 我們會告訴你這一點。
喜歡，你可以使用drand 48。
您可以在過去的考試驗證這一點。
但是，我們可能會說，你 可以使用drand 48，該
返回一個介於0和1之間的浮點數。
>> DAVIN：是的，是的，我 很肯定的考試
它說你可能 要使用drand，是的。
因此，它會返回 0和1之間的某個值。
然後你是什麼 會想要做什麼？
那麼，你想乘by-- 等等，我覺得是這樣的，對不起。
我就這樣做。
我不知道。
>> 所以B減去。
那麼，為什麼B減一？
所以我們可以說drand給你回 一個int-- OK，我就做休息，
所以加了。
那麼，什麼does-- y是B減一。
因此，讓我們說，drand給你回 最大值它可能
給你。
那是什麼打算呢？
學生：1。
>> DAVIN：1，對不對？
因此，如果此值為1，然後就 它由B減一乘，
好吧，這只是 減去A之間的區別
如果你再補充一點， 回來到，那是什麼？
它基本上是B。
這是否有道理？
>> 學生：是的。
>> DAVIN：因此，如果這是最大 珍惜它可能是，
這將是1。
然後這僅僅是 兩者之間的區別。
添加上，所以這是 要返回隨機。
而在角落裡的情況下， drand給你回1，
隨機將只是有效地B。
但是，這是最大的可以。
因此，如果它要小於 這一點，所以我們說，它像0.9，
所以後來的0.9倍B減 一個將是較少
比B減一之間的差。
>> 然後，如果你添加一個 到一個，則該值是
要大於一個，因為 您要添加的東西到了，
但它的將是小於b。
所以，你會得到一個隨機的 數，因為你調用drand。
而且蘭特，即隨機數 將是介於兩者之間的一個
和b。
這是否有道理？
>> 羅伯：只要把它放在 具體的數字，所以
讓我們說，我們要選擇一個 在7和10的隨機數。
所以B減去一個是我們的範圍。
因此，有一個範圍的三個 數字，我們希望選擇。
然後乘以 即介於0和1 1中，
如果這則給了我們some-- 讓我們說，讓我們1.5。
>> 那麼1.5，我們要到7至10。
所以1.5加7為我們帶來 回到我們的7〜10範圍內。
然後我們將其存儲內 的整數，因此它截斷下降到8。
然後我們就返回了。
所以B減去一個是我們的範圍。
一個移動它分成數 我們希望在該範圍內。
所以7至10，然後我們 可以回到我們結束了。
>> DAVIN：是的，不錯。
>> 羅伯：謝謝。
>> DAVIN：是啊，這是怎麼回事？
>> 學生：我們運行任何類型的 當we're-- ASCII錯誤，如果是drand
返回一個浮點數[聽不清]。
>> 羅伯：所以就像羅布說， 因為隨機的不是一個int，
所以drand將是一個浮動。
所以，然後將其乘以出來。
你可能會得到一些 那種浮​​數。
然後它會截斷。
>> 學生：OK。
DAVIN：是的。
羅伯：如果編譯器是警告 你大概一樣，精度損失，
只是拋出一個int 在那裡，然後它的好。
DAVIN：是的？
>> 學生：它會在 得到的概率相同，
象，B或A [聽不清]？
>> 羅伯：所以is--我其實 wondering--是RandomInt咋辦
是數字從一個到小於b？
喜歡，如果是7至 10，什麼是機會？
7，圖8和9，或7，8，9，10？
DAVIN：我忘了。
對這個問題set--
>> 羅伯：我認為這是7，8，9。
>> DAVIN：它明確表示，一個人的 包容性和人的排斥。
>> 羅伯：是啊。
>> DAVIN：但是我don't--我不是 -
>> 羅伯：所以我覺得這是 不包括在內，在這種情況下，
有一個平等的 概率的7，8和9。
有10個沒有可能性。
DAVIN：是的？
學生：我有一個問題。
我們要定義一個函數 返回不是一個值，而是一個數組。
那麼會是什麼 語法後返回？
>> DAVIN：好吧，那你 回國後would--？
因此，讓我們說你已經宣布 數組的地方在那裡。
然後，你將只返回 該陣列的名稱。
>> 學生：好的，謝謝。
然後就返回與A--
DAVIN：哦，等等，非常抱歉。
現在的問題是如何 你返回一個數組。
>> 羅伯：雖然它不能 將數組聲明
在棧或類似的東西。
它必須是什麼 malloced，因為的malloc
你是怎麼得到解決 自動內存分配。
>> DAVIN：是的。
羅伯：你周圍的局部範圍內如何獲得。
>> DAVIN：但你會 剛剛返回其名稱 -
>> 學生：[聽不清]這不是一 值，例如，2號，所以
[聽不清]。
>> DAVIN：您不能返回多個號碼。
你可以不一樣，return--
>> 學生：我談回國 一個數組或類似的東西。
>> DAVIN：是啊，所以這個問題是 我可以返回多個值。
你不能返回多個值。
你可以不一樣，返回再 返回b或類似的東西。
因為在你回來，你 返回該功能的。
然後該函數完成的，並 像羅布說，是在棧上。
>> 因此，所有的記憶只會越來越 返回到計算機。
一切都被遺忘了，基本上是這樣。
所以，如果你想返回多個 值，您必須返回一個數組，
而你做到這一點的辦法就是mallocing。
然後你會回到X這樣的。
基本上，你只是回到了名。
當您返回 這樣的事情，你
實際上不返回值。
>> 因此，讓我們說你存儲 在一個數組中的值。
你不是真正 返回的值。
類似的，如果我返回一個整型，我 真的返回值的副本。
但如果我要返回 這樣的事情，
我返回一個引用 這些值。
所以我回國，基本上，一個 存儲器地址的值。
這是否有道理？
學生：是的。
DAVIN：尼斯。
是嗎？
>> 學生：當你 使用drand在這裡，
你必須把函數srand之前？
>> DAVIN：不，不，我不這麼認為。
>> 羅伯：是啊，所以你有 說一下函數srand什麼？
你默認永不說函數srand 在一切都只是做空的函數srand。
所以drand自身意志的工作。
它會自動與種子 當前時間，是它的用途。
DAVIN：是的？
學生：你[聽不清] 隨著數字？
DAVIN：是的，可以。
學生：所以，你可以 說的一樣，4次2。
關鍵是，你不能假設 那麼int是4個字節。
該only--
>> DAVIN：我的意思是，對於測驗即可。
[笑]
>> 羅伯：嗯，沒有。
DAVIN：是的，是的，你可以。
如果他們問你有多大的int是， 你不能一樣，四個或八個。
羅伯：哦，所以如果 問題是，具體而言，
等，如果它是一個編碼問題， 你應該說為int的大小。
如果它是一個表，或 它說多少字節，
你不應該填個整數的大小。
>> 學生：[笑]
>> DAVIN：對，所以為什麼 在這裡INT重要的尺寸是多少？
所以像，如果我們要為32位 處理器或類似的東西，
那將是四個字節。
但對一些較新的 的東西，它可能是什麼？
這可能是8，對不對？
所以this--如果你只是硬編碼4， 然後在一些機器上，它會奏效。
一些機器，它不會工作。
但是，如果對我們的測驗 就像有多大是一個int？
放四個。
羅伯：對。
DAVIN：是嗎？
學生：所以，因為我們聲明 [聽不清]在函數內部，
我們應該把3該函數內部？
或者，我們可以外面使用它呢？
DAVIN：你可以使用它 以外的功能。
所以他要求免費。
>> 學生：失去跟踪 。在哪裡[聽不清]
>> 羅伯：哦，自由不happen-- 這是對的malloc魔法的一部分
是你不 僅限於本地範圍。
你在完全控制 你的變量活多久。
因此，我們調用malloc在這裡，它可能 是一個完全獨立的功能。
它可能是10小時後進行 我們終於打電話免費。
>> DAVIN：那麼比如說像，一對夫婦 幾個星期後，當你終於
做你的拼寫字典 pset時，你會
有一些函數 創建噸的節點。
所以你mallocing噸 在此函數中的節點。
再後來在一個 單獨的函數，你
將要釋放所有的節點。
所以，你可以從字面上只是傳遞到 釋放一個指針，這樣的存儲器地址
你malloced什麼。
而這將被罰款。
你沒有自由， 等，在相同的功能。
是嗎？
>> 學生：所以一個malloc 變量[聽不清]之外？
是，你在說什麼？
DAVIN：等等，這麼說？
抱歉。
>> 學生：如果一個變量的malloc 可以是自由的代碼中的任何地方，
這樣，他們才能進行訪問 在代碼中的任何地方？
你可以讓他們本地的？
>> DAVIN：哦，她問， 像，變量，like--
>> 羅伯：所以你仍然需要 有某種參考
到內存的malloc的塊。
所以在這裡，我們返回X。
學生：哦。
羅伯：如果我們不返回X 在這裡，這只是虛空，
那麼我們都進不去 這是malloced指針，
它的內存洩露。
>> 學生：OK。
>> DAVIN：那麼像，讓我們說你 有這樣的一樣，就在這裡。
羅伯：第
DAVIN：在我的主要功能，我不能 只需要調用這個x和是一樣，OK，
在這個函數中，我這樣做。
>> 羅伯：對。
>> DAVIN：所以我要打電話給X中， 象，主要或類似的東西。
你不能做到這一點。
你要返回的東西。
但是，你要回來嗎？
你會返回一個內存地址。
因為你恢復記憶 地址，即可以在其他地方進行訪問。
還有什麼問題嗎？
是嗎？
>> 學生：是上面的函數 被檢查[聽不清]？
>> DAVIN：為什麼我沒有必要做呢？
學生：[聽不清]。
DAVIN：因為你 不mallocing什麼。
所以它的不是 - 是的，這是 不喜歡一個字符串s。
這是一個指針的地方。
這些只是值。
學生：OK。
DAVIN：是的。
還要別的嗎？
羅伯：是的？
學生：但是當你[聽不清]？
>> 羅伯：所以為了釋放 記憶中，我們會在這裡說。
因此，x是我們的指針 的存儲器塊。
我們釋放該指針。
我們不一定會在這裡做。
我們可以在任何地方。
但是，你只能撥打免費 一些malloc的回報。
所以malloc的，在這裡，返回 什麼被存儲x中。
因此，我們可以調用免費的X。
最後還有什麼問題？
>> DAVIN：最後還有什麼問題？
是嗎？
>> 學生：對不起，你能不能再解釋一下 你為什麼會免費嗎？
為什麼[聽不清]？
>> DAVIN：在這裡？
>> 學生：是啊，像權後。
DAVIN：你可能 不想免費在這裡。
羅伯：你可能不會。
DAVIN：是的，這會什麼都不做。
這一樣，創造 記憶，做的東西給它，
然後立即 忘掉它，是啊。
>> 羅伯：但我們可以做的，比如， 在這裡的某些原因。
我們可能會說INT明星 y等於返回的數組。
做一些東西與Y， 也許打印的內容。
然後，終於，我們就大功告成了。
我們可以免費年。
學生：[聽不清]。
DAVIN：我應該向下滾動？
謝謝。
羅伯：尼斯。
>> DAVIN：OK，就是這樣。
羅伯：好吧，好了。
祝好運。
>> DAVIN：如果你有問題，給我們發電子郵件。
祝好運。