[主題曲] 揚聲器1:嗨,大家好。 歡迎回到一節。 美好的一天out--這是為什麼,我 當然,也有只有你們四個在這裡 而不是我們平常包。 我一直在生病這個週末。 所以,我沒有對星爆你們。 我可能會開始咳嗽 可怕的整個。 因此,只要多多包涵。 我要真正嘗試 並通過這個獲得第一, 雖然,之前我有咳嗽發作。 但是,僅僅是簡單的對我 小bit--這就是我問。 因此,我們對today--議程只是一個 下週reminder--你測驗是。 我告訴你,這最後一周,因此 會不會抓住你措手不及。 所以我再次提醒你。 下週的測驗。 為此,下週的 節會更 of--我會試著在一些審核工作。 所以,如果你們能 幫我出了送我 的東西,你是舒服 有,那你擔心, 你想的主題 我來遮蓋,那簡直太好了。 所以,我可以嘗試和他們的工作 到下週我們的部分 或向您發送額外的材料或準備 你可能不會得到其他地方。 是啊! 越來越多的人來了! 我想,我做的不好最後 本週,沒有人願意回來嗎? 我很害怕。 所以其他的三件事 我們打算走了過來 是重定向,文件I / O,以及 然後指針和動態內存。 我敢肯定你們都超興奮 pointers--大家最喜歡的話題, 所以簡單的理解。 我敢肯定你們都明白了吧? 所以首先第一件事情,redirection-- 這基本上只是一個方式 控制如何輸入 事到你的程序, 你是如何從你的程序輸出的東西。 主要的方式,你們 已經與它交互 僅僅是通過標準輸出 在這裡您打印屏幕。 但有辦法 pipe--我們在這裡看到 我們words--獨一無二的 管道的信息 或者該數據轉換成從一個文件中的一個文件。 這只是不同的方式 收拾東西到你的程序 而你的程序,而不是 只是打印他們這個屏幕 或輸入的東西 在命令行中。 所以,第一個是小 比插入符更大。 所以output--它只是打印輸出 到文件,而不是你的屏幕。 所以,如果你有一些印刷 “你好,世界!”到屏幕上, 如果你把它改為 到output.text,那 創建此文件名為output.text。 當你打開它時,它會 說“你好,世界!”在那裡。 這可能是超好用 如果你有一噸的錯誤 實際上,正如我們看到的這一個。 如果你做兩插入符號,它會 打印的錯誤信息。 所以,如果你有一個問題 編譯,它有很多的錯誤 而你要在努力陷入困境 在命令行滾動 通過所有這些,你可以 只是它們打印到文件, 打開該文件,這樣您 可以通過他們比較容易滾動。 其實我用了一個 很多時候我在調試 我的181 pset中的機器學習。 所以可以超好用以後。 它也是有用的,如果你有一個程序 這也許是生成一個圖書館 或產生一些集 字符串,你 需要能夠看到 它的正確生成它們。 這是做到這一點的方法。 所以,如果你把它們打印到文件,你 可以更容易地檢查它們,對嗎? 與試圖滾動 通過你的命令行。 再有一點要注意 是,只用更大 比插入符號,如果你正在寫 到已exists--一個文件 這樣一樣,如果我們跑這第一 一次,我們把它output.text, 然後我們有了第二個節目 該印刷這是方案二 並做了比output.text更大, 它將覆蓋that--這樣 覆蓋了什麼是有史以來在 該文件開始。 所以,如果你想追加 到一個文件,我們在這裡看到, 你只要做的比跡象2大。 而且將追加到它。 它不會覆蓋它。 所以,如果你需要運行多個 計劃和種不斷 跟踪什麼所有的人都 返回到您的文件, 這是一個辦法做到這一點。 如果你不在乎什麼在你的文件 並且它允許被覆蓋, 你可以使用比單一更大。 這是否有意義大家? 聽眾:像點斜線你好更大 比輸出點的文字,像兩次, 它會僅僅只顯示輸出 點文本第二時間 - 揚聲器1:沒錯。 所以它基本上是完全 覆蓋是什麼在那裡開始。 如果在這裡,在此文件 output.text已 存在,基本上無論你怎麼稱呼 這再次用一個較大 比你可以把它 因為喜歡它替換的文件。 當你保存一個Word喜歡 文檔和你另存為, 與你保持相同的名稱, 它完全覆蓋它 - 這是同樣的事情。 任何人有任何問題, 只是輸出到一個文件? 真棒。 所以,很顯然,如果你扭轉, 箭頭方向,它可以做輸入。 所以,當你們有 像愷撒和的Visioneer 你必須輸入一些東西, 你有一個命令行參數 實際上它的輸入。 這是另一種方式來做到這一點。 因此,而不是等待 對於命令行提示, 就像當你問你的 在愷撒或消息的Visioneer, 如果你有一個文本文件 那有你的消息, 你可以只需鍵入它變成。 因此,如果這是像點斜線撒 3小於箭頭輸入文本,這 是你的訊息,也 會運行得很好。 當你的凱撒程序實際上 要求來自用戶的輸入, 那就已經擁有了它,因為 你輸入的這個文件。 這只是另一種方式。 的output--只是一個反向 只需輸入您的數據。 然後,最後一個是管。 所以這一塊的很酷。 因為它可以讓你 取一個的輸出 程序,並把它作為 輸入到其他程序。 我不知道你們中的任何 玩解密 這CS50可能 給你的,但它會 讓你花一些樣品 文件,將其輸入到加密, 然後從那裡輸入 那到你解密 以確保它竟然是一樣的。 因此,它是一種像三路循環。 去了。 聽眾:如果一個程序 具有多個輸入, 有沒有辦法來告訴它哪個輸入 使用文本文件或輸出? 揚聲器1:它有多個輸入。 無論你的文件input--時,它的 要求輸入的第一次,這是 要承擔,我認為,這是 將管在整個文件中。 所以,如果你有多個輸入,你 將要通過管道中的多個文件。 所以,如果你問的消息 在你的代碼三次, 你將要放 在三個不同的文件。 它得到瘋狂。 你不應該 擔心現在。 但是,這是這個想法。 所以呀,管是一種只輸出 程序使用輸入到其它。 每個人都很好嗎? 涼爽。 行。 你可能不會有 做太多吧。 但是,你應該明白 方法可以用這個。 並且在某些情況該 你可能想使用它。 所以,文件I / O--我知道你在做什麼 saying--我們已經習慣了從閱讀 並寫入我們的屏幕出現, 這是標準和標準輸出。 而這正是你們一直 因為上課開始在這裡做什麼。 但你也可以讀取和寫入文件, 這是所有的I / O--所以文件輸入文件, 輸出是所有代表。 因此,這基本上意味著, 您現在可以存儲你的數據。 當你只需將它打印到 屏幕上,它基本上消失了,對不對? 只要你做的“Hello 世界“並運行的”Hello world“ 它打印的“Hello world”到屏幕上。 但你不能真正做到 任何與它從那裡。 如果您在文本存儲 文件中,然後突然 你有你允許該數據 操縱或把它放到一個文件中, 或者把它變成一個程序後。 其中的一個原因 為什麼我們這樣做僅僅是 作為一種方法來存儲數據以供以後使用。 我有幾個步驟,在這裡 通過標準只是走 I / O。在第一步中,您 需要建立一個參考 與所有文件 帽FILE明星的文件。 以便創建一個指針到一個文件中。 所以,你要打開它。 和你說,從字面上看, 只是文件的fopen相等。 並且這將返回一個 指針到剛才打開的文件。 我看到了一對夫婦的你 球員在辦公時間。 不過的事情之一 是remember--指針 可以是一些地址或者為null,對不對? 如果我們曾經有一個情況 東西可以返回null, 我們有什麼做的 之前,我們曾經使用它呢? 我們需要檢查 這是空或不是,對不對? 因為有些人可能有過 的問題,即任何物體 在突圍中被返回為空。 您試圖執行 它的一些功能。 與您的電腦網站出現故障。 對不對? 我敢打賭,一對夫婦的你 可能有這個問題。 所以用的fopen,FOPEN要么 返回一個指向該文件, 或者,如果出了問題, 它會返回null。 所以,你總是需要檢查 它沒有返回null 之前嘗試做別的。 這就像一個標準的範例 那你要在這裡需要。 如果有過一個機會, 事情就可以返回null, 檢查以確保它 不,然後再繼續。 否則,你會 讓可愛的現場故障。 沒有人喜歡處理那些。 所以,我們在這裡看到,第一個參數 僅僅是文件路徑。 如果該文件不存在,則 它會創建一個文件。 它只是將是空白的。 然後第二個參數 是您想要的模式。 我們想從這個文件讀取? 你想要把它寫? 你想追加? 所以實際上我剛才說 - 如果該文件不存在 而你試圖讀 它,它會拋出一個錯誤。 如果文件名稱 - 如果喜歡 file.text還不存在 你想寫 它,它會創建 所謂file.text你一個空白文件。 如果你想追加, 你應該做同樣的事情。 這是否有道理? 如果你想從閱讀 那還不存在的文件時, 它會拋出一個錯誤。 否則,它會創建文件 為你做什麼,你想要它。 涼爽。 現在我們可以從文件中讀取。 而這僅僅是種會 通過不同的功能 我們對文件I / O操作。這將 有必要在本週的pset中, 如果我沒記錯的話。 是的,這絕對將是 有必要在本週的PSET。 所以龜etc返回下一個字符。 FGETS只返回一行文本。 它會返回任何東西來 一個新的行,這將打破。 所以,用fread讀取某一 字節並將其名額數 成的陣列,其 是你可能會 想要做重新size-- 可能是有用的。 有多少人看過 pset的規範,對了? 行。 [聽不清] 揚聲器1:OK。 行。 絕對看that--這是一個有趣的pset。 你去恢復已刪除的記憶 card--時,它的作品真的令人興奮。 但可以肯定,開始讀了。 再來說說我,如果你 有關於它的問題。 好了,因為我說的,FREAD 讀出一定數目的字節。 這是一些任意數量 那你要設置的。 然後FSEEK只是移動 到了一定的位置。 因此,也許你不在乎 關於接下來的10個字節​​。 你只是想跳過前面。 你不關心這些。 你想讀的起始字節11。 fseek的可以讓你做到這一點。 所以,它可以讓你有所選擇 你在看什麼書。 因為龜etc,與fgets,並用fread讀 從該文件中的某個地方。 一種方法去思考,這是如果這 是我們的文件,當你第一次打開它, 你在文件中這個位置 這開始於開始。 每當你打電話 龜etc,fgetf,或用fread, 它會從開始 這個位置標記。 比方說,你只是想讀 這一段記憶在這裡。 你不能只是打電話。 你必須尋求看過來 然後從那裡讀 或閱讀,獲取,或getc的, 這取決於你想要什麼。 因此,尋求公正,您可以 跳過存儲器的部分。 而這是唯一的 這樣,你可以跳過的東西 沒有閱讀到您的緩衝區。 這是否有意義大家? 很顯然,有一個 很多並行這裡 - 的 我們的輸出或輸入重定向, 您已經閱讀並書寫。 所以的fputc只是寫了一個 字符到該文件中。 fputs將寫入一條線。 fprintf中打印一個格式化的輸出。 所以,如果你有標籤, 或空間,或諸如此類的東西。 然後fwrite的寫一些 字節數組到一個文件中。 因此,這是同樣的方式 FWRITE和FREAD類似於 opposites--與fgets,fputs函數和 隨後的fputc和fgetc--地段 瘋狂的,快速的東西。 剛種保持這個handy-- 您將有不同的時間 在那裡,也許你只是想 一個字符的時間。 也許你想一整行。 隨著你的字典pset-- 這是在2 pset時, 我相信,我們給你一個整體 字典中的文本格式 其中有每一個字 由一個行分隔。 所以,如果你想讀 在一次一個字, 也許你用什麼,如果你正在閱讀 而且他們都分開上新的生產線, 只是想和你在一個時間一個字? 聽眾:FGETS 揚聲器1:沒錯。 Fgets--因為返回 無論是在一行上。 如果每一個字是它的 自己的路線,我們可以使用與fgets。 涼爽。 這是否有意義,大家? 很酷吧? 是啊,我們要得到 最有趣的部分與指針 很快,在那裡你 可以做一些數學。 而這將是巨大的。 最後step--關閉您的文件。 在這裡這麼多的事情, 我們的範式之一 是,如果它可以返回 空,檢查空。 如果你打開的東西, 你最好將其關閉。 OK,這樣你就不會做了,直到你 這樣做,除非你已經關閉了它。 有點像這還沒有結束 直到胖女人唱歌。 這就像關閉文件。 因為它說,在這裡,只 再次重申,永遠 打開您的文件你之前 讀取或寫入數據。 並始終將其關閉,如果你已經打開了它。 行? 涼爽。 因此,這裡是一個例子。 所以tiny--我不知道,如果你 你們可以看到,非常好。 如果我們能提高 亮度莫名其妙。 讓我真正做到這一點,如果我能。 OK,你們真的不能 看得出來,所有的,可以嗎? 好了,我們要做到這一點,那麼。 [聽不清] 我認為這是更好的看到。 任何人都可以看到我的 鼠標去是個問題? 啊,還有這is--什麼奮鬥! 行。 基本上,你們應該有一種 什麼這一個想法在做什麼。 它並不完美。 但我寧願解釋它不是花 更多的時間來正確地格式化。 基本上,你在這裡看到, 我們首先打開文件。 和我們有一些 我們是數據庫文件 打開該說這是我們的學生。 我們要去寫它。 所以,當然,返回null。 因此,我們要檢查空。 然後,如果它不是 空,我們去。 正如你看到的,我們 循環經過這裡。 還有的學生。 學生是被定義為三個散。 我們正在做的事情是我們 打印到文件,對不對? 那麼,我們打印出我們的文件? 聽眾:得分 這是在陣列中? 揚聲器1:是啊。 這是在分數 在array--正好。 因此,我們要打開這個 數據庫文件,該文件 我以為是某種 的成績數據庫。 而我們只是打印出 分數每一個學生到該文件。 很酷吧? 不錯。 真棒。 行。 讓我們回到to-- 觀眾:我有一個快速的問題。 是的printf不是在for循環? 這只是在if循環? 揚聲器1:不,這是在for循環。 我看不到我的鼠標非常好了這裡。 所以我在努力 格式正確。 這架應消失。 它應該是到這裡。 這是在你的for循環。 那裡。 現在它的漂亮。 所以這是它應該如何be--除外 對於我被解僱,去年支架。 行。 這是否有意義大家? 行。 我們將繼續前進 在接下來的事情then-- 其中,實際上,你會 到需要看到的代碼。 所以我只是要 複製了現在。 行。 所以我要告訴你這傢伙的代碼。 我希望你能嘗試和數字 什麼是應該做的。 所以,有了that--花一分鐘左右。 試圖弄清楚是怎麼回事。 任何想法? 我們知道,我們至少有兩個 在命令行參數,對不對? 我想其中一個將是 那[聽不清]我們的節目是 然後別的東西。 因為如果[聽不清]為少 超過兩個,我們大聲呵責。 對不對? 而從使用,它看起來像 這將是某種形式的文件。 我們都同意這一點? 所以,現在,什麼是循環在做什麼? 它是什麼經歷? 聽眾:所有的文件。 揚聲器1:沒錯。 它會遍歷所有的 我們已經投入存在的文件。 因此,對於每一個文件,它的 開放一些字符串出現。 它開闢了該文件。 對不對? 和它的從中讀取。 當然,檢查它是否為null。 然後它的打印。 如果它是空的,它只是告訴我們 這是不是一個真實存在的文件。 因為記得,有 請閱讀我們的文件必須存在。 對不對? 隨著寫入和追加, 你可以擺脫它。 但是,隨著讀,我們的文件必須存在。 然後,如果它確實存在, 什麼是我們在這裡做什麼? 就讓我們從這裡開始。 這是什麼do--這第一個字符。 它有什麼作用? 他得到一個字符,對不對? 那麼,什麼是該做的? 它獲得的第一個字符。 任何人都知道EOF? 聽眾:文件結尾? SPEAKER 1:file--正好結束。 所以,它要經過 整個文件,對不對? 然後它會被更新 讓每一個後續字符。 對不對? 而且它是什麼做的? 聽眾:把那個in-- 揚聲器1:打印的putChar 您的屏幕保護程序。 [聽不清]字符。 然後,當[聽不清] 這將關閉該文件。 聽眾:你並不需要一個[?別的嗎? ?] 揚聲器1:不一定。 我的意思是,種它暗示這一點。 因為這將返回,不過,只要 因為這不趕上這一點,你的罰款。 我的意思是它可能很好 練習做一個人。 但是,一個否則並不總是 需要特別 如果你有什麼事情 就像一個回報,這 意味著,在這種情況下,如果它捕獲 它,你的程序將要結束 它永遠也沒有機會了。 這多為你從哪來的情況下 不一定回來的東西。 因為,如果這是不 返回任何東西, 這意味著,如果這是真的, 這樣做的其餘部分將繼續運行。 在此情況下,你 希望假。 如果它回來, 你的程序的結束, 還有一種是沒有必要全部 的時間,這取決於上下文。 雅各,你有問題嗎? 聽眾:是的。 所以,做龜etc得到下一個字符? 怎樣的性格會增加嗎? 揚聲器1:是啊。 所以龜etc得到下一個字符。 你可以認為它像C ++中的感覺。 聽眾:那麼什麼是EOF? 揚聲器1:EOF是文件結束。 這只是一個標記,讓你知道 那你在你的文件的末尾。 所以,這是怎麼回事打印 以你的標準了。 然後它會關閉 當它這樣做的文件。 然後讓我們去 下一個文件,對不對? 所以,總體來說,這是什麼節目呢? [聽不清] 揚聲器1:是啊。 它只是打印出那​​裡的一切。 所以,如果你們曾經使用CAT 一些file--中,然後將名 我不知道如果你們有 做過你的終端上。 但是,如果你曾經使用 命令CAT-- C-A-T-- 然後任何文件 你那裡 - 它 打印出來給你的終端,這 可超方便的一些事情。 我用了很多。 這是否有意義大家? 很酷吧? 行,所以你的任務now--無論是 自己或身邊你 - 人 是只寫一個簡單的程序 這將只寫“你好,世界!” 出到文件。 [聽不清] [聽不清] 揚聲器1:我當時想,做 我說不好,上週做什麼? 我不認為這是不好的。 我很高興你在這裡。 這真的讓我很高興。 我的簡單的快樂女孩。 我只是想,當我的部分參加。 所以我剛剛得到這個開始為 你們讓我們可以編寫在一起。 我不喜歡把任何人 現貨,除非你想要的。 顧客:測驗,做 我們要編寫一個程序? 揚聲器1:您可能會被要求 手工編寫簡單的程序。 是啊。 聽眾:測驗是下週,對不對? 揚聲器1:本測驗是下週三。 這意味著有一個可愛的[? CSE?] 黨的分級之後,這 意味著你將得到你的分數 回來的night--在什麼時候? 誰知道? 但是,這將是夜晚。 行。 我們想得到怎樣的開始呢? 我給你一個hint--開始與此有關。 聽眾:你要打開一個文件。 揚聲器1:是啊。 那麼你想打電話嗎? 你只想把它稱為“文件”? 我們可以很容易。 所以fopen--什麼是我們的 輸出測試將是? 稱之為“你好。” 什麼是我們的模式? 什麼是我們做的這個文件? 聽眾:閱讀。 寫作。 揚聲器1:我們正在寫它。 可愛的。 好了,我們現在有這個文件。 什麼是我們需要做什麼? 聽眾:檢查是否為null。 揚聲器1:檢查是否是null--完全吻合。 這就是我喜歡聽。 這應該是自動的,尤其是 幾乎從這點上。 如果你開始段錯誤,您可能 沒有檢查空的地方。 十有八九的,這是 將是你的錯誤。 所以,如果你能得到的 習慣,經常檢查它是否為null, 你的生活將是 不錯,easy--或更容易。 因此,檢查,看它是否為null。 所以,如果它不為空,這 是什麼砰等於 是指:不null--它是有效的。 我們究竟想幹什麼? 我們只是想打印 該文件,對不對? 那麼,我們要使用? 聽眾:fprintf中 揚聲器1:Fprintf--可愛。 和fprintf需要兩個arguments--在哪裡 這是怎麼回事,我們要打印的是什麼。 那麼,什麼是第一位? 在哪裡了? 聽眾:文件。 揚聲器1:這將文件。 ?我們要打印的? “你好,世界!” 行。 我們還有最後一個件事 - 這裡的另一大模式。 聽眾:關閉。 揚聲器1:關閉。 你去那裡。 聽眾:這是發生 如果文件是空? 揚聲器1:不,這是如果它不為null。 聽眾:哦,如果它是不是 - 確定。 為則fopen然後 這裡面去兩個參數, 什麼是第一個參數又是什麼意思? 揚聲器1:參數是 就像該文件的名稱 你想去。 所以這個運行後,你會 有一個名為“你好”的一些文件 說了“你好,世界”在其中。 就這樣。 只是名稱。 聽眾:由於它的寫作中, 文件不必存在。 這就是你說了什麼? 揚聲器1:沒錯。 沒錯。 如果“你好”作為文件 還不存在,它的 要創建一個名為 你好“,寫它給你。 聽眾:當你告訴 程序寫的文件, 為什麼你寫的“文件”,而不是 文件和fprintf--的名稱 揚聲器1:由於在這種情況下,我們有 大型FILE--所有caps--明星, 文件中。 所以它是一個指向文件 你在說什麼。 這是的方式 我們只是參考一下吧。 所以在這種情況下,你 能想到file--啊哈的, 我們可以在這裡使用this--文件 指的開口“你好” 並讓其寫。 聽眾:我們可以把“你好” 代替[?只是?F的文件? 揚聲器1:沒有,因為“你好” 必須是開放的,可寫的。 文件在這裡就像是一個 標誌,說好了,我們 有這樣的file-- hello-- 我們正在尋找。 它已被打開。 而我們將要寫入。 如果你只是用“你好”, 被封裝在其中。 因此,它會發瘋。 我的意思是,你可以把它命名。 你可以做的文件, 明星,“你好”,等於說。 但是整個的一點是,你 需要一個文件指針明星為了 能夠使用這些功能。 聽眾:你能做到 文件,明星,文件,“你好” 或者你必須把 通過它的文件巨星,文件? 揚聲器1:你可以 做好檔案,明星,“你好。” 你可以改變這 無論你想要的名稱。 這是完全任意的 什麼名字是。 你可以使用任何名字。 將它命名為飛意大利麵條,如果你想要的。 聽眾:什麼是“W”的報價? 揚聲器1:在“W”只是模式。 因此,我們寫這個文件。 大家好? 清楚了嗎? 是。 聽眾:所以當它寫這 文件中,我們在哪裡,然後找到那個文件? 揚聲器1:這將是在同 你是在當前目錄中。 如果你在PSET三年 你運行這個,你PSET內 3文件夾將是 該文件名為“你好。” 很酷吧? 大家好? 我覺得你的所有 得到它,這是偉大的。 行。 所以,回到我的幻燈片展示 - 我喜歡的事情工作。 OK,pointers--是你們興奮嗎? 指針是巨大的。 他們需要一點點 來包裝你的頭左右。 這是我第二年 教學指針。 我想我終於得到它。 所以,如果你掙扎,它的確定。 正如我之前說的,畫畫 幫助了很多的事情在CS, 就像我認為人們傾向於 想想哦,我們是在一台電腦。 我們應該代碼。 No--繪製圖片 將真正幫助你。 我真的鼓勵你 打入你的幼兒園老師邊 並帶出蠟筆 或者標記和抽獎。 因為它會幫助你。 如果你看到我在辦公時間內,我 將隨身攜帶紙堆 用鋼筆畫的東西出來。 因此,特別是 pointers--畫畫。 我敢肯定,我們究竟要 要繪製一些照片也在這裡。 所以你們都找來看看賓基, 這個很酷的claymation的事情。 我們認為這是非常有趣的,當 他爆炸成一堆碎片。 這是一些可笑的安心上課。 C [聽不清]這個偉大的能力 以能夠控制存儲器。 而且它的事情之一是真的 使得它如此強大的語言。 但隨著巨大的動力來自 責任重大。 和瘋狂的事情都可能發生 如果你不小心。 所以,當你使用 指針,你想 確保你真正了解 正是你在做什麼。 的希望下一點點 時間會幫助你真正​​了解 指針,如何使用它們, 以及如何操作它們。 所以memory--我敢肯定,我們已經 以前見過這個圖。 因此,這是只是一個簡單的示意圖 事情怎麼可能存儲內存。 所以,你基本上有這些 中的一個字節的塊巨大陣列 就是我們這裡 - 輕微 遞增1,每次。 這是十六進制[聽不清] 這樣8位的塊。 而每塊關聯 一些十六進制地址。 所以,如果你看到的 0X,這只是notating 這是一個十六進制地址。 你可以假設,這意味著 一些地址在存儲器中。 我們談論的是內存地址 每當你看到十六進制。 我們是整數變量, 彩車是存儲變量。 所以,整數存儲整數。 花車彩車店。 所以,我們也有三分 那家商店的內存地址。 這是一種映射。 指針是完全 為存儲器地址。 所以,這就像你的類型有。 您的設備是32位,這意味著 您的內存地址是4個字節。 讓你有任何的指針 也將是4個字節。 否則,如果它是四個字節, 存儲器是4個字節。 指針存儲內存。 因此,它們是四個字節。 Cool--只是想加強這一點。 現在你應該得到這個漫畫。 我不知道你們有多少人 XKCD是球迷,但我喜歡XKCD。 這很棒。 行。 所以創建pointers--正如我所說,這是 非常簡單,只是想別的。 你有一個類型。 你有一個名字。 對不對? 這就是我們必須在那裡。 [?十六進制?]星意味著它是一個指針, 然後隨便你怎麼稱呼它。 因此,類型代表 你可以存儲。 行? 以同樣的方式,如果我們做整數, 我們知道,我們要存儲一個int那裡。 用一個指針,它 保存的存儲器地址。 但是,它的意思是that--這裡的地​​方 圖紙是要派上用場了。 所以在這種情況下,我們有 一些value--假設4。 四是在地址之一。 行? 在這裡第一個指 這是一個指針2倍。 對不對? 這是一些指針X。 x可以是什麼,等等。 無論X is--說x是4。 這是怎麼回事存儲 此處的存儲器地址。 因此INT,明星,x--這是 在memory--其他插槽 誰知道這是什麼。 但它要在這裡存放的地址。 因此,這將是like-- 在這種情況下,無論什麼, 被存儲在0x1--任何存儲 在我們的指針保存地址, 有與匹配 我們所指定的。 所以在0x1,則在這種情況下,此為x。 這永遠只能是一個 我們使用這個,而詮釋。 同樣,如果我們有 另外1Y,不管 地址存儲用y具有 是一個char--同樣的事情態。 以同樣的方式,只要你 嘗試做的INTx等於0.4, 它會罵你,是 好像沒有,你說你想要一個int。 這應該是一個int。 停止努力,使之成為浮動。 因此,讓事情是他們想要的。 讓事情自己做主。 這麼大的事情就是 指針的任何類型 這是,這是唯一的 你可以存儲在那裡的事情。 行? 通過練習,與 上週,應有盡有 看來真的是種抽象的。 我們要做一些練習。 它應該更有意義。 因此,參考和dereferencing--它的 真正重要的是讓這些直線。 我還是要刷新 飄飛。 我很喜歡等待,我想要哪一個? 因此,符號,實際上給 您的參考或地址。 所以它返回到地址 該變量的存儲器存儲。 所以它要真正恢復到您 十六進制,而它提領 實際上是要給你 被存儲在那裡的數據。 行? 所以,我們要來看一個例子 真快,居然還是旁邊。 行。 因此,我們必須想想真 小心這一點。 所以在這裡我們有一些整數x。 我要去嘗試,並得出這樣的 出盡我的能力。 因此,我們將這個插槽x。 它的存儲5。 它的地址是為0x4。 很酷吧? 都不錯。 所以,現在我們有這個指針。 正是在這裡。 和符號給我們 某事的地址。 所以,在這種情況下,它是x的地址。 什麼是x的地址? 04 - 而這個指針是0x08的。 很酷吧? 所以,你可以考慮一下這個 指針04,只是點在這裡。 而他們所謂的指針 因為當我們得到更多成這樣, 你會看到指向的東西。 和一個塊指向另一個 塊將使得很多更有意義。 因此,這裡有兩個。 然後我們有一些 副本,這是what-- 0x0C的。 而這將 我們取消引用指針。 那麼,它的意思是 好了,這裡是我們的指針。 它存儲的值是0×04,什麼 它說是去這個地址 並告訴我,什麼是它。 所以這是有效的 這是什麼方向做。 你可以認為這就像你的明星。 這樣就OK了,當我們這樣做的明星,這意味著隨之而來。 去這個地址。 而這基本上就是以下 這個箭頭,這個內存塊。 給我們什麼呢,這是5。 這就是為什麼我們的副本等於5。 這是否有道理? 有沒有人需要我去通過 那一次,或者更慢? 你要我去 通過這一次? 行。 我們要再次重繪。 當我們開始,我們大家都同意,我們有 一些內存塊,這是一個變量 X,我們設定為等於5。 我們不控制它在內存中。 所以,這個地方就是 任意分配。 好的呢? 行。 然後我們初始化一個指向整數的指針。 這就是為什麼它可以指向 X,因為我們在這裡為int。 我們的另一塊 內存,因為這個指針 就像其他任何一個變量。 它任意分配 在內存部分空間。 和它存儲為x的地址。 與符號表示x的地址。 那麼,什麼是x的地址? 聽眾:這是zero-- 揚聲器1:0×04。 所以then--最後一個。 我們再次有一些copy-- 只是另一個變量。 因此,讓我們分配一些任意的地方。 我們解引用我們的指針。 明星意味著進入 地址保存在我的指針。 告訴我那裡的東西。 因此,存儲地址 在我們的指針為0×04。 所以,我們去那個地址。 它指向該地址。 這是什麼內存塊中? 這是一個五人。 所以,這就是我們給我們的副本。 大家好? 涼爽。 Again--圖片。 因此,跟踪這裡 - 我的價值觀 打算讓你們想一想。 我們可以得出另一張照片。 但我希望你能嘗試的理由 通過這個你自己一分鐘。 由於他們沒有給 我們作出了榜樣地址, 我只是做符號x-- 這將有助於推動它帶回家。 &符號表示的地址。 所以在第一位的,每個人都 去的第一道防線。 一些X設置的一些five-- 隨機時隙中的存儲器。 INT明星指針等於 x的地址,對吧? INT明星指針創建 這個塊,稱之為指針, 並將其分配給x的地址。 我可怕的&符號。 現在我們正在做的就是我們說 OK,我們解引用指針。 所以,我們去好了,什麼是我們的指針? 它的符號X。 去符號x和重新分配它。 所以,現在,符號X將是35。 所以基本上,當你 提領,你去確定。 你將要繪製 圖片是這樣的。 你將要繪製 你的箭在哪裡。 所以,到這個插槽的內存,要么 給我回值,或改變它。 在這種情況下,因為我們在這 值,我們分配它是35。 而在最後 1,如果你注意到,我們 被指派了什麼 在這裡別的東西。 因此,他們有這個真棒表。 這不是那麼糟糕。 你們的工作就可以了。 我要拔出來在黑板上。 我們要填好在一起,好不好? 因此,抓住一些紙,搶 一個合作夥伴,開始工作。 我要得到一個 更大的粉筆。 因為這將是很多。 行。 教授:OK。 讓我們先從第一排。 我們會從那裡開始,那麼你們 也許可以工作,通過多一些。 行。 一個等於B C時代那麼什麼是? 這不是一個有趣的問題,我保證。 學生:4次5。 教授:4次5。 20。 那麼,什麼是B? 學生:4。 教授:與c? 學生:5。 教授:5。 然後這只是要 將一個&符號,符號B, 符號C,對不對? 不錯。 這是很簡單的。 行。 因此,下一個。 A等於一時間C,以防 人是不熟悉的。 是大家熟悉的 隨著時代等於? OK,這一切是指:這是 簡寫為等於C時代。 您還可以劃分做到這一點, 用加法,用減法。 你可以做一個等號,或加等於C 是指等於加C,負同等 C將作為一個等於負溫度。 這只是語法糖。 所以,在這種情況下,a是等於 一個C時代將會給我們帶來什麼? 同樣,沒有一個有趣的問題。 學生:100。 教授:100。 難道別的什麼改變? 號 也許我將最終得到 我的&符號更好。 學生:OK,對不起,你是怎麼得到100? 教授:OK。 這樣一等於一 次C,所以C時代。 學生:哦,你用 一個用於previous-- 教授:是的。 因此,這些都是我們的最新值。 這些都是你應該 用在我們向下移動,OK。 所以,B是唯一改變,是吧? 因此,讓我們填寫一切。 B.什麼是B將會是? 生存還是毀滅。 那麼,什麼是該做的? 什麼是明星PA在做什麼? 學生:代號為PA的位置。 學生:不,不完全是。 所以這是一個d參考。 學生:所以B是PA的手的價值。 教授:是的,所以PA是 的地址,對吧? 因此,它說走到哪裡是一個 存儲,並給它的價值。 那麼,什麼是B? 學生:100。 教授:100。 完美的。 好了,電腦是什麼樣的變化。 其他一切保持不變。 什麼是電腦將會是? 簡單的賦值。 PC等於PA,什麼是PA? 學生:一個&符號。 教授:完美。 現在,我們越來越有趣。 OK,讓我們打破這一個了。 首先,什麼是B C時代,因為這是 這一個簡單的部分,對不對? B C時代is-- 學生:500。 教授:是的,所以 什麼是這個做的, 如果它的明星PB,有什麼變化? 學生:是什麼在the-- 教授:是什麼在B? 學生:什麼是在空間 即PB指向。 教授:和PB指向to-- 學生:B. 教授:B.因此,唯一的 事情變化是B,正確。 所以B次C,500。 所以這就是現在什麼樣的變化。 涼爽。 可愛的。 你們正在做的很好。 好吧,打破這一個了。 C的變化,對不對? 因此,我們可以填補一切。 讓我們來看看。 行。 我們知道,C是將成為 產品兩個數字的,對不對? 哪兩個數字有關係嗎? 學生:A和C? 教授:那麼一個是 右邊的第一個。 因此,我們ð引用的p,對不對? P的指向,所以我們知道, 這將是100倍是什麼? 什麼時候做PC點? 指向。 所以,100次100萬。 這是否有道理? 涼爽。 家庭舒展,伙計們,最後一排。 行。 有什麼變化嗎? 學生:A. 教授:A.完美的,所以 一切可以保持不變。 行。 什麼是? 所以這是一個什麼時代? 這是星PB。 因此,星PB意味著這裡的 PB,PB點到b。 學生:500。 教授:500。 因此,我們有500次100。 這是50000。 呼! 你看那個。 學生:為什麼我們 的&C的last-- 教授:對不起。 學生:哦,好吧。 教授:我的壞。 大量的寫作。 大家好? 差不太多,對不對? 只需要一點點 同時工作,通過。 如果你打破它, 了解每個部分是什麼 是指to--為 一切是, yes--打破它的小 問題,然後重新組合, 你可以做一些真棒的東西。 有答案,但我們做到了。 指針運算。 啊。 我的手都白堊。 因此增加或減少 INT調整指針 通過指針的類型的大小。 還記得每一個類型 具有不同的大小? 因此,像一張雙人床或很長很長就是 八int是4,但焦炭之一。 所以,你想要做什麼 is--有一點要記住 就是這樣自己多 指針值實際上改變 將依賴於 指針的類型是。 每個人都好這個? 我可以刪除嗎? 我們是好? 真棒。 所以,如果我們有一些指針 that--這是要be--我 要使它為int的指針。 它存儲了這一點。 如果你說的指針 加一,它會做 是它要更新 它由一個int的大小 因為這是 指針的類型是。 與C,一切都是 非常嚴格,規範。 整型指針會被更新 空間的int會走量。 一個int是4個字節。 那麼,這會變成? 你只需添加4到這一點。 現在,鼠標指針會be--確定。 所以,如果它是一個字符,我們做了指針 加一,那會是什麼呢? 如果started--假裝我們 started--現在它0x08的。 現在,讓我們說這是一個 字符指針,我們增加了一個。 會是什麼改變? 多少個字節是一個字符? 聽眾:一。 揚聲器1:一。 聽眾:那麼0×09。 揚聲器1:那麼這將是9。 所以,只是要記住。 只是當你添加一個,它不是 增加一個,除非它是一個字符。 它增加多少 字節,它是類型, 這就是為什麼我們有 這個等式在這裡。 所以它的整數倍大 指針的類型。 所以我們這裡的例子。 y為分配給該值,為0x4, 當我們做y加等於一。 是什麼在這,什麼是 x中,不改變。 是什麼改變是什麼y中。 存儲在Y中的地址更新的四 因為有四個字節的整數 它是一個int指針。 行。 所以現在我們有另一個練習。 所以,問題是怎樣將打印。 任何想法? 聽眾:數 在快樂的貓字符? 揚聲器1:沒錯。 所以想用你的字符串。 大家都明白了嗎? 我們希望通過它走? 是的,確定。 所以,我們這裡 - 我 像這樣這麼多。 我不必 [聽不清]可笑。 因此,我們有我們的字符串在這裡,快樂的貓。 可愛的。 我們有一些計數器 我們跟踪的。 因此,我們有一些的char *指針 剛剛被設定為等於為str。 這是什麼做的是它的 分配一些指針 給您的字符串的開頭。 因為我敢肯定,因為它 提到在講座中, 我們已經給了你們這 所謂的字符串數據類型。 但真正的字符串只是 數組of--喜歡的char *。 這是一個指向一串字符 這是連續的內存中。 因此,這只是設置它 等於任何字符串 確定在哪裡 它的第一個字符是。 所以這只是設置一些點 等於該字符串的開頭。 每個人都很好嗎? 涼爽。 因此,這是我們的提領的指針。 因此,它實際上會 給我們一些價值在這裡, 在我們的字符串,我們正在談論的。 和我們說,只要 它不是空終止。 因此,繼續下去,直到你得到 到字符串的末尾。 一個更新的指針。 以r,它實際上由一個更新 每一次,因為這是一個char, 將char *。 因此,它會去。 這將更新。 因此,首次運行時, 這將是在這裡小時。 這將更新。 這將是一個。 這將是一個P,Y,等等等等。 我們將更新計數器。 當到達結束時,它 只是打印多遠它得到。 是。 聽眾:所以它統計 空間為一體,對不對? 行。 揚聲器1:這樣認為。 那是一個question-- 聽眾:[聽不清]。 揚聲器1:不用擔心。 這是我做的。 好吧,這麼一件事我 不解的是,有一個數組, 你也可以把它當作一個 因為指針數組只是 的存儲器連續斑點。 所以,你可以把它以同樣的方式。 你可以操縱他們 用指針了。 這樣做時,而不是在本 情況下,類似的東西 將數組0等於1。 但是在以同樣的方式 一個字符串確定 通過在何處開始 它的第一個字符是, 陣列由下式確定 其中,它的第一個元素是。 因為我們知道,我們是 保證的是,這些 將要連續 的存儲器塊。 這就是使我們能夠做到這一點。 我們知道他們是連續的 的存儲器塊。 所以在這種情況下,通過解引用 只是數組,它告訴我們, OK,去開始 您的陣列,這是在這裡。 所以,你可以將其設置等於一體。 在這種情況下,無論你的陣列 類型是,當你一更新, 這就像更新 它的下一個索引。 你可以這樣做,因為你 知道什麼是您的陣列中。 所以它知道多少 通過更新您的指針, 什麼地址以更新其為這樣 你是下一個插槽。 所以這只是一種不同的方式 寫作陣列0等於1, 陣列1等於2,陣列 支架2等於3。 這只是另一種方式去思考它。 因為它們是連續的 在內存塊, 你可以參考他們要么 通過notation--陣列 我個人 找到easier--但也許 你需要對其進行操作 嚴格的內存地址。 這是你會做的方式。 那種比較像一個 很酷的事情你可以做 對,也許不是你 究竟要執行。 我在61中使用它。 你們也許並不需要 不用擔心太多。 但是,如果你有興趣, 取61來年。 我們在家裡舒展的傢伙。 我知道,這是很長。 動態內存Allocation-- 所以我們知道,一個 事情過程中,當我們談到 我們的第一款一起, 我們看一個交換 功能它是 外我們的主要功能範圍。 和我們傳遞這些價值 這是有效的副本。 而一旦交換完成 執行時,它只是留下了一個堆棧。 請記住,我們有一個 堆棧幀的交換。 它的葉子和那些 數值離開它。 他們都走了。 我們不能做任何事情 他們和我們是悲哀 因為我們不能交換我們的價值觀。 但隨著C,正如我所說,你 有很多的力量在內存中。 所以,你可以做的是,你可以 分配在堆上的東西在這裡 將呆在那裡,直到 你告訴他們,否則。 他們就像好兒女。 他們呆在那裡。 他們不離開。 他們將呆在那裡,直到你 就像,OK,你可以走開。 而在堆棧上的東西,who-- 他們就像頑皮的孩子。 他們只會逃跑,當你想 在那裡,然後他們走了。 你不能讓他們回來。 所以is--我們要堆 談談malloc和free,這 我敢肯定你們 聽說了講座。 而這基本上是一個辦法 有很執著的數據。 這樣你就可以保持數據 各地,只要你想要的。 MHM。 聽眾:您可以定義堆和棧? 是他們喜歡的地方放東西? 揚聲器1:因此,他們 基本上just--他們 我們指的只是內存的方式。 所以堆只是地方 存儲器是動態分配的, 而堆棧指 更多的堆棧幀 這是更核心的 這是實際運行的功能。 你真的沒有控制權。 最大的區別,你必須控制 在堆,如果你想。 你有過協議棧的控制較少。 堆棧取決於 功能正在運行, 和順序,其中它們 運行,以及事情是如何返回。 而隨著堆,為 我們會看到,你可以說, 好吧,我想這個值是 各地,直到我告訴你,否則。 你不准擺脫它。 你不能覆蓋它。 你要保持它的周圍 只要我告訴你。 你是老闆堆中, 而stack--也許,如果你 像finagle你的方式 你可以成為老闆。 但並不完全。 這真的只是存儲器。 這只是不同的方式 的參考存儲器。 涼爽。 因此,與那,怎麼 控制你的記憶。 這是使用malloc,這 你會去用。 因此,這只是短期 內存分配。 這就是它。 還有一堆其他很酷的 功能有頁頭底, 他們代表不同的東西。 所以,當你需要的存儲需要 拖垮你的當前功能,使 當你的當前 功能跑掉, 你仍然有數據,你 從中得到的,你要使用的malloc。 這將初始化它在堆上。 就像我說的,守 他說,你會繼續在那裡 直到你告訴它,否則, 這是這裡最重要的事情。 所以,有一點要注意,和 這是典型的非常重要的, 的是,這和sizeof 就是用超級有用 因為根據其種類 機器你正在運行, 它可以具有不同的量 內存,它需要。 所以,你總是希望用這樣的尺寸 你不是依賴於機器, 讓你的代碼 運行在任何機器上。 而這只是其中的一部分 編寫好的代碼。 如果它可以在一台機器上, 但不是任何其他人, 多麼有用是你的計劃嗎? 所以,你總是希望 確保並用sizeof運算。 聽眾:那就是像 10英寸[聽不清]大小? 揚聲器1:這是由10個整數的大小。 是啊。 所以,整數的大小將返回 多少錢1取整數。 或字符的大小,如何 做多一個字符起飛。 然後多少塊 那你想要什麼? 所以在這種情況下,我們想要的東西 我們可以存儲10個整數來。 它會不顧工作 機,這是很酷。 那麼有多少字節將 這實際上給你嗎? 快速數學運算。 聽眾:40。 揚聲器1:40。 沒錯。 所以,再大的事情。 指針或內存分配可以返回null。 如此反复,經常檢查, 看它是否返回null 之前你嘗試做任何事情吧。 如果您嘗試取消引用 這個指針現在, 它只是將段錯誤 因為你去,並試圖 觸摸空的時候,你不應該有。 因此,經常檢查空。 同樣,你所能做的。 它可能返回null。 如果你要么它會返回null 出的空間,或者因任何原因 它遇到了一些內存錯誤。 它有時只是返回null。 所以,你只需要檢查它。 這就是這張幻燈片是說。 然後,我們所擁有的 這裡是一個調用free。 所以用同樣的方式,如果 打開一個文件,你必須關閉文件, 如果你的malloc內存, 你必須釋放內存。 而你們將得到 做很酷的東西。 並有一個程序,你可以運行 看看你曾經洩漏內存。 但你不希望出現內存洩漏。 這是非常糟糕的。 剛剛陷入困境的事情。 這是不好做,就像編程 明智的設計效率。 但它也只是一種 壞了你的電腦。 所以只是免費的東西 當你的malloc他們。 你們看到的對稱性在這裡。 超級簡單。 只是免費的,然後 無論你的指針, 無論名稱 你的指針,它 將釋放它給你的照顧。 涼爽。 然後,我們有這個。 因此,我們只是要 走過這個程序。 然後你們就完成了。 所以[聽不清]剛為主。 因此,我們有一些為int *指針。 因此,我們有一個指針 這是怎麼回事舉行整數。 又有多少個整數是打算舉行? 只有一個。 大小int的。 我們檢查,看 指針是空的,因為它 是,我們想說什麼也不做。 這是不好的。 因此,我們打印了一些錯誤出 存儲器,最多返回1, 因為你們都習慣了。 然後,我們在這裡,我們 我們取消引用指針。 因此,這意味著我們將要存儲 什麼在給我們的位置。 為int *指針,或者malloc的,返回 它拋開這個地址 內存給你。 因此,它基本上 給你like--,如果你 想想一堆 房子在附近 要放 你的家具,malloc的 就像是OK,你得到 去容納三人。 和它給你的 房子3的地址。 所以,現在這個權利,這 指針存儲地址, 存儲你的房子的地址。 * PTR手段,OK,我在我家。 涼爽。 我需要得到一些整數。 所以,你問的人 現在給你的家具。 所以,你得到一些int類型。 它把它在你的指針 它的指向。 然後它只是打印 出來,你只要進入。 並且再次,參考。 所以,這就像你去這個 針對你所看到的在那裡。 很酷吧? 然後,當然,我們釋放了指針。 不要忘了釋放你的指針。 不要忘了檢查空。 不要忘了釋放你的指針。 你有兩件事情你還記得 這一點,或者說你應該記住。 是。 聽眾:[聽不清]東東 這樣,該字符* S。 為什麼我們從來沒有免費的? 揚聲器1:嗯? 聽眾:是那些像琴弦? 你說的字符串 就像字符* S,對不對? 那麼,為什麼我們不自由的字符串? 揚聲器1:您只 免費的,如果你mallocing。 聽眾:哦,如果你mallocing。 揚聲器1:所以的malloc 自由是兩回事 你應該總是在一起。 f開,女接近,兩件事情 你應該在一起。 在這兩個情況下,檢查空。 是。 聽眾:那麼自由就是 讓別的東西 之後被存儲在那裡 這個方案使用了嗎? 揚聲器1:這只是說, 好吧,我做了這個。 你並不需要保持它周圍。 否則,您的計算機將 只是喜歡嘗試,並保持它在那裡。 然後你can't--運行 到後來內存問題。 你總是想釋放它,因為 它告訴你的電腦,OK,我 隨著內存這個地方完成的。 你可以把它背 我以後使用。 很酷吧? 是。 聽眾:所以我們使用了%D剛剛 因為兩倍的回來了, 為什麼is-- [聽不清]。 聽眾:您可以使用%嗎? 揚聲器1:您可以使用%我。 在最後一分鐘的問題嗎? 前進。 觀眾:我只是有一個快速的問題。 所以PTR變量,that's-- 像,用INT * PTR = malloc的, 這只是說這是 指著memory--的地方 揚聲器1:你想[聽不清]? 聽眾:--that是的 大小of--沒有,沒關係。 但它只是指向一個地方 內存就像四個字節。 揚聲器1:沒錯。 所以malloc的大小INT說, 好吧,我會去跑了出去, 發現四個字節的內存為您服務。 當它發現4 字節的內存,它 給你回的地址 在那裡開始的, 這就是存儲 在指針或PTR。 不錯。 你們看比大多數少困惑 當我談到指針的人, 所以我感覺很不錯了。 行。 與往常一樣,你們應該都 現在得到您的pset2成績。 我知道發生了一些靠不住的 東西在那裡說,公式無效 什麼的。 如果你得到的是,所有的 你的成績都在我的身邊有效。 所以,我可以送你 你的成績截圖。 只是讓我知道,如果你還有 缺少任何等級或某事 似乎沒有什麼意義。 到我這裡來。 我一直引以為傲的超你 球員了,所以繼續努力吧。 和你的週末好好休息一下。 我敢肯定,我會看到一些 你在上班時間。