[音樂播放] DAVID J.馬蘭:這就像 一個新生研討會今天。 確定。 因此大雨了。 這往往發生在星期三, 但所有的更多機會 對於今天的問題。 因此,讓我們開始實際 有一會兒就好了這部電影。 但是,我們將隆重啟動一如既往。 這是CS50,這 是4週結束。 所以,如果你曾經看過 電視或電影,其中 有一些計算機專家, 警察,或者FBI,或者一些機構 試圖捕捉一些 對手,嗯,你已經 大概聽過這句話“提升” 因此該技術人員不知何故 神奇地放大無限 遠遠的看到歹徒 身份或車牌號 在鏡子連微光 或某人的眼睛閃閃發光。 因此,我們確實,讓我們一起來看看 一些這樣的場景從好萊塢。 [視頻回放] - 確定了,現在讓我們好好看看你。 -hold它。 運行該回來了。 -Wait一分鐘。 向右走。 -there,凍結。 - 全屏幕。 - 確定,凍結。 向上擰得過緊上,你會? - 矢量在上 小伙的後輪。 -zoom在這裡在這一點上。 - 隨著合適的設備,圖像 可以擴大和激化。 - 什麼事? - 它是一個提升計劃。 - 你能清楚地表明了沒有? - 我不知道。 讓我們增強了。 - 增強部分A6。 -I增強了細節, 而且 - 我認為有 足以提升, 它釋放到我的屏幕。 -I增強了她的眼睛反射。 - 讓我們通過運行此 視頻增強。 -Edgar,你可以加強這方面的? -hang上。 -I've這方面的工作思考。 -Someone的反思。 - 反射。 - 存在就是男人的臉的反映。 -The反映。 - 存在的一種反映。 - 放大上鏡。 - 你可以看到一個反映。 - 你能在這裡提升形象? - 你能提高他在這裡? - 你能提升呢? 你能提升呢? - 能,我們加強這方面的? - 你能提升呢? -hold在第二,我會提高。 - 放大在門上。 -Times 10。 -zoom。 -move研究。 - 更多。 -Wait,停止。 -Stop。 -pause它。 -rotate我們75度 繞垂直,請。 -Stop。 返回到部分 關於門,再一次。 -Got圖像增強器,可以位圖? - 嘿,也許我們可以使用普拉迪普 森方法來查看到窗口。 - 此軟件是最先進的。 -The特徵值是關閉的。 - 隨著權 算法 - 組合 - 他的採取淘汰 算法,以一個新的水平, 我可以用它們來 加強這方面的照片。 -lock上和放大z軸。 - 增強。 - 增強。 - 增強。 -freeze和提高。 [結束播放] DAVID J.馬蘭:所有的權利,所以 所有這些實際上都是字。 他們只是串聯繫在一起, 的方式,實際上不是明智的。 而且,事實上,CS50和課程喜歡它 往往會毀了很多電視和電影 為您服務。 因為當這些電腦專家 在劍拔弩張關條款,並說 喜歡花哨的東西 特徵向量,和z軸, 和任何數量的其它的 其實更多的技術術語, 他們真的只是串起 字聯太頻繁。 那是我們的希望之一是, 作為療程服用的副作用 像這樣,將更多的人在 世界上居然能權衡 而只是非常輕微影響 質量和這些膜的準確性? 事實上,讓我們來看看現實。 因此,這裡的工作人員合影 瑪利亞,我們的教學研究員之一。 而假設她是 懷疑的東西。 然而,還有一絲 一些的證據在她的眼睛, 還是在她的眼鏡的反映。 那麼,如果我們這樣做完全一樣的電影 建議,其中,我們縮放和“提升”, 這是多少信息 在瑪麗的臉上 當你拍攝圖像 與原始分辨率。 而且,事實上,你可以看到這些點。 這些都是什麼 稱為像素,P-I-X-E-L-S, 這僅僅是一個典型的方 這是一個圓點組成的圖像。 而早在一天,居然連 今天與當今一些LED電視 或液晶電視,如果你有 一個在你的房間或在家裡, 如果你去了超級靠近它, 尤其是如果它是一個有些舊的電視, 你甚至可能看到這些點 而這正是構成的圖像。 並且沒有更多的 信息莫過於此。 我們可以“提高”,在感 平滑的事情了排序和 推斷那種類型的,什麼 顏色應該是旁邊的Mary的眼睛 因此,它實際上不是這樣的像素化。 但是,如果我繼續放大,有 是個壞傢伙在她的眼睛。 就像是所有的 我們掌握的。 您不能創建 信息無中生有。 這裡只有一個有限 位存在的數目。 因此,在習題集4,其中 你有一個機會 用這種世界玩。 在習題4,你會探索 圖形和取證的世界, 實際上編寫代碼 即恢復丟失的圖像。 你會寫代碼, 操縱現有圖像 最終明白什麼是 怎麼回事引擎蓋下。 而且,事實證明,它實際上 不是所有的那麼複雜。 舉例來說,如果我們想 代表笑臉的地方 這些黑色像素, 或者這些黑點, 好了,我們可以簡單地表示 他們作為一個真正的位圖。 如果你曾經聽說過 表達位圖,也許 現在開始做一個 一點更有意義的今天。 我們已經知道什麼是位。 它是0或1。 而地圖只是一些 像一張紙 ,讓你的方向,並具有 也許x和y坐標的網格。 因此,這裡是一個位圖。 它是比特的地圖 由此1是顯然 要代表白色像素和 0是要表示黑像素。 但是,我們當然可以翻轉它周圍。 它並不真正的問題等等 只要我們是一致的。 這裡是怎麼回事,在binary--內 計算機的存儲器中,或甚至內部 在您的硬盤的文件 drive--你能存儲 的笑臉圖像的簡單。 但當然,我們是什麼, 缺乏這一形象? 顏色,對不對? 這是一個明顯的下一個步驟或 增強的色彩改善這一點。 所以,不幸的是,只是一個單一 位,0或1,我們可以表示的顏色。 這可能是紅色或藍色,或 黑或白,或綠,或粉紅色, 或對顏色。 但是,為了簡單起見,我們將 姑且黑色和白色。 那麼在邏輯上我們需要,如果我們 要實現彩色圖像中的? 什麼是我們必須做的? 就像如果這裡的限制因素 是與一位你只能 表示兩個狀態,0或1,白 或黑色的,你有什麼想幹什麼? 聽眾:更多的數據。 DAVID J.馬蘭:更多位, 耶更多的數據,更多的比特。 而且,事實上,這也正是如何 彩色圖像表示。 而不是使用單個比特,一 0或1對於每個像素,每個點, 你只需要使用多個。 也許使用8,也許,更常見 使用24,而事實上,在習題集 4,將你的文件播放 使用24位典型的格式。 但大多數你可能 熟悉的JPEG文件。 如果你曾經拍攝 照片在手機上, 或者上載或看到的東西 Facebook或Flickr的,任何數量 照片為基礎的網站,你 之前可能看到一個JPEG圖像。 而事實證明,這是文件 格式我們會在PSET 4使用, 因此你要 要恢復圖像 我不小心從已刪除 在攝像機損壞的存儲卡, 如果你願意。 而事實證明,即使 JPEG是相當sophisticated-- 它的更複雜 比黑和白點 我們看到剛才,因為有 實際上看中的算法, 被用於壓縮為JPEG,所以 你可以有一個非常好的, 高質量的圖像,但使用 相當少的比特。 我們再回過頭來 不久壓縮。 事實證明,在第一 在一個JPEG image--三個字節 無論你所拍攝的照片 of--是值255,216,255。 換句話說,如果你只是 看到位的模式, 這裡為三 字節或24比特合計, 高概率,你可以推斷, 你看它這前三 一個JPEG字節。 這是什麼是已知的 為JPEG的簽名。 大量的文件格式 在那裡往往開始 用0和1的某些模式, 因此,Windows和Mac OS,和iOS, 和Android知道什麼樣的文件,他們 是,除了所謂的文件 擴展了很多文件都有。 如果您的.jpg,這是 另一線索到計算機。 現在讓我們看看這個 多一點技術。 我們知道小數 系統是0到9。 我們知道二進制是0和1。 如果你覺得回到PSET 0,我們有你角力, 一點點,東西 所謂的十六進制, 在這裡你有16位數字, 而不是10或代替2-。 而這些數字,按照慣例, 為0至9,然後一個 通過f,其中f代表什麼 十進制數,只是作為一個快速神智 檢查? 這樣,15。 而一個必須代表10,只憑 我已經給訂貨的性質。 這只是一個任意的約定, 但是它是相當標準。 因此,如果我們看一下這個模式 三bytes--我們 剛開始看它 用怎樣的方式 計算機科學家一般 看待和思考的文件。 你當然可以考慮一下 在0文件,和1,和小數, 但在現實中,我們往往會使用二進制 或更典型地hexadecimal-- 回程從PSET 0。 因此,讓我提出,255,216,255 是0和1的只是這些模式。 你可以,如果檢查這個你 想從第0週做數學題。 不過,就目前來看,只是假設 這確實是正確的。 我剛剛改寫三個小數 數字作為3的二進制值。 現在我所要做的就是 只需添加一些白色的空間, 只是可讀性的緣故。 而通知,我只是去 搬東西分開。 所以前,後,前,後。 我在做什麼有趣其他 不僅僅是傳播的東西出這麼 該通知每組八 位現在是兩組四比特。 這是因為,十六進制有用 特別時尚 因為每一個十六進制數字0〜 f或者更具體地為0到15, 可以表示 恰好有四位。 換句話說,在十六進制如果 想表示一個0,它只是0000, 四個零。 如果你要代表15, 它是1111,這是4位。 如果你做數學題, 如果這是個位, 這是16S的地方, 那將會給你 - 而這回事 用於:對不起,二進制, 那將會給你15,個位, 三三兩兩的地方,四肢和八分的地方。 因此,讓我提議說 在左側設置四個比特的 就是我們要調用F。 這是最大的號碼,你 可以用四位表示。 我們已經從十六進制知道, f是十六進制的最大數字。 我們已經有了另一個F那裡, 兩個在那邊。 而現在,只需要信仰 我已經做了數學向右 並且左半 那些位,1101, 是同樣的事情為d十六進制。 而右手,1000,僅僅是8。 而一個人的易見,對吧? 8 represents--是正確的 下面的八分地方。 所以我們有一個在八分列 並沒有在四肢著地,三三兩兩或1。 所以現在更多的傳統,人們往往 寫十六進制這樣的數字, 你剛才壓碎在一起, 然後以0x前綴他們。 這意味著什麼比其他 視覺線索一human-- 又來了一個十六進制value--因為 它可能沒有另外明顯。 這就是說,最終, 零和一的圖案, 或十六進制的模式 數字等價的你 要開始尋找 在習題集4 this-- 和習題集4規範將走 您通過本更detail-- 但作為實現某種神秘的作為 這可能看起來乍一看, 你將開始看到這個有很多。 而事實上,即使是在GDB中, 調試器,我們推出了週一 和丹介紹了PSET 3,是怎麼回事 經常告訴你的十六進制值 只是因為他們往往更 傳統不是十進制或二進制 在計算機的世界。 現在,讓我們把這個的來龍去脈。 你們中許多人可能還記得這個 圖片瀏覽,它來自什麼? Vista的,所以還要早 認為,Windows XP這樣做首次亮相。 因此,這是一道亮麗的風景。 而事實上,如果你閒逛online-- 我認為這是一個維基百科的文章, 其中有人很令人驚訝出去 發現這個位置在世界上成立 他或她的在相機 恰到好處的place-- 這看起來今天like--但 它是完全一樣的設置。 這個圖像,不過,是在一個文件中 格式稱為位圖,B-M-頁。 而且我們要採取超 快速瀏覽一下這是什麼意思。 但是,位圖是只是用不同的方式 代表圖像仍然採用像素 在0和1,最終。 但在快速瀏覽,它有 一個更有趣的簽名 在文件的開頭。 這不是短短三年 字節,而還有 一大堆的字節模式 已經預定義。 例如,某處 位圖圖像的前幾個字節 將是的大小 圖像時,圖像的寬度, 圖像的高度,因此 有用的元數據,如果你願意。 有用信息的Photoshop 或任何圖形您正在使用編程 也許真的在乎。 因此,更多的關於這方面 問題集4中,但此 只說 在一天結束時 你一直在使用的文件格式 對於years-- Microsoft Word文件, 數字文件,Excel文件, 任意數量的文件格式 可能有一些 已知文件擴展名 只是0和1的引擎蓋下。 而人類已經決定 什麼樣的約定, 什麼樣的0和1的模式代表 一個Word文件與一個Excel文件, 與任意數量的其他文件格式。 因此,在PSET 4,你就會有一個 機遇與發揮。 但是,什麼意思有一個結構。 這實際上是一個很好的SEGUE現在 成C,它只有一對夫婦 附加功能 我們還沒看呢。 這是一個非常小的語言之一 關於C的不錯的功能,是一個結構。 例如,如果你 想represent--我們 說你想有一個變量 代表一個學生的一些計劃。 也許你正在寫一門課程 註冊程序,或核心購物 工具,或者類似的東西。 什麼是數據塊相關 一個學生浮現在腦海? 就像一個學生 代表有什麼樣的價值觀? 是嗎? 你有一個名字作為一個學生。 還有什麼不典型的學生有哪些? 聽眾:[聽不清] DAVID J.馬蘭:所以,對不起。 聽眾:年齡。 DAVID J.馬蘭:一個時代或 生日等效,是的。 還有什麼? 聽眾:身份證號碼? DAVID J.馬蘭:所以一個ID號,也許 一個電話號碼,也許是一個宿舍,或房子, 或學院,或類似的東西。 任何數目的數據段是 你可能在你的聯繫人列表 是可以定義一個學生。 因此,如果我們要做到這一點,在代碼中, 我們可以做一些簡單的像這樣。 我們可能有一個程序, 有讓我們說,詮釋主要(無效)。 如果我想代表 學生,我可能有,比如, 一個名為名字的學生字符串, 一個名為宿舍為學生串, 也許一個int稱為ID為學生。 而且因為我使用的字符串,我 需要回去並提出了CS50.h. 也許我會需要stdio.h中。 因此,讓我搶先做那些和我 要調用這個student.c現在 並保存。 現在我能做些什麼 這些變量。 而我們只是寫 隨著偽代碼中的註釋, 因為它不是有趣 我們做什麼現在。 好了,這是一個程序, 不知何故存儲的學生。 什麼是我想要做的,如果我 要存儲兩位學生? 所以,我的第一反應是怎麼回事 就可以了吧,等一下, 如果我有一個學生,為什麼不要我 只是做字符串名稱2,串宿舍2, INT ID2。 而我們所做的走了 下來之前,這條道路 什麼是我們的解決方案似乎什麼 是怎樣的一個hackish的複製粘貼的 在這裡工作? 聽眾:數組。 DAVID J.馬蘭:是啊, 我們可以使用的陣列。 右鍵這個速度非常快 就不明智了。 你要排序的任意 開始命名所有這些變量。 而你,人類,必須保持 跟踪該行名2對應 與dorm2對應ID2。 它只是變得一團糟。 所以這是一個容易得多, 從幾個星期前還記得, 只是不得不叫字符串名稱 也許給我們其中的三個。 然後,也許我們有 串宿舍和有 三個,或具有恆定, 詮釋ID和有三個那些。 但即便是現在這樣的感覺 一個有點草率了吧。 我們談論的是學生,但 我真的沉湎於低水平 實施細則。 學生是一個名稱,一個宿舍和ID。 為什麼我不能只是聲明一個變量 所謂的學生,稱之為秒。 如果我想另一名學生, 為什麼不讓我只是把它噸。 或者,如果我想要一大堆 學生,為什麼不讓我 說我有一整類 同學們,這是他們三個。 換句話說,為什麼不能我來了 與我自己的數據類型,稱為 學生,其內部是 一個名字,是一個ID,是一個宿舍, 任何數量等領域。 而事實證明,你 可正是這樣做的。 所以C有這個功能叫做結構。 這是一個語言功能, 讓我們做的正是這一點。 我要繼續前進 並開闢structs.h 在這裡,我們將看到的 以下是學生的定義。 事實證明 - 而這其中甚至 比一個涉及ID簡單 剛才。 如果你要來了 自製的數據類型, 而除了int和char和 浮起並所有這些其他人的存在, 你可以從字面上這樣做 寫typedef結構, 然後一些大括號, 這裡面你 列出你想要的變量 這一新的自定義數據相關聯 像鍵入一個名稱和宿舍, 再經過大括號 你給一個名稱為新的數據類型。 因此,例如,學生。 什麼是好的關於這個現在是, 如果我們看一下相應的代碼, 該公約,第一 所有的人,是把這個 在一個名為什麼點H, 一個頭文件,我們有沒有 開始使用自己太多。 但是,我們要開始 使用相當多的現在。 而且我們可以用這個做的, 最終,在這幾行代碼 正是如此聲明 數據類型,一個學生。 現在,讓我們使用它。 我要現在進入 一個名為structs1.c。 讓我們來看看一個 幾個特點在這裡。 所以的東西在這裡是 大多是熟悉的,我們會 回過頭來究竟是不是 熟悉一會兒就好了。 當然,這是包括我自己 頭文件,它是新的,以及, 除了PSET 3,其中, 回想一下,我們有helpers.h。 所以,你可能還記得的#include helpers.h。 但為什麼我使用引號 而不是尖括號? 我什麼時候他們之間做出選擇? 幾乎總是我似乎 使用尖括號。 然後,突然之間就 六號線我使用雙引號。 為什麼會這樣呢? 是嗎? 聽眾:[聽不清] DAVID J.馬蘭:這是一個實際的,是什麼? 聽眾:這是在你的IDE。 DAVID J.馬蘭:是啊, 這是在我的實際IDE。 而且我們不要對IDE糾纏,因為 這只是我使用的工具。 那是在我目前 目錄,明確。 所以structs.h是我自己的文件 沒有安裝IDE, 在操作系統本身, 而它在我的當前目錄。 所以,如果你想要的約定 包括您自己的頭文件, 你只需要使用雙引號。 什麼是我們所說的這個東西 8號線,一般來講? 這是什麼? #定義的東西。 這代表常數,對不對? 如果你想有一個 在你的程序價值 您使用一個整體 一堆的時候,它的 良好的約定因素出來, 聲明它,用井號 定義的話,按照慣例,在所有 大寫word--儘管它不是 絕對必要的,但 這是人類的約定 充分利用常數 使他們跳出 你visually--空間 那麼你想要的值是 相當於恆定的名字。 別無分號,但是你根本 按照該模式存在。 那麼,我在此實際代碼執行。 因此,讓我們一起來看看 這裡的主要程序。 在第12行,因為我 已包括structs.h, 我現在已經奇蹟般地在我 處置一個新的數據類型。 我不只是有機會獲得INT, 和炭,和float和字符串, 和藍色等。 我現在有機會獲得 一個學生的數據類型。 因此,在第12行,我將兩個 ideas--一項所述的自定義數據類型和兩個, 使用陣列。 所以,在這個項目中,如果 我想實際支持 三個不同的學生 在我的計劃,我 可以簡單地說,給我一個變量 稱為學生,其每一個 是類型的學生,哪個 是我的自定義數據類型。 而且,具體而言,給我 其中三個在我的陣列。 所以,現在我們做這個節目在哪? 這裡只是一個for循環迭代 從0到3,因為這是 什麼樣的學生的價值。 我只是提示用戶 給我的學生的名字。 然後在第17行,我們 有大多熟悉線路。 我們有我們的老朋友 GetString的右側。 什麼一塊語法 顯然是新的, 如果你以前從來沒有編入C, 並且從未使用過的結構? 是嗎? 聽眾:本。名稱。 DAVID J.馬蘭:本。名稱。 但是,這不是一個太大的飛躍, 因為現在的學生括號我 為您提供了第i個學生。 如果你想潛水 該結構的內部, 你只需要使用一個週期, 那麼變量內的名稱, 或內部的財產 你想獲得訪問。 同樣的話,如果我再提示 用戶,給我的學生的宿舍, 你同樣可以存儲 字符串裡面的宿舍變量 那學生結構。 現在事情變得有點奇特。 這是要去看看 在或許很多太快了。 但是你會看到這麼遠更PSET 4,所以我們只在它一眼吧。 事實證明,在第23行至 38,你覺得什麼我可能做什麼? 我已經刪除了評論 今天,但版本 網上的代碼的 參考已全部評論。 我似乎在做? 聽眾:保存所有文件 該用戶輸入的信息。 DAVID J.馬蘭:是啊, 準確地說,這是一種新的方式 我們現在看到的二, 的C另一個特徵, 因此我可以創建自己的文件。 到目前為止,幾乎每一個程序 你寫的是無狀態的。 一旦它完成運行,僅此而已。 有沒有記憶或它的回憶。 有沒有保存的文件。 但是,如果你想 節約投入,有 事情發生了,就像在遊戲或程序 這樣,事實證明我們可以做到這一點。 你會看到這更 在PSET 4節。 但是,這條線23實質上 創建一個名為students.csv文件。 你可能已經看到過這一點。 即使你以前從來沒有學CS, CSV是逗號分隔的變量。 這就像一個非常貧窮的人的 版本的Excel文件, 這意味著它可以打開 在Excel和蘋果的數字, 它具有的行和列。 但它不是一個專有 格式如微軟或蘋果。 它只是逗號分隔 價值觀,我們將看到一個時刻。 而只是採取一種猜測。 在第23行,在最 最後,我的第二個參數 這個所謂的新功能 F打開文件打開是瓦特 什麼可能W¯¯表示? 是嗎? 聽眾:它可以讓你寫文件? DAVID J.馬蘭:它可以讓 你寫入文件。 因此,有幾個變種 我們可以在這裡插上研究。 但如果你只是想讀 該文件,也就是看它 並讀入內存, 只需使用報價引文結束“R”。 如果你想要寫的 文件,可以使用報價引文結束“W”。 還有追加和 幾個其他的事情 如果要修改現有的文件。 現在,我們將繼續看到這 的東西,那麼我們會回來到線24。 NULL,它的出現,是 一個特殊值, 可以通過某些功能被返回 如果事情已經wrong-- 如果該文件不存在, 如果你耗盡內存, 或一堆其他錯誤。 但現在,讓我們姑且認為這 僅僅是傳統的錯誤檢查。 在這裡,在第26行,我遍歷 從0到3在所有我的學生。 這是一種排序 一個新的功能,fprintf中, 而只是採取一種猜測。 如果printf的只是打印 一個格式化字符串, 是什麼fprintf中大概是什麼意思? 聽眾:打印到文件中。 DAVID J.馬蘭:打印 格式化字符串到一個文件中。 這就是另外的 F表示是文件。 而新的第一個參數必須是 這表示您的文件中的變量。 然後,我們只是有一個格式 就像printf的字符串。 即使這 語法是新的,這只是 是指插在學生的姓名, 插件在學生宿舍,然後 用fclose函數,關閉文件。 然後lastly--這是新的 我們會回來的這 long--我釋放前 學生的原因 發生了上面有。 但是,我們會回來的 該前long-- 這是因為GetString的是如何 實際工作引擎蓋下。 因此,讓我們快速瀏覽一下這裡。 如果我在目錄中輸入ls, 請注意,我不 有一個名為students.csv文件, 只是不存在,不存在。 所以,如果我現在編譯這個程序, 使結構-1。 /結構-1, 而且我要繼續前進,鍵入 岸堤,誰住在伯克利,耶魯。 我們將不得不搶誰 住在塞耶這些天。 而且,我們拿出其中, 是的,我想,瑪麗亞是在馬瑟 如果我沒記錯。 所以好像沒有什麼改變。 但是,如果我現在輸入ls, 有students.csv。 讓我們繼續和開放的students.csv。 這又是一個非常 輕巧的文件格式。 但我只是通過了一項約定 我有兩行和列在這裡。 第一列是 人的名字。 第二列是學生的 宿舍,或學院,或房子,或諸如此類的東西。 而現在我已經保存在此 永久在文件中。 因此,它不是那麼有趣。 但是,這只是一個敲門磚,現在 要能堅持信息 久治不愈。 所以,讓我們來看看現在還有什麼我們可以 如何處理這些和其它特徵。 但首先,什麼問題嗎? 這是一個很多,而且非常快。 但是,你會看到很多 更PSET 4,也是如此。 是嗎? 聽眾:有沒有一種方法來 繼續添加名稱到該文件? DAVID J.馬蘭:好問題。 有沒有辦法繼續 將名稱添加到該文件? 是。 而且,事實上,如果你最終 最多再打開文件, 你會使用報價 引文結束“一”進行追加, 這只會增加一個新的線, 新的生產線連連,完全吻合。 好問題。 其他的問題嗎? 是嗎? 聽眾:如果您運行了 再次程序現在, 它會不斷增加名字的 文件或將它打開了一個新的文件? DAVID J.馬蘭:啊,好問題。 如果再次正確運行程序 現在,也許在輸入新的名稱, 將其添加到文件 或覆蓋文件? 後者,因為我 不使用追加模式。 而且因為我只是一味地 打開該文件進行寫入, 它只是將覆蓋該文件。 所以,我的確需要做的是追加, 如果我想確實有一個長期的 數據庫。 現在,CSV是有用的,坦率地說,即使 像如果你writing-- 我們最終會看到這個 後來在學期時, 我們使用的CSV用於其他目的。 如果你想存儲所有的人 誰已經註冊了一些事件, 或者註冊了您的學生 組,或者類似的東西, 將數據存儲在這種 格式是超級方便。 因為從字面上看,如果我 要下載此文件。 我可以double--和 讓我們真正嘗試這 如果我有Excel或數字放在這裡。 我要右擊 或控制單擊我的檔案。 哎呦。 用鼠標右鍵單擊或控制單擊我的檔案。 來吧,我的鼠標是不是合作。 Download--我要去 下載的所有文件,在這裡,所以 只是這樣我就可以抓住這一個。 而讓我們看看,如果這個工程 students.csv--第一次 我已激活。 現在,他們希望看到我的聯繫人。 現在,我需要註冊。 看到它是多麼容易使用的CSV? 是的,保持最新。 好了,現在我們已經準備好上課。 OK,哦,有什麼新的? OK,關閉。 這是不可思議的。 好了,現在我們必須更新。 而現在,它忘記了什麼 文件我原來開了, 但什麼A--我們走吧。 好了,現在我們有一個Excel文件。 謝謝。 好了,我做的是一件容易的事。 當然,我可以預裝 Excel或數字,或其他程序。 但是,這是很好的,因為 現在我可以操縱 在標準格式中的數據。 所以,現在我們的上下文 切換到我們離開 最後的時間,這是開始 起飛訓練車輪。 但首先,你沒有 看到這個前面的午餐 再次發生在這裡的消防和 冰在劍橋,西塔在紐黑文。 註冊在CS50s網站盡快 加入CS50的學生和工作人員。 因此,我們採取了輔助輪 關閉週一follows-- 串已被宣布 CS50s庫一段時間。 而且這是不錯的,因為它允許 我們談論的變量作為 完整的單詞和句子等。 但事實證明字符串不存在。 這僅僅是同義詞,或別名, 我們已經對一些創建 其實是多一點 技術稱為一個char *。 事實上,我們看到了一個例子 週一計劃 這並沒有表現得如我們預期。 這是文件,比較-0。 而記得比較-0,如果 我重新編譯週一的節目 並運行比較-0與2型糖尿病的媽媽 小寫,媽媽用小寫了。 該方案堅持我 輸入不同的東西, 即使媽媽,都在 小寫的,是一樣的視覺。 那麼,什麼是簡單的答案 為什麼電腦認為 這兩個字符串是不同的? 是嗎? 聽眾:[聽不清] DAVID J.馬蘭:沒錯。 所以,媽媽,第一次 我在鍵入它,正在 地方保存在我的電腦 存儲器但在不同的位置 比我第二次輸入的媽媽。 現在,它肯定可以優化。 計算機可以是聰明, 實現這兩個字符串,哎, 他們是相同的。 讓我沒有冗餘存儲。 但是,計算機不這樣做 優化,除非你告訴他們。 因此,在默認情況下,他們是 只是要結束了 在內存中的兩個不同的地方。 所以更清晰,當 我們比較兩個字符串, 第一個被稱為S, 第二個被稱為 T,具體什麼是我 這裡比較第13行? 是啊。 聽眾:這是在內存中的位置 該變量將指向。 DAVID J.馬蘭:沒錯,我是 比較在存儲器中的位置 這些變量指向。 因此,特別是,如果媽媽是在 字節號1,和2和3, 和4--因為記住的反斜杠 0需要是一路在末端。 和媽媽,M-O-M的另一個實例, 是在地址10,11,12,和13。 我是比較1,該地址, 在存儲器中的位置, 對10,這是 明顯不一樣。 1不是10。 因此,這是很好的在 這是非常簡單的。 但它是有問題的,只要 我們似乎無法比較字符串。 所以fundamentally-- 並且在該低的水平, 如果你想實現 方案比較 兩個獨立的詞了 用戶鍵入的質量, 做自己排隊字符為 炭,只是條件一般, 我們需要什麼做的,顯然是? 這是不夠的只是 看看這兩個地址。 什麼是我們需要做什麼? 是嗎? 聽眾:遍歷 字符串[聽不清]。 DAVID J.馬蘭:是啊,讓我們 遍歷字符串。 讓我們用一個for循環,while循環,或 無論你是最舒服的。 如果我們有兩個字符串的地方 在內存中,讓我們來看看各的 第一個字符,那麼每個第二 字符,則第三和第四, 第五,直到我們打 有什麼特殊的標記值? 聽眾:[聽不清] DAVID J.馬蘭:是啊,反斜線 零,在該點在任一字符串 我們可以決定就是這樣。 我們有沒有匹配的每一個人物? 如果不是,返回false。 如果是的話,返回true。 所以這正是這個版本 該方案的比較-1.C一樣。 它等同於我們 看了看,除了週一,我已經 擺脫了字string--的,雖然 有沒有功能impact--所有 我現在做的是消除 一些視覺輔助輪, 但要清醒地看到, s和t地址。 這就是明星, 星號代表 是一個地址,或稱為 更多技術上的一個指針。 所以,當我在申報小號 第9行,說的char * S, 這並不意味著給我一個字符串。 這意味著給我一個變量,其 生活目的是存儲一個地址。 因為我即將把 字符串轉換成它的地址。 事實上,GetString的,是 清晰,不返回一個字符串。 它不返回的媽媽 反斜杠零,本身。 什麼是GetString的具體 而恰恰回來嗎? 聽眾:[聽不清] DAVID J.馬蘭:一個地址, 第一個字符的地址 在一些字符串就已經得到了。 所以現在我們所看到的 一個特殊的關鍵字了。 而且,我提到這點。 這將是好習慣 我們會一次又一次地看到了。 我檢查,以確保 s是不為空,t為不為空。 因為根據我真的 快速提早些時候, 什麼可能意味著,如果GetString的返回不 一個地址,但N-二U-L-L,這是再一次, 一些特殊的價值? 聽眾:錯誤。 DAVID J.馬蘭:這是一個錯誤。 出事了。 什麼一般 可能發生的事情,尤其是 與strings--可能 未知長度advance--的 也許是電腦“ 內存不足,可能 你在這種類型的 長字或句子 或粘貼這樣一個龐大的作文 那裡只是沒有足夠的內存。 所以GetString的不能返回 整個事情的地址, 所以它只是沒有返回值。 它說,一個錯誤已經發生 通過返回特殊的NULL值。 這是零地址,可以這麼說。 現在事實證明,C提供一 函數,它的迭代。 我們沒有一起實現這個 一個for循環或while循環自己。 我們可以用一個函數, 所謂的簡潔, 攪拌補償,或字符串比較,其 人生目標是做這一點。 你給它兩個指針,兩個地址, 它會去到這些地址 然後比較信 信信的質量, 停止,只有當什麼是真的嗎? 當直覺上應該挑起補償 停止迭代,只是要清楚嗎? 當它擊中一個反斜杠0在任 串,在這一點上,它可以決定 擁有一切匹配,或 以前有差異? 所以,如果我們運行這個現在嘗試 我們的小市值的比賽, 因此要比較-1,./compare-1和 鍵入小寫字母媽媽兩次。 現在,同樣的事情。 如果我再這樣做有 小寫再大寫的可能。 現在,它的確與眾不同 之間大寫和小寫。 所以,不是所有的硬或 神奇,但它現在解釋 這是怎麼回事引擎蓋下。 那麼,我們還能提取 從這種教訓? 因此,讓我們來看看這個。 我要繼續前進,寫一個 快速程序這裡所說的複製0。 現在讓我們繼續前進,實際上 讓我們做this--複製 - 0, 看看我在這裡得到了什麼。 我首先告訴用戶,說些什麼。 然後,我得到一個字符串 我將其存儲在s中。 然後我檢查如果s等於 等於NULL,只返回1。 因此,這僅僅是標準的錯誤檢查。 沒有什麼有趣的事情發生了。 而事實上,如果我們擺脫錯誤 檢查,這看起來像本週1碼 的時刻。 但是我已經開始獲得 稍微好有關。 現在,在第16行,一個星期前,也許 甚至幾天或分鐘前, 你可能會說行16 創建一個變量稱為T 和複製s轉換它。 這是一個完美的 合理的外賣。 但更準確了。 什麼是發生在第16行? 什麼是得到複製 從右到左? 是嗎? 聽眾:為T獲得第一個地址? DAVID J.馬蘭:沒錯,T 越來越s的地址。 所以,現在要清楚,如果我去 回到那個前面的例子 我抽出我已經輸入了的事情。 而我所鍵入的 in--這裡的s和這裡 是我所鍵入的某處 內存,媽媽再一個反斜杠 0了加我。 我存放在這裡,回想一下, 這是在位置1,2,3,4, 這是何等的當前秒。 因此,如果第16行,我說給我 另一個變量稱為T和存儲 在s的值,什麼 在這裡獲取存儲不會媽 而是僅僅數字1。 因此,如果我們向前看這個程序中 現在,有什麼事情發生? 所以發現有 這個功能你可能 已經前段時間用這個凱撒, 或的Vigenere,或者根本沒有。 我要求我的printf,我 要利用複製噸。 首先在第19行,快速神智 檢查,T的strlen的檢查長度。 因為我不希望 盡量利用的東西 如果沒有串存在。 如果用戶只需要敲擊回車, 沒有什麼把握。 所以,我不想做線21。 因此,第21行正在利用 這封信,顯然,在T? 聽眾:M? DAVID J.馬蘭:它看起來 喜歡它的拷貝哪一個? 聽眾:M。 DAVID J.馬蘭:嗯,男。 好了,第一個男, 因為通知說我 傳遞給TOUPPER,這 如果你從來沒有見過它的 只是一個函數來 利用作為其輸入。 Ť支架零意味著放棄 我T的零字符。 所以,如何做到這一點 畫面切換,要清楚嗎? 需要得到什麼重寫或者改變 相對於s和t和媽媽 反斜線零。 聽眾:[聽不清] DAVID J.馬蘭:是啊, 所以這一塊在這裡簡單地 需要得到改變用於:修復this-- 需要得到改為大寫M。 但現在,在後來的看 程序,如果我打印出來 S和T為我打掃這裡,看什麼 事情發生打印出s和t。 因此,請複製0,./copy-0。 讓我繼續前進,鍵入 在媽媽的全部小寫。 注意原始和 該副本已資本化。 為什麼呢? 那麼,S和T都指向, 如果你願意,相同的內存塊。 坦率地說,這是越來越 真正uninteresting--事實 我們使用零地址在這裡。 我的意思是,我真的不關心 那裡的東西是在內存中。 對不起,我抹去一點也不為過。 但我真的不關心 那裡的東西都在內存中。 所以,確實是 程序員傾向於考慮 就是當你談論 一個地址,或者一個指針, 誰在乎它是在內存中。 我不關心,如果它在 字節一或一十億。 我只關心這個 變量是有效的 指向的內存塊。 所以,從今以後,而不是狡辯 在任意的內存地址,讓我們 剛開始繪製指針 作為指針,為箭頭。 那麼,S和T真的, 根據這一計劃, 因為我是如何創建的T, 這只是兩個獨立的變量 指向相同的內存塊。 我們不關心他們在哪裡。 所以我們可以抽​​象掉的細節。 那麼,如何解決這一問題? 如果我想編寫一個版本的副本 項目實際的字符串複製 只有大寫 副本,只是憑直覺, 真實得到了什麼是一個 成份,我們的解決方案? 聽眾:[聽不清] DAVID J.馬蘭:我們需要什麼? 聽眾:內存塊。 DAVID J.馬蘭:我們需要 內存另一塊,對不對? 我們不知道如何 做到這一點的是,不一定。 但我有種需要做到這一點,以便 在小寫原媽 在額外的內存塊結束。 然後當我改變的副本,我 不想在這裡改變此副本。 我不是想改變僅此 副本使原來的不變。 那麼,讓我們看看我們如何做到這一點。 在copy-1,它已經 被剝奪了評論, 但網上評論道。 我們不是做following--這些 線是相同的,給我一個字符串 並稱之為秒。 但是,現在讓我們來看看我們的最多一個 複雜的,但在過去的複雜性 一段時間,第16行正是這一點。 因此,如果與您的舒適 圖片我們只是drew-- 給我一個新的內存塊, 所有內容複製到它, 讓我們看看如何把這種代碼。 因此線16,在左手側, 字符* T給我這個盒子在這裡。 這就是它。 在右手側, 米ALLOC,或malloc的, 是內存分配,超花哨, 只是說,一個神秘的方式 給我一個內存塊。 多少內存,我們需要什麼? 那麼,是怎樣的一個大的表現。 但是讓我們看看它說在這裡。 因此,這當然是給 我s的字符串長度。 因此,母親應該是什麼呢? 所以只有三個,對嗎? 媽媽是三個大字。 你不要指望了 反斜杠零,當你 談論一個字符串它的長度 其實人類可見的字母。 所以媽媽,所以這給了我3。 但是且慢,我現在加1。 為什麼我真的想 分配4個字節,而不僅僅是3? 是嗎? 顧客:定點價值? DAVID J.馬蘭:沒錯, 該標記值。 對於反斜杠零, 我需要總共4個字節。 所以,我需要的長度 字符串加1。 然後就是好measure-- 即使在這個系統上, 它總是將是1--我說 通過一個char的大小乘這一點。 原來的sizeof是 C中的運算符 只是告訴你的 字節數這 所需的一定的數據類型。 它不會對數組工作, 典型地,有時它。 但在一般情況下,沒有。 但是,它會告訴我有多少字節 char是,這原來是始終為1。 所以,這就像乘以1。 因此,超級神秘的期待一行代碼。 但它是所有給出 我的內存塊。 但它似乎是複製 任何東西到了內存? 還沒有。 所以,我該怎麼上線22和 23,24,25,好了,我只是做到這一點。 這是排序 老同學現在的東西。 這就好比PSET 2,其中 你只是搬東西 各地在內存中,或者說在字符串中。 所以,我從0迭代到 的串s的長度。 而我複製第i個字符 以s成噸的第i個字符。 而且因為我,程序員,做 一定要準確地分配盡可能多的字節 因為我需要,這是完美的 一對一的關係。 我複製的媽媽在 小寫的新的。 然後,最後,我做這行。 等的效果只有 在這裡利用這件T。 因此,大量吸納,但 如果你只是考慮 到底發生了什麼 在發動機罩下方 只是將這些 字節左右,所有的 是需要解決這個問題是 只給我們這一塊內存。 現在的風險 鋪天蓋地,讓我告訴 另外一個例子,幾乎 相同的,除了這一個 一行代碼。 因此,這是黑客版 這個方案的,如果你願意。 但是,我們只是提取 它變成了什麼事情。 24號線使用的是這件T 支架我得到小號支架我。 現在,我改變了這 在更神秘的星牛逼 加1等於歌星般加1。 所以發生了什麼以及為什麼 我們有一個明星人物? 我們已經看到的明星面前, 它被用於不同的位置。 我們之前看到的字符*,現在我看到 阿星在一開始,這就是確定。 因為事實證明我們 可以種推斷只是 從這些第一 原則是怎麼回事。 所以,僅僅是明確的,什麼是S' 上週,它是一個字符串。 這並不足夠了。 什麼是S,具體一點嗎? 聽眾:[聽不清] DAVID J.馬蘭:這是一個指針。 它的地址 第一個字符我們輸入研究。 OK,什麼為t? 聽眾:[聽不清] DAVID J.馬蘭:本 的第一個字節的地址 在T,該內存塊重新分配。 所以,事實證明,當我們 從0迭代,一直到字符串 length--首先,我 從0開始關閉,因為 這個老同學for循環的事情。 因此,只是為了簡單起見,我們 假設的代碼,所述第一線 真的只是這樣,對吧。 如果i為零,加零 的東西想必 是不會有效果。 那麼,這是什麼意思嗎? 事實證明,明星 操作者在這樣的背景下 是取消引用 操作者,這僅僅是 說法去一個奇特的方式 到以下地址。 因此,如果s是第一的地址 字符在這個組塊的存儲器, * S表示去那裡。 因為我們已經開 圖像以這種方式, 您可以採用 下面的心智模式。 如果這是S,和你說* S,* S 有點像槽和梯子, 如果你從童年記憶的比賽中, 就像按照箭頭,去 到的地址。 * t是同樣的事情。 所以從這裡開始,去它的塊。 我不能只是借鑒 該屏幕的方式。 * T手段去這裡。 然後,for循環僅僅是 這裡說動這個角色, 這裡將這個人物, 搬到這裡來這個角色。 但我怎麼做增量? 我要撤銷我剛剛刪除。 這是什麼一般稱為 指針運算,這 意味著數學與地址。 如果在此for循環, 我不斷遞增我, 且s是一個地址,而t是一個 地址,如果我只是不斷增加1, 這只是意味著不斷前進, 轉發和轉發在內存中。 這就像牛津大街, 街道,政務司司長建設上。 在CS建築物是在33牛津街。 所以,如果你是做33 牛津街加1, ,帶你到34牛津 街道,35個牛津街, 那麼牛津街36,不管這些 建築居然是 - 如果它們存在。 所以,這就是我們正在做的 這裡有指針運算。 所以這是一個非常神秘的方式 的表達自己。 但是,所有發生的事情 引擎蓋下 只是下面的這些地址, 就像下面的地圖,如果你願意, 或以下似箭 我們已經在屏幕上繪製。 OK,很多消化。 對語法有任何問題,概念, 指針,malloc或類似物。 是啊,在這裡第一次。 聽眾:那麼,這 說* T等於TOUPPER * T, 就是要利用 所有的字母或just-- DAVID J.馬蘭:啊, 非常好的問題。 因此,在這條線在這裡,31, 這是怎麼回事充分利用 第一個字母或所有字母。 因此,讓我們回答這個問題通過去 回到第一個原則。 在這裡,第一個原則,我的意思是 剛去的基本定義 一個什麼樣的參與。 所以TOUPPER是一個功能 這一個大寫字符。 這就是全部。 * t表示進入first-- 去T中的地址。 所以,在圖像,如果這是塊 內存我們使用malloc分配, 這是T,* T手段去這裡。 同時,你傳遞 該值,小寫字母m 到TOUPPER,你要回 外資併購,你在哪裡把它? 你把它在同一位置。 所以那些對這種邏輯 基本的定義,這只是 大寫的第一個字母 除非你用迭代我或 for循環或while循環,它不會 做任何事情比你問吧。 好問題。 是嗎? 聽眾:你為什麼使用 取消引用的方法,而不是 數組? DAVID J.馬蘭:啊,好問題。 為什麼你會使用反引用 方法,而不是在陣列的方法? 沒有特別的原因,是誠實的。 而且,事實上,對於這種 樣的例子吧, 我只是爭論使得 程序比較複雜, 更多的目光都呆滯, 人們退房 因為這看起來超級神秘,但是 即使它在做同樣的事情。 所以,坦率地說,這是一個 不必要的視覺複雜的解決方案 到的問題。 它仍然是良好的設計, 五個五的設計, 無論是在支架 符號或指針符號。 但是 - 特別是當我們得到 在以後的過程中PSET 5 當我們執行該字典, 我已經提到了幾個times--的 我們真正關心的 低級別的內存地址 我們真正理解 這是怎麼回事。 不過,就目前而言,事實證明,這 的代碼在這裡方括號線 真的不存在。 他們就是被稱為 語法糖,這 僅僅是一個古怪爽說的方式 編譯器會將方括號是 該數學表達式。 所以這是一個人的約定 要能只寫 這些非常人性化的支架。 但是,編譯器,鐺, 真的做任何時間 你寫什麼在網上突出 24,引擎蓋下它真的 將其轉換為此。 這只是作為一個人更愉快 讀取和寫入的代碼如線路24。 但最終這些 培訓輪子太脫落 當一個人的自己的舒適性變得更強。 好吧,所以記得那麼這 是最大的問題的排序 我們碰上了。 而這正是引發這整個 關於指針該死的談話, 和地址,以及複製的東西。 這是因為我們絆倒 這個愚蠢的,愚蠢的問題,即 我實現logically--與勞倫 在這裡的演示和橙汁 在milk--完美 算法正確的函數 用於交換兩個變量“ 值,但該死的東西 沒有任何持續性,或 永久的,對我的代碼。 為什麼是? 簡而言之,這是為什麼 實施互換 邏輯上是正確的,但沒有任何影響 在傳遞給它的變量, 像X和Y的主? 什麼是問題的要點? 是嗎? 聽眾:因為變量進行的 變量中通副本 通過功能。 DAVID J.馬蘭:沒錯,當你通過 變量成一個函數,或參數 到一個函數,它們是 通過複製,通過這 意味著你得到一個相同的期待 位x和y的模式, 這裡所謂的a和b。 你可以做任何事情 你想與這些副本, 但他們將不得不無 在呼叫功能的影響。 而且,事實上,我們制定了 畫面在屏幕上,召回 最後一次,如果你由此 真正思考什麼 怎麼回事下方的hood--如果 這是你的計算機的內存, 而這兒是塊 被用於主存儲器, 這是對組塊 被用於交換內存, 所以即使主要有 兩個變量,x和y, 掉期可能具有相同的期待 值,這兩者都是1和2, 但他們完全 不同的塊的存儲器。 因此,我們需要一個解決這個。 坦率地說,似乎我們現在 有一個解決這個問題吧。 如果我們現在有能力 通過地址的方式處理事情 排序和,滑道和梯子 樣式,請按照這些箭頭 而且去任何地方,我們希望 在內存中,難道我們 解決這個問題由 從主要通過交換 不是值,我們要 交換,而只是憑直覺 什麼可能我們通過交換呢? [插入VOICES] DAVID J.馬蘭:為什麼我們不只是 通過它的地址,對吧? 我們為什麼不給換一個 藏寶圖,如果你願意, 導致它的 實際值x和y。 讓我們交換,真正改變 這些原始比特,而不是 剛好路過的位份。 因此,事實上,這是什麼 將是該溶液中。 這裡這個版本 顯然不好,有缺陷的。 而現在,乍一看,它只是看起來 就像我們增加了一堆明星隨機 並越過我們的手指 它將編譯。 但是,它現在將彙編。 但是,讓我們看看這些東西的意思。 和,遺憾的是,作者 把C選擇另一個符號 使這一點 更清晰,但星運營商 有不同的含義 兩個不同的上下文。 我們已經看到了兩個, 但讓​​我們分辨。 所以向上在那裡的頂部, 當我已經改變a和b 被廉政局在惡劣 版本為int明星,a和b, 以前,都是整數。 什麼是a和b現在在 好,綠色版? 他們的地址。 什麼的,地址是明確的? 整數地址。 因此,事實上,我 他說INT星級手段 這是的地址 的整數,具體而言。 所以,現在的代碼行通知, 別的東西也​​發生了變化。 tmp中保持不變,因為 這只是暫時的整數, 沒有記憶的魔法存在。 但現在需要一個明星。 而且,事實上,每一個 其他提及的a和b, 請注意,所有的 由紅色變為綠色 是,我的前綴 這些變量的星星。 因為我不想要複製a和b。 因為如果我只是複製a和b和交換 A和B,那我其實交換? 只是地址,我想交換 什麼是這些地址。 我想去那裡。 這樣一來,星運營商 我的函數中, 不參數列表內, 意味著你去到這些地址 而真正改變這些值。 那麼,是什麼圖片 現在的樣子吧。 好吧,如果不是我傳遞 在A和B不1和2-- 其實,我需要添加 這裡另外一個定義。 因此,假設這個塊 內存是在位置10。 這是在位置11,但是這 是有點簡化, 我現在有兩個選擇做我傳遞X 和Y或者我通過他們的地址? 如果我通過他們的地址 就是這樣,我只是 現在需要實施 每綠色代碼交換 因此,它認為當一個,當它 看到B,它不只是複製a和b 並移動牛奶和橙汁。 牛奶和橙汁 比喻現在壞了, 因為那些都是杯具 的液體,而不是地圖。 我們反而需要去 解決10,我們 需要去解決11,和 然後執行交換邏輯。 所以邏輯是相同的,但 我們需要一個稍微不同的方式 對訪問這些變量。 所以在最後,是什麼 程序有樣子是這樣的。 在swap.c逐字複製 並粘貼綠色版。 但我需要做一個改變。 這是不夠的只是改變掉。 什麼其他代碼行 我是否需要改變? 是嗎? 聽眾:當它需要的參數。 DAVID J.馬蘭:在哪裡 它需要它的參數。 所以,如果我向上滾動到主,我 不能僅僅通過在x和y, 而且,我答應,最後 一塊新的語法今天。 我需要傳遞的不是X和 年,但x和y的地址。 而事實證明,符號 即C的作者選擇 是,如果你在這裡使用的符號,不 可與按位符號相混淆, 如果您使用的符號 這裡和這裡的符號, 這個數字為你, 什麼是x的地址, 也許是10,有什麼 Y的地址,也許是 11,並傳遞的那些代替。 因此,大量吸納的一次。 但是,讓我們現在快速的看到 我們剩下的4分鐘 那裡的東西可能會出現偏差。 而作為一個不談,實際上 我拍下了這張照片, TF一年或兩年前拍下了這張照片。 因此,這是後面的角落 艾略特食堂。 指針也許是最難 話題,我們將在CS50。 所以,如果你擔心的那種 坡就像是也許是 更多的是曲棍球棒 這樣,實現了 樣的,我們正在接近一個高峰 術語的概念複雜性。 我提出這個 照片,因為我發誓 上帝,在1996年秋季,當我把 CS50與我的助教, 尼沙特梅塔,他在讓我坐下 角落艾略特D.廳在午餐時, 或晚餐,或一些嘗試 幫助我理解指針。 而這正是我在幾個星期後, 它在演講時介紹 我終於明白了三分球。 而且我希望這 點擊將遠遠早於你。 但是,認識到這一點絕對間 在更複雜的主題 我們已經看了。 但是,這其中最強大的。 而當你得到它,這就是全部 剛準備終於走到了一起。 所以放心它不會 需要在今天所有的水槽。 因此,這裡的最後一個程序 我們要去看看。 而我們將結束與 快速3分鐘粘土動畫的 我們的朋友,尼克Parlante進行。 這裡有一個程序,即在前兩名 行聲明變量x和y。 這兩者都是地址 整數,AKA指針。 然後我們分配足夠的 內存來存儲一個int 並存儲地址 以x那個存儲器。 所以,這是更簡單 比以前的例子中 給我4個字節的內存, 這是一個int的大小, 並把該地址x中。 這條線在這裡的意思 去x中的地址 並把意義 生活中,數字42那裡。 不過,此行讓我擔心。 星y表示去的地址Y, 並把不吉利的數字13出現。 為什麼是危險的,在這一點上 在story--雖然迅速告知 在我們的減弱分鐘 這裡 - 為什麼是壞 我說,去y中的地址? 聽眾:你有沒有[聽不清]。 DAVID J.馬蘭:我沒有 放任何東西在年。 那麼,什麼是y的值, 在這一點上的故事? 我們不知道。 這是一些垃圾值 並且也不賓基知道。 如果我們能夠結束這一點。 [視頻回放] - 嘿,賓基,醒了。 現在是時候為指針樂趣。 - 什麼事? 了解指針? 哦,好極了。 - 嗯,上手的,我想我們 將需要一對夫婦指針。 - 確定。 此代碼分配兩個指針 它可以指向整數。 - 確定,以及我見 兩個指針,但他們 似乎並沒有指向任何東西。 - 那是正確的。 最初,指針 不指向任何東西。 他們指出,事情 被稱為指針對象並設置為 是一個獨立的步驟。 哦,對,對。 我知道這一點。 所述指針對象是分開的。 那麼,你如何分配一個指針對象? - 確定,以及這段代碼中分配 一個新的整數指針對象, 而這部分設置x為指向它。 - 嘿,這看起來更好。 所以讓它做一些事情。 - 確定,我會取消引用指針x可 數字42存入及其指針。 對於這一招,我需要我的 提領魔杖。 提領的 - 你的魔杖? 呃,那個,這是偉大的。 - 這是什麼樣的代碼如下所示。 我會剛剛成立的數量還有 - [POP音] - 嘿,看那裡去。 所以,做一個解引用在X如下 箭頭訪問及其指針。 在這種情況下,為了存儲42在那裡。 嘿,嘗試用它來存儲號碼 13通過另一個指針,Y。 - 確定。 我只是去在這裡為y, 並獲得了13號的設置。 再取的魔杖 提領和just-- [蜂鳴聲] 哦,嘿嘿,沒有工作。 再說了,呃,賓基,我不 想提領 y是一個好主意,因為設置 向上指針對象是一個獨立的步驟。 而且我不認為我們曾經做到了。 -Hmm,好點。 是啊,我們分配的指針,Y,但 我們從來沒有將其設置為指向一個指針對象。 -Hmm,非常細心。 - 嘿,你在尋找好的有,賓基。 你能解決這個問題,從而y點 到相同的指針對象為x。 -sure,我用我的魔杖 的指針賦值。 -is這將是一個 問題,像以前一樣? 不,這不碰指針對象。 它只是變化為一指針 向指向同一件事 - [爆裂聲] --as另一回事。 哦,我明白了。 現在Ÿ指向同一個地方為x。 因此,等待,現在y的固定。 它有一個指針對象。 所以,你可以嘗試的魔杖 再次提領送13以上。 哦,好了,在這裡不用。 - 嘿,看那個。 現在提領Y上的作品。 而由於指針共享 一個指針對象,他們都看到了13。 - 是的,共享的,呃,等等。 所以,我們要現在進行切換的地方? 哦,看我們沒時間了。 -But-- - 僅僅記住三個指針規則。 號1,基本結構 是你有一個指針, 它指向了一個指針對象。 但指針和 指針對象是分開的。 與常見的錯誤 是建立一個指針 但忘了給它一個指針對象。 2號,指針廢棄 開始於指針 並遵循其箭頭以上 訪問及其指針。 大家都知道,這只是如果有工作 為指針對象,哪一種回來 排除1號。 3號,指針 任務需要一個指針 並將其更改為指向 相同的指針對象為另一個指針。 因此,在轉讓之後, 兩個指針 將指向相同的指針對象, 有時這就是所謂的共享。 而這一切就是這麼簡單,真的。 再見了。 [結束播放] DAVID J.馬蘭:這就是它的CS50。 由於尼克Parlante教授。 我們會看到你下週。 [電子音樂播放]