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電子郵件,我會 送你回去,像一個笑臉, 還是一樣,開個玩笑什麼的。 可以隨意做,也是如此。 祝你好運再次,我會 見到大家下週。