>> JASON HIRSCHHORN：歡迎 到A5，大家好。
我們有一個令人興奮的一周擺在我們面前， 主要是因為有這麼多新
面臨著在這個房間裡。
這是美妙的。
很多你在這裡意外， 這是更好的。
所以希望你會繼續加入我們的行列。
>> 本週我們將花 大頭的部分
準備測驗。
因此，根據我們的議程，我們要談 一點關於該類資源，
而且對測驗，然後，再次 花大量類的說話
有關的問題。
一旦我們做了回答您的 的問題，或者如果您的問題
自然使我們聯想到一些編碼，我 有從期中考試樣題
過去，我們將在部分實時代碼 同時也帶來了一些其他的
好的選題覆蓋。
>> 因此，首先，因為我們已經經歷了 過去幾週來提醒你
伙計們，有一噸的資源 提供此課程。
他們中的許多將是難以置信的幫助 你為你繼續
對於學習測驗0，因為 這是週二下午。
因此，所有的你一直 研究了一下。
>> 有講義和源 代碼，您應該
一定要看看。
觀看短褲。
退房study.cs50.net。
然後，在下面列出，一​​個數 的其他資源。
>> 再次，測驗0就是明天 1點。
如果你還沒有這樣做的話，請檢查 列於本公司測驗0文檔
當然主頁搞清楚 在那裡你正在做測驗。
測驗開始於1:10 端70分鐘後。
所以，如果你1點10之後顯示出來，你是 會得到很多更少分鐘
70比拿測驗。
所以一定要確保你有時間。
如果你是一個擴展學生或有 其他一些測試方面的考慮，它
可能不會在明天1點。
但同樣，檢查關於測驗0 記錄，以確保你知道什麼時候
你服用的測驗。
我寫75分鐘在這裡。
我認為這是正確的，而不是70。
>> 它涵蓋了所有的材料從一個星期0 在週三上週的演講。
再次，這個測驗，即每 文件，你得到一個雙面和8
1/2 11張紙上，你得到 測驗期間，作為筆記使用。
很多人，如果不是大多數人來說，有 發現的一個最有用的方法
以研究為競猜是 做一個研究表，
1-Sider的自己。
所以看過去的，如果 你看過過去的。
接觸到的朋友，看看有什麼 他們穿上他們的。
>> 但實際操作下來，最好的辦法，你可以 學習是要經過的一切，
惠特爾下來到什麼應該或不應該 不屬於重要的是表
紙，因為這只是一個非常 有用的方式為您確保
你正在經歷的一切， 與它有一定的了解。
大多數人來說，我們發現，即使它們 已在紙張右邊坐著
在他們旁邊的測驗，不轉 它，因為，同樣的，這很
在經歷了信息化進程 幫助他們學習。
>> 沒有任何人有任何疑問， 有關測驗0？
有大家 -
我不會做舉手。
沒關係。
我正想問問誰 開始學習。
但我不想讓你 所有不請舉手。
所以，就像我說的 - 是的，AVI，勇往直前。
>> AVI：什麼會是一個有用的東西 穿上一個尋呼機？
>> 學生：這是給你的。
>> JASON HIRSCHHORN：你得到 使用你的判斷。
有用的東西要放在一個尋呼機， 如果你感到困惑的大O
不同類型的搜索的運行時間 和排序，把那上有一個中
方便的花花公子圖。
這樣一來，如果你問的 小測驗，你不需要嘗試和數字
它或理由通過運行時。
你可以把它複製下來。
如果你看看過去的測驗，很多 次，還有的運行時間問題。
因此，這將是一個很好的一個例子 東西放在你的一個尋呼機。
>> 其他好東西穿上，如果你 困惑如何聲明
功能或什麼的不同部分 函數的聲明是，寫
那在那裡，一個通用版本 然後也許一個例子。
如果你感到困惑的指針， 如何指針工作是示
大概真的很有幫助。
如果你感到困惑遞歸，一個 樣本上有遞歸函數
也可能被證明是真正有用的。
這是否給你一些想法？
>> AVI：你需要了解的 整個編譯過程，就像
怎麼所有的作品？
>> JASON HIRSCHHORN：一切 已經可以覆蓋
顯示的測驗。
問題 -
但同樣，有些事情會 權重比其他人。
有些事情已經再次出現 並再次在課堂上，在
講座，以及部分。
其他的東西都沒有 想出經常。
>> 我們已經談了很多關於＃include和 -L的東西，這些東西在的意思
編譯過程。
我們已經談了很多關於GDB，保鮮， 那些我們用不同的標誌時，
我們編譯的東西，什麼 make15，例如，真正
手段和確實。
我們還沒有談論的很多關於 在每一個步驟
編譯過程。
我們仍然談論它。
所以它仍然是東西，你 應該熟悉。
但同樣，我們不會是 -
事情往往拿出在課堂上 更有可能想出更多
常和更重 加權測驗。
>> 涼爽。
有關測驗0沒有其他問題？
>> 好了，我把名單 題目在黑板上。
我通過教學大綱去了。
我通過從審查部分去 昨晚那些幻燈片上來
與主題的不完全清單 我們已經介紹了迄今為止在CS50
而事情可能 出現在測驗。
所以我不打算去通過 這些每一個。
這將需要更多的 時間比我們現在有。
但我要把這段話在這裡希望慢跑 你的內存，以事情，可能
或可能不熟悉你。
>> 而且我很樂意花大量的 部分回答你的問題有關
這些題目，主題， 這裡不包括在內。
我們可以寫偽代碼。
我們可以編寫真正的代碼 以確保您 -
我可以回答你的問題，並幫助 每個人都從根本上理解
很多這樣的主題讓你會覺得 準備和舒適進入
測驗的明天。
所以，在閱讀列表。
希望你們都來節 有一些問題也是如此。
當你準備好，舉起你的手 我們將開始。
>> 請記住，這些問題你有， 沒有愚蠢的問題。
我們已經聽說了很多。
和你有問題，我願意 打賭，很多人既
坐在這裡，看 網上也一樣。
所以你只能幫助人們 通過提問。
馬庫斯。
>> MARCUS：堆棧之間的 堆，就是有一個預分配
這被定義為內存的百分比 這是堆棧或堆？
或者，請問是怎麼工作的，到底是什麼？
>> JASON HIRSCHHORN：大問題。
我要回追查一點點。
請問大家 -
請在這裡是誠實的。
我知道我在問你提高你的 手在你同行的前面。
但有沒有人覺得誰 難受的是棧和堆
並想說明一下 和那些什麼意思？
如果舉起你的手 -
確定。
謝謝。
所以，我們要投奔的堆棧和 堆真的很快，然後
進入回答你的問題。
>> 所以，如果我們畫了一個框來表示 內存在計算機上，都有些什麼
事情往這個盒子？
主。
一個主要功能。
哪裡主去了？
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：所以我們會 把主要這兒吧。
在此框中去還有什麼呢？
>> 學生：你調用的函數。
>> JASON HIRSCHHORN：該功能 我們稱之為。
他們去哪兒去了？
>> 生：在堆棧中。
>> JASON HIRSCHHORN：他們 走在棧中。
所以，我們要調用這個 這兒的事情堆棧。
而往上頂，我們有堆。
所以內存是不是就像這樣一個盒子。
但它實際上是非常相似的。
這將是一個很大的箱子超過 並且，這取決於有多大你
計算機是或有多大你的內存是。
>> 在報價引文結束“底” 是堆棧。
並有多個事 即進入堆疊。
而那些依賴於功能 你在你的代碼。
你總是有一個功能在你的 代碼中調用主，所以總有一個
下節在這裡 堆棧致力於主。
>> 這些部分在堆棧 被稱為堆棧幀。
當你調用另一個函數，主要說 調用一個二進制搜索功能，
我們把另一幀堆棧上。
更具體地說，我們要 捐贈的內存塊在我們的
計算機存儲二進制搜索的地方 變量和運行的二進制
搜索代碼。
>> 所以我們稱之為二進制搜索。
在這種大塊的內存，我們要 來存儲它的局部變量。
我們要存儲其printf的調用。
無論發生什麼事，該函數是 將被存儲在那裡。
二進制搜索是要執行。
它要完成執行。
什麼是C語言的單詞，標誌著 一個函數
完成它的執行？
>> 學生：返回。
>> JASON HIRSCHHORN：返回。
所以每當你看到一個return語句， 函數結束
當它擊中了。
所以二進制搜索將達到其返回。
這部分內存基本上會 被釋放了。
而主要將回到執行。
所以主要將暫停的地方是，調用 二進制搜索，得到一些返回值，
並繼續執行。
這個棧幀會自行消失。
>> 如果我們調用一個遞歸函數，該函數 是一個函數調用自身在
並且，我們可能會得到 - 我們說 遞歸做二進制搜索。
我們可能會得到一個二分查找的版本， 二進制搜索二，二分查找
3，二進制搜索4， 二進制搜索五位。
然後這最後的二進制搜索5 將撞擊基的情況下，與層疊
幀會回去，並保持關閉 直到我們回到主。
我們可以走了過來遞歸的一點。
但是，這一切是說，如果你是 調用多種功能的時間，
就會有多個棧 在堆棧幀。
>> 堆，另一方面，升 這裡，不是功能，
不為局部變量。
這是動態分配 變量。
因此，這些變量可以是 在任何主要或初始化
函數主要調用。
在任何地方你的代碼，它們 可以初始化。
並初始化一個動態 分配的變量。
我們使用什麼函數C語言？
>> 學生：malloc的。
>> JASON HIRSCHHORN：malloc的。
你調用malloc。
你得到的內存空間。
和內存空間 是在堆上。
和內存空間保持 在那裡，直到你打電話免費。
>> 在這樣動態分配的變量 將堆，只要存在你
希望他們存在，他們不會 走開，直到您明確
告訴他們走開。
你可以在一個函數中創建它們。
該函數的棧 框架會自動消失。
但該變量仍然存在 在堆中，直到它被釋放，
可能通過調用該函數 二進制搜索或什麼的。
>> 因此，那些堆變量呆在那裡 只要你想
他們呆在那裡。
而他們得到放在這裡。
然後下一個被放在那裡。
他們不斷得到填補，而他們 呆在那裡，直到你調用free。
>> 而且基本上，堆和棧， 讓馬庫斯的問題，
增長向對方。
如果他們碰上彼此，你已經 用完了所有的記憶在你的
電腦，你的程序將退出 因為你沒有任何更多的內存
左邊使用。
在它們之間，有 可能其他的東西。
但對於本課程的範圍，你 不必擔心。
>> 所以這就是答案 你的問題。
不用擔心這個。
但是，這是長遠的答案。
所有你需要知道的是 堆和堆棧 -
一開始在底部。
堆棧一樣。
堆是在那裡。
他們也會越來越密切彼此。
>> 如果他們碰，這是一個問題。
你耗盡了內存。
但同時，除了知道在哪裡 它們是什麼被存儲在兩個
棧和堆。
柯蒂斯。
>> 柯蒂斯：當他們碰撞， 是一個堆棧溢出？
>> JASON HIRSCHHORN：當他們碰撞， 這不是一個堆棧溢出。
堆棧溢出是一個不同的區域 我們可以走了過來，如果你想。
OK，我們會回來，在一個位。
>> 學生：什麼叫字 當他們擊中對方，
棧和堆？
>> JASON HIRSCHHORN：就目前而言， 不用擔心。
只知道 -
我會回答這個問題 下課。
如果他們碰上對方，你跑出來 的內存，因為沒有更多的
空間在那裡。
>> 學生：對不起，什麼是賽格故障？
>> JASON HIRSCHHORN：分部 故障可要求 -
這取決於為什麼賽格故障的調用。
有時候，你的堆棧溢出，它會 說賽格故障的錯誤。
>> 學生：約提領什麼 一個空的變量？
那是段錯誤？
>> JASON HIRSCHHORN：提領 一個空指針 -
好了，如果你有一個指針，你 設置為null，指針，調用，
存儲內存地址 作為它們的值。
和一個空指針本質上是 存儲0，在第0個
解決該變量。
所以為0x，0，0，0，0，等等。
這0個內存地址，這不是 在我們的畫面，那是在那裡
在某處，這是保留 對於計算機。
我們沒有被允許去觸摸它。
>> 所以，當你的程序的執行，如果 事情是試圖去記憶
地址0時，它知道 那是一個空值。
它什麼都不知道應該在那裡。
所以，如果你嘗試使用的東西有 並把喜歡的東西或有
試圖去那個位置，你是 要得到一個段故障或錯誤。
這是否回答你的問題？
>> 現在我們就回去 堆棧溢出。
事情在棧中，因為你們有 以前看過，在 - 讓我們得出一個接近
一個堆棧幀。
可大家都看到了嗎？
因此，我們有我們的堆棧幀。
是在拯救一個數組作為一個地方 變量在該函數。
所以說，我們的陣列有五點。
所有5的那些將被存儲 在堆棧幀。
>> 如果我們開始編寫超越 這個數組越界 -
因此，如果我們開始寫進去， 讓我們說這是0。
這些都是五項指標 我們的數組。
如果我們開始編寫成指標5，其中 我們沒有，當我們有一個
大小為5的數組，我們開始編寫成 指標6，7，8，9，我們可以得到一個堆棧
溢出錯誤。
>> 通常它不是 -
你可能會惹上麻煩 如果你一走了過來。
但是總體來說，您將獲得進入 如果你有很多去了最麻煩
和你這麼遠了，你去寫 超過了返回地址
函數，它是位於 棧幀的底部。
>> 因為，對不對？
你 - 在 - 對不起。
不“，因為正確的。”
>> 在棧幀中，你有 你的局部變量。
在堆棧的最底層 幀的返回地址。
這其中的功能 去當它結束了。
如果你覆寫回報 地址，那麼當這個堆棧幀，
當你正在經歷的堆棧 框架和執行的每一行，你
會去你的新的返回地址 這是寫的，而不是有
實際之一。
這就是我們如何見過 一些安全漏洞
可以與計算機發生。
>> 所以堆棧溢出，總之，是當 您覆蓋的部分在堆棧
你應該使用的地方 變量你應該使用，並
特別是當你開始覆蓋 像重要的事情
返回地址。
而這也正是你會得到一個錯誤。
或者甚至你可以開始 即使寫入 -
說二進制搜索是 正上方主。
如果覆蓋了很多，你 可以寫為主力。
但是總體來說，你以前得到一個錯誤 然後，由於計算機知道
你正在做的事情你 不應該做的事情。
是啊。
>> 學生：有什麼區別 堆棧溢出之間
和緩衝區溢出？
>> JASON HIRSCHHORN：緩衝區溢出 是一個更通用的類型
我剛剛描述。
>> 學生：所以一個堆棧溢出是一種 例如緩衝區溢出。
>> JASON HIRSCHHORN：沒錯。
這是一個數組，我們可以認為，作為一個 緩衝，事情進去的空間
這是一個堆棧緩衝區溢出。
我們可以有一個堆緩衝區溢出。
如果有一個緩衝器，它有常 是一個數組堆，而我們
重寫了這些界限，那麼我們會 有一個堆緩衝區溢出。
>> 和不在本課程的範圍， 他們發現有點不同。
編譯器有特殊 方法檢測各。
但緩衝區溢出是一種更通用的 型我描述的，
這是一個堆棧緩衝區溢出。
這是否回答你的問題？
甜蜜。
>> 有沒有什麼其他的相關問題 到堆棧或堆？
是啊。
>> 學生：我知道你有免費的字符串 因為他們是在堆
而你不想洩漏內存。
但你必須釋放全局變量 和類似的東西？
或者他們會自動釋放？
>> JASON HIRSCHHORN：好問題。
所以在CS50.H，我們創建這個東西 你叫一個字符串。
字符串是真的麼？
>> 學生：字數明星。
>> JASON HIRSCHHORN：一個char明星，一個指針 到一個字符，一個指針到
字符數組。
這是該字符串是什麼。
因此，我們需要釋放它，因為 GetString的，我們用了很多 -
字符串名稱等於GetString的 -
這mallocs對我們的一些記憶 堆，然後返回一個指向
那第一個字符 字符串，一個char明星。
>> 所以表面上，如果你還沒有 您的任何字符串的自由寫作
那你叫到目前為止，你有 被洩露一些內存。
當然，我們還沒有談到 它，所以沒有人在得到
對於這樣做的麻煩。
但展望未來，是的。
當你調用GetString的，你 mallocing一些空間在堆上。
如果你不打電話免費以後的 字符串，你有內存洩漏。
這回答你的問題？
>> 是啊
>> 學生：所以要做到這一點，我們使用 返回之前免費對不對？
象，範圍內的，我想，如果 我們說的一樣，INT為主，內
該代碼是在那些範圍 大括號，右前 -
你知道你會 通常把回報。
你把自由之前？
>> JASON HIRSCHHORN：所以，你可以把免費 無論你想要把自由。
因為這些都是動態分配 變量，因為他們可以
活過一個特定的範圍 功能，如果你調用malloc在
獨立的功能，例如 GetString的，你可以在主調用free。
你不需要調用它 在所述特定功能
其中調用malloc。
但是，你需要調用它 之前主要的回報。
>> 它實際上取決於。
這要看你為什麼malloced的 空間擺在首位。
有些人會打電話 釋放很快。
有些人會不叫自由，直到 他們的節目的結束。
而且他們會通過 和自由的一切。
這要看你為什麼叫malloc的。
>> 學生：你會說什麼 如果你用所謂的GetString？
你會說什麼自由？
>> JASON HIRSCHHORN：所以語法免費 簡直是免費的，開放的括號，關閉
括號，並且指針的名稱。
所以，如果你寫的字符串名稱等於 GetString的，你把名字在這裡。
這就是指針的名稱。
它知道來釋放內存。
>> 學生：所以，當它釋放內存， 指針仍然指向那個地方
在內存中？
或者是指針也走光 它指向的地址。
>> JASON HIRSCHHORN：我們應該嘗試一下。
我們要編寫的。
讓我們回來的時候，我們得到 編碼，並且讓代碼的。
如果你想找出答案 這一點，你也可以代碼
在此期間。
但是，這是一個很大的問題。
>> 學生：有沒有可能 免費的東西太快？
所以你仍然需要它為你的程序， 而你釋放內存空間？
>> JASON HIRSCHHORN：是的。
這是可能的，如果你免費的東西 然後你再次使用它，你會
碰到一個錯誤。
但是，這對你，因為你釋放 的東西，再後來把它稱為。
所以這是一個程序員的失誤。
但肯定的。
你可以寫。
>> 任何更多的問題 -
是。
>> 學生：所以，如果你都應該只是 釋放它一般前
程序結束，是否意味著如果 程序結束，你不釋放它，
該內存仍分配呢？
>> JASON HIRSCHHORN：如果你的程序結束 你忘記釋放的東西，那麼
這整個內存分配 你的程序的生命週期。
當你的程序完全關閉， 該內存是不會
要永遠呆在那裡。
計算機是足夠聰明，知道 該程序關閉時，它
要擺脫所有的內存的那 是與該程序相關聯。
>> 不過，也有可以運行的工具 在一個程序來檢測，如果當
程序完成後，您忘了 以釋放一些內存。
並為你的下一個問題集，其中 您將要使用的malloc和使用
指針，你將要運行此 編寫你的程序，如果看到，
當主的回報，你有一些 所剩下未釋放的東西。
>> 所以他們不會留malloced 永遠留在你的電腦上。
這將是浪費的，因為 很快，電腦
會耗盡內存。
但是，如果他們跑，直到你的結尾 編程和他們不釋放，你的
程序退出，這仍然是一個問題 這一工具將幫助您解決。
>> 學生：那是Valgrind的？
>> JASON HIRSCHHORN：這是 所謂Valgrind的。
，你會 -
>> 學生：但是，我們不必知道 對於測驗有關係嗎？
我的意思是，有人談到了 在演講一點點。
>> JASON HIRSCHHORN：所以Valgrind的 是，工具的名稱。
知道它的作用是 足夠的測驗。
可是你有沒有使用它在您的 問題的設置，因為我們還沒有一個
已明確處理問題集 使用malloc或您使用malloc。
所以，你還沒有使用Valgrind的呢。
但你遲早會使用它 而不是以後。
>> 學生：你能重複 什麼Valgrind是？
>> JASON HIRSCHHORN：對不起？
>> 學生：你能重複 Valgring的目的是什麼？
>> JASON HIRSCHHORN：Valgrind的 是名稱 -
像GDB可以幫助你調試你的程序， Valgrind的可以幫助你計算出，如果
事情還沒有被釋放 當你的程序關閉。
所以，你會在你的程序運行它。
和你的程序退出時，它會說 你的程序調用malloc的這麼多
時間這麼多字節，而你 只有所謂的自由很多次。
所以你離開了這些多少字節 沒有被釋放。
或者，它會說你已經釋放了一切。
幹得好。
>> 學生：確定。
它叫做Valgring？
>> JASON HIRSCHHORN：V-A-L-G-R-I-N-D。
>> 學生：關於指針的一個問題。
所以說你有N個明星 x等於什麼。
這相當於，不管你把 還有，是什麼正在裡面放
X是什麼指向， 或x的指針？
>> JASON HIRSCHHORN：你能 重複的問題？
我們可以借鑒它，而你說了嗎？
>> 學生：在測驗，其實， 一個你給我們送來，就好像，燒焦
星級真相等於CS50岩石，對不對？
那麼，這是否意味著該CS50岩石 是什麼樣的真相是指向？
>> JASON HIRSCHHORN：所以你說 大約一個char明星在一個字符串中，如何
的作品？
是啊。
確定。
讓我們得出這樣的在這裡。
>> [SIDE會話]
>> JASON HIRSCHHORN：所以這個變量 將是char類型的明星。
多大是一個變量 的char類型的明星？
有多少字節？
>> 學生：四。
>> JASON HIRSCHHORN：這是四個字節。
有多少權利是一個變量 int類型的明星？
>> 學生：四。
>> JASON HIRSCHHORN：四個字節。
如果它是一個指針，那麼它始終是 4個字節，因為指針，其
值是一個存儲器地址。
而在CS50內存地址 家電是四個字節長。
因此，當我們需要調用getString，或當我們 也就是說，字符串名稱等於，然後在
雙引號把一個字符串， 我們正在把 -
好了，這是一個有點不同。
我們會做的GetString為例。
或char星級東西 等於字符串。
對不起，給我的例子 你讀？
>> 學生：字符星級等於真相 在雙引號“CS50石頭”。
>> JASON HIRSCHHORN：那麼這顆星，這 我們將調用這個變量x為
通用的目的。
我們已經創建了一個變量x。
這是char類型的明星。
它是一個指向一個系列 字符。
這樣下來在這裡 -
>> 因此，這是該會怎樣 在內存中運行。
這將存儲的存儲器地址。
將存儲的存儲器地址 陣列中的第一個字符。
然後你按照時 指針，你會
得到第一個字符。
>> 如果你正在讀這篇東西一樣 一個字符串，你的電腦是智能
足以知道，閱讀這件事 直到它到達一個反彈0。
但是，如果你正在閱讀這一個字符 一時間，所以你通過迭代
這個字符串，那麼你將只是一個讀 字符一次，直到你到達
反斜杠0。
可能不會回答你的 的問題，雖然。
>> 學生：是啊，但你有沒有 malloced的空間
但對於該指針。
>> JASON HIRSCHHORN：所以我不太清楚 正是你要找什麼，
因為我沒有作出這樣的測驗。
這應該是一個有益的 從另一個TF資源。
如果你是在創建一個字符串 堆棧或局部變量，它會
只是數組的費用，而不是 一般一個char星級指向
另一個字符串。
但我不知道。
這可能是一個指向另一個 在堆棧上字符串。
是啊。
>> 學生：我知道你需要 分配內存，如果指針
越來越聲明內 另一個函數。
你需要做同樣的事情，如果是 主內被宣布，
你使用它的主內？
>> JASON HIRSCHHORN：所以，是的。
你可以聲明一個指向任何 在內存中的內存地址。
它可以是一個本地的存儲器地址 變，但通常情況下，
人不申報的內存地址 局部變量，因為他們去
一旦離開該函數返回，這 所以我們一般用malloc的東西。
但是，是的，你可以聲明一個指針 另一個局部變量。
這只是一般沒有這樣做。
但是我可以看看那個 下課後具體的事情。
是啊。
>> 學生：我認為這是排序 什麼的被問。
它似乎奇怪進行初始化 一個指針而不是作為一個
地址，但正如 似乎是一個值。
這似乎是CS50是裡面有什麼 事情被指向和
沒有實際的地址，對吧？
>> JASON HIRSCHHORN：所以這是 不是這種情況，雖然。
這不是發生了什麼。
當你聲明一個char星， 這是一個內存地址。
指針是所有的內存地址 指著別的東西。
別的東西可能是在 棧，但幾乎總是是在
堆在我們將看到它的使用方式。
但字符串名稱等於雙引號 “GetString的，”我們可以看到，和我們
可以看看通過和代碼。
GetString的字符串沒有被保存在 該變量，或任何字符串
名字沒有被保存在 變量，因為這不是如何
指針工作。
這是否有道理？
>> 學生：是啊。
>> JASON HIRSCHHORN：確定。
但願，這不是 混亂給任何人。
但如果是，我們可以再看看它 在一個位，因為我們實際上會
以代碼的東西，希望能 處理字符串的工作和讓你感覺
更舒適的他們。
>> 與這些其他問題 主題或其他主題，
我要把備份？
和 -
現在。
是的，奧爾登。
>> 奧爾登：所以這是完全不相關的， 但我們只是去了
真的很快我們所需要知道的 大約32和之間的差
64位機？
>> JASON HIRSCHHORN：是的。
因此，32位是多少字節？
>> 奧爾登：這是四個字節。
>> JASON HIRSCHHORN：這是四個字節。
和64位是多少字節？
>> 學生：八。
>> JASON HIRSCHHORN：8個字節。
如此反复，八位為一字節。
您的CS50設備是 一個32位的機器。
因此，內存地址 四字節長。
有2到32個 內存地址。
0到2至32減去1。
而我不是正面的，但是這 什麼，你需要大概的範圍
知道一個32位的機器，該內存 地址是，再次，四字節長，
這就是最高金額 內存地址。
>> 此外，數據類型 -
這可能是由於東西 那麼這是值得注意的。
一個數據類型的大小取決於 您正在使用的機器。
因此，一個字符，一個字符，是怎麼 多少個字節我們CS50設備？
一個字節。
它實際上是一個字節作為 以及一個64位的機器上。
>> 和大多數數​​據類型是相同的數 的字節在兩台機器上。
但某些數據類型會有所不同 在兩台機器上。
所以這將是可能的 只有你需要知道的事情。
>> 但即使這樣，我認為， 超出了界限 -
我幾乎可以肯定，如果你回頭看 在舊的測驗，它說，承擔
編碼你使用的問題 一個32位的機器。
但也有，一起去，在 如果你有興趣，有
是相同的數據類型 尺寸上的所有機器。
>> 如果你看過類似的東西 uint32_t的，你可能會或可能
沒有看到這一點。
這是一個數據類型。
這是說，有32位不管 什麼機器，這是上。
所以，當人們編寫可移植 代碼，他們可能不會使用int類型。
他們會轉而使用其他這些數據 他們知道類型將是相同的
大小每一個機器上。
馬杜。
>> MADHU：我有一個問題是關於 編譯過程。
所以，如果你正在編寫一個使用程序 像CS50什麼的圖書館
這樣，我知道該庫 有，在某些時候，可
編譯和鏈接英寸
但其中有多少過程中發生 你的程序的編譯？
該庫程序的哪一部分 當你出現
編譯你自己的程序？
>> JASON HIRSCHHORN：讓我們去了 通常的步驟這一過程的。
你寫你的c文件。
在你的c文件，你的＃include你 頭的庫，例如，cs50.h.
什麼是尖銳的，包括 行做你的計劃嗎？
Akchar。
>> AKCHAR：它增加的原型 從標題中的功能
在庫中的文件。
>> JASON HIRSCHHORN：沒錯。
它增加了這些函數原型 你的代碼。
所以，當你的代碼被編譯 在早期階段，編譯器知道
這些功能真的存在， 在某個地方，他們已經確定。
h文件不包含 定義這些函數或如何
他們的實際工作。
Cs50.h只是包括一些說 GetString的是一個真正的東西，
可能發生。
和standardio.h說printf的是 一個真實的東西，可以發生。
>> 所以用這個你的c語言實現。頭 文件被變成了一些
機器可讀的代碼，最終 被轉換為二進制
代碼0和1。
這就是代碼，最終 被執行。
使用-l CS50線 - 例如， 當你寫鏘 -
然後就包括-L CS50， 你鍵入英寸
你可以看到這一點。
當你寫做，你會 看到這條線在這裡。
我們將看到，在第二個時 我們的代碼或當我們的代碼以後。
>> 但這-L CS50線做一些事情 比有點不同
＃包括cs50.h.
這是什麼-L CS50行嗎？
阿維？
>> AVI：我想說的是，它鏈接 圖書館的功能
打電話，像。o文件。
>> JASON HIRSCHHORN：所以很 接近，如果不是當場上。
使用-l CS50採用的二進制文件， 與您的二進制文件將其合併。
所以cs50.h，有車削沒有點 從C語言cs50.h為二進制每
單一次它被使用。
那將是愚蠢的，因為這 會浪費很多時間。
所以它已經被編譯 ，變成一個可執行文件。
現在它要被合併 與您的文件結尾。
因此，那些1和0的打算 與您的那些合併
和0結尾。
所以，現在你會真正有實際 1和0的定義如何GetString的，
例如，工作，還是怎麼的printf， 例如，工作。
>> 而對於更多的信息，有一個 總之編譯器內特給出了
你應該檢查出雲 通過這些步驟。
但是 -
是。
>> 學生：他們總是在o文件。 當他們在圖書館的形式，
準備合併，鏈接 - 像 他們在二進制代碼嗎？
>> JASON HIRSCHHORN：確定。
什麼 -
>> 學生：那是經常的情況下， 該庫時將它們鏈接？
>> JASON HIRSCHHORN：是的。
因此，有。s個文件，這將是 機代碼，這也將是
神秘的給你。
你不必擔心這些。
但是總體來說，是的，他們會 是。o文件準備好了。
>> 學生：所以，當你運送到 一個庫，你只船
的，H和。Ö？
你不出貨。c或。秒。
>> JASON HIRSCHHORN：那麼 -
這就是在這短短的為好，如果 這一信息似乎是一個未來
快一點。
但短期的編譯器 關於這個談判也是如此。
當你船庫，如果你出貨 在H，頭文件，這些
函數原型，以及1和 0的，這就是你需要給。
你並不需要給該如何 函數的工作原理，在c文件。
因為該點的抽象，或 點的API，該點在這個SPL，
斯坦福便攜圖書館，它的 讓你不用擔心如何將新
GRect工作，或如何移動工作， 或如何添加工作。
所有你需要知道的是，加 是一個函數，你可以
使用，並且它這樣做。
所以，你真的不需要知道如何 它是用C編寫的，您只需要
知道，這裡是函數，他們 做的，這裡是1和0
當你真的想使用它們。
>> 涼爽。
在編譯器的任何其他問題 或電路板上的其他議題是什麼？
>> 學生：我有一個問題 實現遞歸函數。
關於遞歸的一個問題。
我會想出一個感覺。
因此，讓我們快速瀏覽一下 遞歸與特定
例如，階乘函數。
因為這是一個例子， 經常出現或使用
來說明遞歸。
>> 因此，“4！”讀作4的階乘。
又是什麼4的階乘是什麼意思？
那是什麼呢？
如何計算4的階乘？
4倍3倍2倍1。
>> 因此，另一種方式來寫4的階乘 就是寫這個。
4次3的階乘。
因為3是階乘 3倍2倍1。
所以，4次3因子為4 倍3倍2倍1。
這就是為什麼階乘是一個偉大的 候選人遞歸，因為它是
顯然，有一些東西， 發生一遍又一遍又一遍的
更小的一些事情，直到 你到達終點。
當你達到1,1的階乘為1。
你不能走得更遠。
0階乘也被定義為1。
所以，當你到達1或0，你 在最後，你可以
就回去了。
因此，如果我們想寫一個遞歸 函數來計算階乘，
我們將編寫一些 偽不動了。
在我們寫的偽代碼 -
我給你們一，兩分鐘 寫的偽代碼或者只是想
它 - 有兩件事情每 遞歸函數需要。
什麼是這兩件事情？
>> 傑克：它調用自身。
>> JASON HIRSCHHORN：諾亞？
噢，傑克。
來吧。
>> 傑克：它調用自身。
>> JASON HIRSCHHORN：所以遞歸 函數需要一個遞歸調用，
打電話給自己。
這是一。
這有什麼其他的事情？
>> 傑克：一個基本情況。
>> JASON HIRSCHHORN：一個基本情況。
一個基本的情況是，當我們停在這裡的。
所以，你的函數被調用。
基本情況是第一位的。
你要知道，如果你在最後。
如果你不是在結束時，你 讓你的遞歸調用。
和你又來了通過這個功能， 再次檢查你的基本情況。
如果你還沒結束，你做 另一個遞歸調用，
等等，等等。
>> 這就是為什麼遞歸函數總是 需要這些基礎情況和那些
遞歸調用。
如果你沒有一個遞歸調用，它 不會是一個遞歸函數。
如果你沒有一個基本情況， 如果你想走到永遠
不會有什麼結局。
和基本情況永遠是第一位， 因為你永遠要檢查
如果你在結束第一。
所以在我們做一些偽代碼，為什麼 你不花一分鐘思考
如何遞歸階乘函數 會寫的？
>> 此外，多達你在做什麼，寫 它列於一張紙是
你要什麼有 做測驗的明天。
所以大概好的做法，使 確保你寫的代碼
倒在紙上 -
或者你可以做到這一點。
你知道哪裡有分號。
你還記得的語法。
因為你不能夠有一個 編譯器告訴你犯了一個錯誤。
>> 此外，沿著這些線路，明天，當 您已編碼的問題，如果你
都衝了時間，或者如果你是非常 困惑，如何你應該
寫特別的事情在C，它 會理所當然你寫的偽代碼
或寫評論為好。
因為有一部份信貸 很多對測驗的問題。
所以，你可能操之過急，否則你 可能只是混淆。
寫在註釋或偽代碼 通常的方式，你
可以得到部分分數。
>> 所以，不要留下遺憾 在測驗的空白。
有沒有處罰 把東西英寸
實際上，投入在偽碼或 意見是要幫助的平地機
搞清楚，如果你真的知道什麼 你在說什麼，或許大獎
你為一些局部的信用。
>> 還沿著這些線路，寫清楚。
如果我們真的不能你寫的東西， 我們不會給你打電話
在明天午​​夜圖 出你寫什麼。
我們只是要起飛點。
寫清楚，以便我們能聽到，或者更確切地說， 我們可以讀你寫的。
>> 如果它說兩句話， 不寫的一段話。
按照說明進行操作。
寫清楚。
寫這些意見或 偽代碼的問題，可能
獎勵部分信貸。
>> 好了，讓我們去階乘。
所以我們有一個函數階乘。
如果我真正寫在C， 我需要什麼名字前放
函數？
返回類型，其中，在該 情況下，我們會給它詮釋。
然後在大括號內，是 善有善報花括號內為
一個函數？
>> 學生：參數類型。
>> JASON HIRSCHHORN：它的參數。
所以階乘大概會 帶參數。
它很可能只需要一個參數。
我們會說這會帶 一個整數名為x。
再次，寫的原型時， 一個功能或記錄的功能
在定義它，你在你的代碼 寫的數據類型和名稱
該變量的函數只。
所以，你可以通過一些數字到這個 功能，它會被稱為X
在內部。
>> 我們有我們的階乘函數。
我們需要兩個東西，一個基本情況 和遞歸調用。
是什麼樣的基本情況進行階乘？
有人誰寫出來誰沒有 講的是，什麼是基礎
案例階乘？
>> 學生：如果n小於 大於2，則返回1。
>> JASON HIRSCHHORN：如果n 小於2，則返回1。
我喜歡這樣，因為這 取0和1的照顧。
所以我們會先去做x <2，則返回1。
如果獲得通過0，如果我們得到 通過1，此功能將
立即返回1。
如果我們通過一些數量較大的 大於或等於2，我們要
有我們的遞歸調用。
>> 所以這是怎麼去上班？
可別人誰曾在此 誰一直沒有發言，給我的
遞歸調用此函數 在偽代碼？
如果我們傳遞一個數x 而且它大於2，什麼
我們想幹什麼？
我們也有一個例子寫在 一面，可能會給你一個提示。
>> 學生：調用x次的 x的減1階乘？
>> JASON HIRSCHHORN：完全正確。
我們要返回x次 的X減去1的階乘。
而且，即使我寫了， 基本上，你用英語說的話，
這個階乘函數 將得到再次調用。
這將X減1上執行。
它會返回一些整數， 然後它會乘這兩個
在一起，並且該值將是 回到什麼叫這個
階乘函數，這可能 是的另一個實例
這個階乘函數。
>> 所以這是一個遞歸的一個例子 功能，一個非常
簡單的遞歸函數。
但他們大多會是這樣。
如果你想一個很好的遞歸 為競猜挑戰，嘗試編碼
二進制搜索遞歸。
因為如果你做二進制搜索 問題設定了三個，你可能做到了
反复在一個while循環。
>> 但它也可以寫成 遞歸。
你將需要寫你自己的 單獨的函數，需要一些
不同的命令行參數 - 或 沒有命令行參數，一些
不同的只是普通的論點。
但你可以寫二進制搜索 遞歸地為好。
>> 學生：所以你可能也寫， 代替X減1，則
本來也寫X減 減號，或者你可以有
書面減減x。
你可以解釋得真快，為什麼 這些將是不同的東西，
喜歡的區別是什麼之間 X減減和減減x？
>> JASON HIRSCHHORN：不，我不 要進入那個。
不過，我以後會和你談談這件事 類。 X減，減，減減x
由1減小量X。
但他們這樣做有點不同。
但我不想去考慮這樣做。
關於遞歸其他問題 或者這個功能呢？
這不是真的連偽代碼。
這基本上是在代碼 c您會寫這個。
>> 好了，其他問題 的話題在這裡？
是啊。
>> 學生：我有一個快速的破敗 浮點和精度。
>> JASON HIRSCHHORN：浮動 點和精度。
可有人真的很快 給我一個破敗
浮點和精度？
你都必須做到這一點你 問題集，所以你的所有
熟悉它。
或者，也許不是所有的你。
任何人嗎？
給我一個開始的地方。
浮點和精度。
這是什麼問題？
是。
維多利亞？
>> 雲妮：凡妮莎。
>> JASON HIRSCHHORN：凡妮莎。
抱歉。
>> 雲妮：這裡只有有限數量的 可以表示數字
因為你是在，在我們的 情況下，32位的系統。
那種讓你不得不 彌補了一些數字。
>> JASON HIRSCHHORN：所以這是 完全正確。
有僅一定量的 可表示數字。
如果你將兩個非常大的數字， 它可能會溢出量
的空間，你必須代表 的整數。
這就是為什麼有時候我們使用 長，而不是一個int長。
有更多的空間。
可容納一個更大的數字。
>> 浮點精度，是因為有 這一點，但也有做的
事實是十進制數是 並不總是代表。
抱歉。
讓我把這個備份。
十進制數1.0並不總是 代表像你所期望的，
1.000000000。
它有時被表示為 1.000000001或0.999999999。
它可能是89甚至拋出 在那裡的某個地方。
因此，這些十進制數字是不 代表酷似你會
希望他們能來表示。
>> 所以在問題設置 -
是兩份？ -
問題設置兩個，在這裡我們處理 浮點數，當我們想
他們表示正是我們想要的 他們表示，數
便士，或仙的數量， 我們用100乘以它們。
我們繞過他們。
然後，我們切斷了​​一切 後面的小數點。
這是為了確保他們 實際上等於正是我們想要的
他們相等。
>> 因為當你把東西的 一個float和把它變成一個int，你
切斷一切的權利 的小數點。
因為有一些浮點 不精確，100.000可能是
表示為99.999999999。
如果你只是切斷了一切 右邊向右走，你要
得到錯誤的號碼。
是啊。
>> 學生：我有一個問題 有關轉換。
什麼為了它發生在？
如果你願意做浮動，支架，1分 10，它做1除以10，
然後得到0.1，然後打開 它變成一個浮動？
>> JASON HIRSCHHORN：如果你這樣做 浮動1除以10 -
>> 學生：是啊，然後等於 -
好了，它通常會 有它在平等的 -
是啊。
你想成為一個浮動，對不對？
>> JASON HIRSCHHORN：好了，我們要 用它來Segue公司進入搞清楚
在這些問題的答案 通過編碼。
因為你可能有很多的 這些細微問題，一個很好的方法
解決這些問題是通過編碼。
因此，我們現在要編寫這一權利， 然後我們要回去
你的代碼有問題。
>> 所以第一線 -
我不應該寫它 - 什麼是 我們要做的第一件事情，當我們
打開gedit中一個新的文件？
>> 學生：包括。
>> JASON HIRSCHHORN：包括什麼？
>> 學生：CS50庫。
>> JASON HIRSCHHORN：確定。
我們還應該包括哪些內容？
我們只是要檢查發生了什麼 當你施放的東西為float。
但是，我們需要包括，如果我們 打算寫一個C程序？
>> 學生：標準I / O。
>> JASON HIRSCHHORN：stdio.h中。
我們其實並不需要，這 程序，cs50.h，即使它的
總是有幫助的，包括它。
但我們總是需要stdio.h中。
>> 學生：C語言編碼什麼時候？
>> JASON HIRSCHHORN：在C編碼時
>> 所以我將它保存為這個c文件。
我得到了一些不錯的語法高亮。
我裡面主要寫無效。
什麼是無效的呢？
>> 學生：不採取任何 命令行參數。
>> JASON HIRSCHHORN：虛空的手段，在這 情況下，主並沒有採取任何
命令行參數。
在其他情況下，表示該功能 並不需要命令行參數。
或者函數，如果我是寫無效 主要（無效），這可以說主要的
不返回任何東西。
因此作廢只是意味著什麼。
我會怎麼寫，如果我是 採取命令行參數？
>> 學生：詮釋圓弧C字符串弧訴
>> JASON HIRSCHHORN：INT ARGC ARGV字符串。
是這樣嗎？
>> 學生：這是字符星級argv的括號內。
>> JASON HIRSCHHORN：所以你可以寫 字符串argv的括號或char星級的argv
括號，但你需要的括號內。
因為argv是一個數組 字符串，切記。
這不只是一個字符串。
所以字符串argv是，這裡的 一根弦稱為argv的。
字符串argv的括號是，這裡的 一個字符串數組。
所以整型的argc字符串argv的支架 會是什麼，我
可能會寫。
>> 所以，你想保存一個整數？
>> 學生：是啊，整數。
或者在浮動。
>> JASON HIRSCHHORN：在一個浮動？
像，浮x等於1除以10。
>> JASON HIRSCHHORN：確定。
printf中如何打印出一個浮動？
什麼？
>> 學生：％F。
>> JASON HIRSCHHORN：％F。
什麼是整數？
d或我。
什麼是字符串？
>> 學生：秒。
>> JASON HIRSCHHORN：秒。
我如何獲得一個新行？
>> 學生：反斜杠ñ。
>> JASON HIRSCHHORN：我該怎麼回 如果主要的運行是否正確？
>> 學生：0。
我是否需要寫該行有關係嗎？
>> 學生：
OK，我們不會寫它，然後。
每個人都可以讀嗎？
它看起來有點小。
大家可以看到，還是應該 我使它更大？
我覺得對於攝像頭，我們會做 它有點大，雖然。
>> JASON HIRSCHHORN：如果我想關閉這個 c文件為可執行文件，有什麼
我寫？
>> 學生：做測試。
>> JASON HIRSCHHORN：對不起？
>> 學生：做測試。
>> JASON HIRSCHHORN：請測試。
我們都在談論 這條線前面。
鐺。
什麼是鐺？
編譯器的名稱。
這是什麼線？
>> 學生：設置它為使用gdb的。
>> JASON HIRSCHHORN：集 它使用的GDB。
這條線，那是什麼？
>> 學生：源代碼。
>> JASON HIRSCHHORN：這就是 源文件，c文件。
什麼這兩行嗎？
或者這兩個不是行。
>> 學生：它的名字來測試。
>> JASON HIRSCHHORN：所以破折號ø說， 不同命名的東西。
在這裡，你調用它的測試。
如果我沒有在， 那會是什麼名字呢？
>> 學生：為a.out。
>> JASON HIRSCHHORN：為a.out。
這是什麼呢？
>> 學生：友情鏈接數學庫。
>> JASON HIRSCHHORN：它鏈接 在數學庫。
我們沒有包括數學庫，但 因為這是如此普遍，他們已經
寫make來總是包括 數學庫。
同樣地，這包括 在CS50庫。
>> 好了，如果我們列出，我們現在有 可執行文件名為test。
為了執行它，我寫的測試。
我看到我的浮點運算， 正如所料，等於0。
這是否 -
所以 -
>> 學生：那麼，如果你把現在浮動， 就像你將其轉換為浮動 -
>> JASON HIRSCHHORN：鑄鐵 1為float？
>> 學生：不，投滿的事情 -
是的。
如果你只是這樣做，會 這使它0.1？
>> JASON HIRSCHHORN：好了，真的很快， 1除以10，這些都是
整數被分割。
所以，當你劃分整數，它們是 0，而你節省了0的
浮動，因為斜線 只是整數除法。
所以，現在我們正在轉彎的東西 成浮動。
>> 讓我們看看會發生什麼。
我們會讓測試。
所以，現在我們看到的斜線不 整數除法，它是浮動的
分點。
因為它的參數之一 已被轉換為一個浮點數。
所以，現在有人說，對待這個 師像我們正在處理
浮動點，不帶整數。
所以我們得到我們期望的答案。
>> 讓我們看看會發生什麼 -
哎呀。
如果我想打印更十進制 點，我怎麼能這樣做呢？
>> 學生：點圓點f或盡可能多的 只要你想的小數位數。
>> JASON HIRSCHHORN：所以我打印 10進制的斑點。
而我們現在看到我們越來越 一些怪異的東西。
而這又回到你的問題 關於浮點不精確。
有奇怪的東西存放在這裡。
>> 好了，這是否回答你的問題？
你想要什麼 快速代碼？
>> 學生：我只是想看看是否 不，如果你釋放了一些指針，
該指針是否仍然存儲在 它是什麼它一直是地址
指著前面。
>> JASON HIRSCHHORN：OK， 所以讓我們做到這一點。
字符明星PTR，這將創建一個變量 所謂PTR char類型的明星。
我怎樣寫的malloc？
奧爾登？
>> 奧爾登：只是malloc的。
但隨後它必須的尺寸，並 在這種情況下，我想你會
是指向字符。
所以它會是char。
>> JASON HIRSCHHORN：OK，所以更 一般地，內幕 -
讓我們編輯。
裡面的malloc，你要的號碼 字節的堆。
一般情況下，我們所看到的，我們是 做的是我們要去用malloc
字符串，例如，或 整數的數組。
因此，如果我們想要10的整數，或10 字符，10會給我們10。
然後字符的大小會給 我們說，字符大小，這在
這種情況下，是1個字節。
我們得到了10個字節​​。
如果我們寫為int的大小， 這會給我們40字節。
>> 所以更一般地，malloc的內部 是你想要的字節數。
在這種情況下，我們得到1個字節。
這似乎是一個奇怪的運用 malloc的，但對於我們的
目的是有道理的。
因此，有一點。
>> 我們要調用free。
我們擺脫它，我們再次使用PTR。
和你想要什麼檢查？
>> 學生：我只是想檢查是否 或不存在是什麼，
裡面的它。
>> JASON HIRSCHHORN：所以，無論 它指出了什麼？
>> 學生：是的，沒錯，無論是 它仍然有一個存儲器地址。
>> JASON HIRSCHHORN：所以，你想要 檢查ptr的值？
>> 學生：是的，沒錯。
>> JASON HIRSCHHORN：那我寫在這裡 如果我要檢查的價值
點 - 什麼是，喬丹 說，值？
或者什麼是存儲PTR裡面？
>> 學生：一個內存地址。
>> JASON HIRSCHHORN：一個內存地址。
所以，如果我寫的只是這一點，它會 給我ptr的值。
以及如何打印出 一個內存地址？
什麼是格式字符串 用於存儲器的地址？
>> 學生：％P。
>> JASON HIRSCHHORN：％P。
％s是一個字符串。
％P的指針。
是這樣嗎？
這是正確的。
所以PTR等於 -
但仍然有一些東西在裡面。
這可能是一個更 有趣的問題。
這是什麼線路呢？
>> 學生：賽格故障。
>> JASON HIRSCHHORN：什麼？
>> 學生：我覺得這賽格故障。
>> JASON HIRSCHHORN：嗯？
>> 學生：我認為它會賽格故障。
>> JASON HIRSCHHORN：所以這條線 的代碼，明星PTR，是什麼
沒有星星是什麼意思？
>> 學生：內容。
>> JASON HIRSCHHORN：是啊。
去得到的內容。
因此，這是要去記憶 有地址，並讓我說。
我用％C就在這裡，因為有 存儲有字符。
因此，我們打算去那個地址我們 剛看到 - 或者它可能會成為一個
稍微有點不同，這 一次，我們運行該程序。
但我們會去那個地址 我們知道仍然存在
看看那裡的東西。
>> 所以也沒賽格故障。
它只是沒有給我們任何東西。
它可能實際上已經給了我們 東西，我們不能看到它。
而這又回到這個想法 -
並且我們不會得到太多到 這一點，因為這是超越
本課程的範圍。
但我們談到這裡吧，如果我們 超出了數組界限由
1，我們可能不會惹上麻煩。
>> 有時候，當你只是1熄滅， 你正在做的事情錯了，你
可能惹上麻煩。
但你並不總是惹上麻煩。
這要看怎麼是一件壞事，你得多 這樣做，你會惹上麻煩。
這是不是說，馬虎 與您的代碼。
但它說，該計劃將不會 總是跳槽，即使你去的地方
你不應該去。
>> 這方面的一個很好的例子是，很多 人們在問題設置3，其中
15歲，沒有檢查 董事會的界限。
所以，你看左邊，看向 右，看著頂端，看著
至底部。
但你沒有檢查，看看是否頂部 實際上將是在黑板上。
和很多人誰這樣做了， 原來，在，他們的工作程序
完美，因為那個地方是板 存儲在內存中，如果你走了一條
它上面或托運的記憶 地址，有沒有什麼
尤其可怕的這個， 所以你的程序是不是
要罵你。
>> 但是，我們仍然起飛點，如果 你沒有檢查，因為你
在做一些你不 應該做的，而你可以有
變得麻煩了。
奇怪的是，雖然你可能沒有。
因此，這是證明，是的， 我們仍然可以去它。
而我們沒有得到的 在這種情況下，麻煩。
如果我們試圖做閱讀 接下來的100個字，我們就
可能惹上麻煩。
而且你可以編寫讀取下一個100 字符，如果你想要做一些
排序的for循環。
是啊。
>> 學生：因為我們被分配了 空間的實際值，我們不會
居然能看到什麼。
我們是否應該嘗試用該設置 等於像C什麼的？
>> JASON HIRSCHHORN：大問題。
我如何設置該值 -
我寫行哪一行代碼 七，你說什麼？
>> 學生：星PTR等於單 引用C + +期末單引號。
>> JASON HIRSCHHORN：所以這把 一個字符，C，在該位置，
因為再次，這顆恆星 意味著去那裡。
和左手側使用時 賦值運算符，等於
簽名，我們不會得到那個 值這麼多的設置值。
現在，讓我們看看會發生什麼。
>> 我們把那裡的東西 並且它在那裡。
我們所謂的自由。
有些東西可能發生 在堆上。
因此，它不存在了。
但同樣，我們沒有得到 在為去那裡的麻煩。
>> 我這樣做出來的代碼來說明 有很多這些
您有任何問題，他們是 真的很有趣
回答了很多時間。
而且他們真的很好的問題。
並且你可以計算出來的 自己如果，例如，
我們不是在一節。
是啊。
>> 學生：因為你沒有送 指針的任何地方，你需要
使用malloc？
>> JASON HIRSCHHORN：所以這可以追溯到 給你最初的問題。
[？ ？]
難道僅僅是一個局部變量？
這裡的malloc是不是引人注目。
在使用malloc這裡就不 那引人注目，因為它是
只是一個局部變量。
>> 學生：所以你能做到的char 明星PTR等於你好？
>> JASON HIRSCHHORN：哦。
所以，我們要拿回 給你最初的問題。
我覺得你不滿意 我的回答。
好不好？
喜歡嗎？
>> 學生：是啊。
等待。
>> JASON HIRSCHHORN：在哪裡 你想打印出來？
因此，我們將打印出一個這樣的字符串？
>> 學生：有趣。
>> JASON HIRSCHHORN：所以這個說，這 參數有一個字符的類型。
所以這應該是一個字符。
>> 學生：只需要第一個。
>> JASON HIRSCHHORN：所以這 就是我之前說的。
就像我說的，它不是存儲 字符串變量的指針裡面。
它的存儲 -
>> 學生：第一個值 的字符串。
>> JASON HIRSCHHORN：的地址 字符串的第一個值。
如果我們要打印出這一點，我們 進入內部指針的值。
我們會看到它確實是， 的存儲器地址。
>> 這是否有道理？
抱歉。
等等，這是否回答你 問題有關係嗎？
>> 學生：是啊。
>> JASON HIRSCHHORN：這行代碼是 創建一個字符串，然後再
變量指針的指向 該字符串，數組。
是啊。
>> 學生：所以，如果我們去一個內存 進一步解決，我們將得到的H？
有沒有被存儲為一個字符串？
>> JASON HIRSCHHORN：像我們所做的 -
所以這是有價值的事情。
這是第一點運算，這你們 以前見過，應該是
比較舒服。
這類似於寫 -
如果我們寫這行代碼， 我們以前見過數組符號。
這應該給我們的第二個 在這個數組，H值。
>> 如果我們這樣做，這也應該給 我們在該數組的第二個值。
因為它是將不向存儲器 的第一件事地址，但
的事情之一，在內存地址。
然後恆星取消引用運算符 該指針。
再次，讓我們來看看。
我們再次拿到小時。
>> 學生：這到底是什麼 解引用是什麼意思？
>> JASON HIRSCHHORN：取消引用 是看中字去。
去那個並獲得那裡的東西 是取消引用指針。
這只是一個花哨的字的。
>> 學生：如果我們想打印 整個字符串，我們可以
做符號指針？
>> JASON HIRSCHHORN：OK，我們都 要在這裡暫停。
我們將在這裡結束。
符號給你一個地址 位置，所以你做的時候符號
一個變量，它給你的地址 其中的變量存儲。
符號指針會給你 PTR其中ptr是在內存中的地址。
>> 我們不會去 用這個例子。
你能弄清楚這些 自己的東西。
但是，這甚至可能是一個瀕臨 超越你需要知道的一點
這次中期的範圍 -
或本測驗，而。
抱歉。
>> 我們要繼續前進，因為我會 喜歡做一個編碼問題
之前的時間到了。
而我們將要編寫什麼，我認為 是目前最引人注目的這些
例子，atoi的。
所以這是一個問題 測驗兩年前。
我有它的董事會這裡。
>> 人們被要求在測驗 -
他們得到多一點tesxt在 的問題，但我消滅了
文本，因為它是不必要的 我們的目的了。
這只是一些背景 什麼是atoi一樣。
但大家都知道，是非常 熟悉的atoi。
>> 我建議你這個代碼 上一張紙。
我也建議你使用策略 我們已經討論了
很多在我們的一節。
首先，確保你理解 什麼是atoi的做。
畫一幅畫或想出一些 它在你的腦袋的精神形象。
接下來，寫出偽代碼這一點。
在測驗，如果你得到的是 偽代碼，至少你
裝上去了下來。
然後是偽代碼映射到 C.如果你有一個檢查在你的
偽代碼，就像檢查什麼 是1，即映射到如果一個
條件等等。
最後，代碼在C程序
>> 所以回去的atoi和需要五分鐘 編寫本上的紙
紙，這可能是關於 的時候，你會採取一個量
測驗代碼atoi的。
5至15分鐘，5至12個，5到 10分鐘後，大約的量
時間你會在這上面花 問題的問答。
因此，需要五分鐘的話，請。
如果您有任何問題，提高 你的手，我會回到你身邊。
>> [私下交談]
>> JASON HIRSCHHORN：好了， 那是五分鐘。
這是大概的金額 你最好花了一個測驗，
那個時候，也許低端。
我們將回顧一下在一個位。
讓我們開始編碼了。
如果我們沒有得到，一路過關斬將， 的答案，這個和這個
測驗問題的情況下，再一次， 2011年秋季是當這個問題
出現在測驗。
>> 而這是值得八個點 在測驗即可。
八個點是對的高端 點的東西量是值得的。
大多數問題都在範圍內 一到六個點。
所以這是一個更具挑戰性 問題是肯定的。
誰能讓我開始？
>> 一般情況下，究竟是為了什麼 要想做這個
函數atoi，邏輯？
我們究竟想幹什麼？
所以我們要編寫 一些偽代碼。
>> 學生：轉換字符 成整數。
>> JASON HIRSCHHORN：轉換字符 成整數。
確定。
那麼多少個字，我們都 將需要辦理什麼手續？
>> 學生：他們全部。
>> 學生：所有人物 在字符串中。
>> JASON HIRSCHHORN：所有 字符的字符串。
因此，如果我們想要去通過每一個 字符的字符串，是什麼東西
C語言，我們已經看到，已經允許 我們走過的每
字符在一個字符串？
>> 學生：一個for循環。
>> JASON HIRSCHHORN：一個for循環。
因此，我們通過將循環 每個字符s中。
>> 那麼什麼是我們要想做 當我們得到一個特定的字符？
說我們就要過去了90。
我們得到了9。
這是一個字符。
什麼是我們想要做的 該字符9？
>> 學生：從字符0中減去了嗎？
>> 學生：加0？
>> JASON HIRSCHHORN：減去 它從字符0？
>> 學生：是啊。
>> JASON HIRSCHHORN：為什麼 你想這樣做？
>> 學生：[聽不清]
值。
它的int值。
>> JASON HIRSCHHORN：好了，我們走 字符9，從它減去
字符0得到一個 實際整數9。
甜蜜。
你怎麼知道字符 9負0字符是9？
你看什麼圖？
>> 學生：有邏輯上9 在9和0的地方。
或者你可以看一下ASCII表。
>> JASON HIRSCHHORN：ASCII表。
但是，是的，你是正確的為好。
所以我們減去0。
所以，現在我們有整數9。
什麼我們想要做的是什麼？
如果我們有90，它是一個整數 我們，就是我們想幹什麼？
>> 學生：我把一個臨時整數 數組，然後做數學吧
後來將它做成了盡頭。
>> JASON HIRSCHHORN：確定。
>> 學生：您可以開始在年底 該數組，然後向前移動，以便
你往前走每一次， 你乘以10。
>> JASON HIRSCHHORN：確定。
這聽起來像一個漂亮的 引人注目的想法。
我們可以在我們的數組的末尾開始， 而且我們可以使用strleng。
我們可以在這裡使用strleng。
我們會得到我們的字符串的長度。
首先，我們在最後。
和+第一位的，我們只取了 整數，也許我們創建一個像
新的整型變量往上頂，其中 我們要存儲的一切。
因此，我們通過以s每個字符從環 回到前面，我們減去0，
然後我們把它，並根據 它在哪裡，我們乘它
以10的冪。
因為第一個，我們怎麼辦 乘以最右邊的字符？
>> 學生：10到0。
>> JASON HIRSCHHORN：10到0。
什麼是我們乘第二 最右邊的字符通過？
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：什麼？
>> 學生：10到1。
>> JASON HIRSCHHORN：10到1。
第三，最右邊的字符？
>> 學生：10到2。
>> 傑森HIRSCHHORN：10至2。
>> 學生：對不起，我不明白 我們在這裡做的。
>> JASON HIRSCHHORN：OK， 讓我們回去，然後。
所以，我們要得到 傳遞的字符串。
因為我們正在寫的atoi。
所以我們得到傳遞的字符串。
說，我們正在獲得通過 在串90。
>> 我們要做的第一件事就是設置 一個新的整型變量，我們是
只是要創建 作為我們新的整數。
這就是我們要去 返回在最後。
我們需要經過每一個字符 的字符串，因為我們已經確定
我們需要觸摸每一個和 然後將其添加到我們的新的整數。
>> 但是，我們不能僅僅將其作為一個數字。
我們不能只取9和 新增9對我們的整數。
這要看是什麼地方 它是字符串中。
我們將需要乘 它由10的冪。
因為那是基地10件作品。
>> 所以，我們要獲得實際的 字符，或實際整數
數，減去字符0 從9字就像我們一樣
從減去字符大寫A 任何性質我們在一
這些問題。
因此，我們將真正得到一個從0到 9保存為一個實數，我們將
由10根據功率乘以 在我們所處的字符串中。
然後我們將其添加回 成我們新的整型變量。
>> 那麼，這看起來就像會 可以 - 我們將繪製在這裡。
如果我們傳遞的字符串90 -
>> 學生：[聽不清]。
>> JASON HIRSCHHORN：但 atoi的接受一個字符串。
因此，我們要經過 的控股。
我們會獲得通過的90。
我們去從後面到前面。
我們以0。
>> 學生：我很抱歉。
也許這是愚蠢的。
如果我們得到傳入一個字符串， 為什麼是90我們在做什麼
獲得通過的？
因為90是一個整數。
>> JASON HIRSCHHORN：因為atoi的需要 字符串，並把它變成整數
該字符串表示形式。
但是字符串90不是整數 90或90位。
串90是兩個陣列，或 三個大字，相反，9
字符，字符0，和 反斜杠字符0。
>> 我們正在寫的atoi，因為， 例如，當你把命令
行參數，並且它保存在 argv的，它保存為一個字符串。
但是如果你想將其視為一個數字， 您需要將其轉換為
實際的整數。
我們做了我們的問題集之一。
我們在一些做 我們的習題集。
大家，把一個整數 作為命令行參數。
所以這就是為什麼我們的atoi函數 接受一個字符串。
>> 所以，再一次，在這裡我們的例子中，我們 要採取最後一個。
我們要減去字符 0從它，因為字符0
減去字符0給你 的實際數目為0，根據
ASCII碼的數學，我們做的。
>> 因為字符被表示為 不同於他們的實際 - 的
一個字符，例如 小寫字母a為97。
這不是 - 糟糕！
這不是任何你所期望的 它是，例如0。
所以，你必須減去 字符得到0。
>> 所以，我們要做的是，這裡 得到的實際數量。
然後我們將通過乘以它 10的冪取決於它
是在字符串中，然後採取 並把它添加到我們的佔位符
變量，所以我們可以拿出 我們最終的新的整數。
這是否有道理給大家？
>> 因此，我們不打算這個代碼 現在，因為我們
越來越短的時間。
我的，何時道歉。
但是，這是什麼，希望你會 能夠做的測驗 - 在
最起碼，得到這個偽代碼 寫出來。
>> 然後，如果我們寫的 偽代碼，實際上，我們可以這樣做
很快。
註釋每一行我們我們寫 在這裡轉化為約
一行C代碼。
聲明一個新的變量，寫作 一個循環中，一些減法，一些
乘法和一些分配。
我們可能還需要 寫一個返回行。
我們可能還需要放 一些檢查在這裡。
是啊。
>> 學生：所以我們可以把 S作為實際的字符串？
因為我知道這只是一個地址。
就像，你會怎麼得到的長度 該字符串被通過？
>> JASON HIRSCHHORN：那麼，如何做 字符串的長度是多少？
strlen的。
>> 學生：strlen的，是的。
不過你能不能把S作為 論點是什麼？
>> JASON HIRSCHHORN：所以strlen的 需要一個char明星。
接下去就是字符明星，它 保持計數，直到它到達一個
反斜杠0。 strlen的竟是 其他項目之一，我們
將要的代碼。
這是另一個很好的一個代碼。
一個人的更容易一點，因為如果 你要想想，
概念 -
我只是說出來大聲 - strlen的如下 一個指針，並保持持續和
計數和跟踪，直到 你達到一個反斜杠0。
>> 學生：好的，知道了。
>> JASON HIRSCHHORN：所以最好的 運氣測驗0的明天。
如果您有任何問題，我會 在此之後在外面。
請隨時給我發電子郵件。
伸出自己的TF，如果你 不是在我的部分，或者讓我
如果你想通過電子郵件發送。
>> 如果你想發飆了，只是發送 我一個電子郵件，一個FREAKOUT電子郵件，我會
送你回去，像一個笑臉， 還是一樣，開個玩笑什麼的。
可以隨意做，也是如此。
祝你好運再次，我會 見到大家下週。