[เล่นเพลง] เดวิดเจลัน: ทั้งหมดขวา นี้เป็น CS50 และนี่ เป็นจุดสิ้นสุดของสัปดาห์ที่สี่ และหนึ่งในหัวข้อในวันนี้ เป็นที่ของนิติดิจิตอล ศิลปะของการกู้คืนข้อมูล และแน่นอนแม้ว่า คุณอยู่ในท่ามกลาง ตอนนี้สันติภาพที่สาม และฝ่าวงล้อมสัปดาห์หน้า โฟกัสจะอยู่ใน ได้อย่างแม่นยำโดเมนนี้ ดังนั้นหนึ่งในงานที่เจ๋งที่สุดที่ฉันเคย ได้กลับมาอยู่ในโรงเรียนระดับบัณฑิตศึกษา ตอนที่ผมทำงานให้กับท้องถิ่น มิดเดิลอัยการเขต สำนักงานงานนิติทำ เพื่อเป็นหลัก, แมสซาชูเซต รัฐตำรวจในบางโอกาส เมื่อทำงานในกรณีที่จะ นำมาในสิ่งที่ต้องการฮาร์ดไดรฟ์ และฟลอปปี้ดิสก์และ การ์ดหน่วยความจำและไม่ชอบ และพวกเขาจะส่งพวกเขา ให้ฉันและผู้ให้คำปรึกษาของฉัน และเป้าหมายของเราคือการหาหลักฐาน ถ้ามีใด ๆ ที่เกี่ยวกับสื่อเหล่านี้ มองเห็นตอนนี้คุณอาจได้เห็น ของโลกของนิตินี้ ในสื่อทีวีและภาพยนตร์ แต่งานที่ฉันมีและ daresay โลกว่า ไม่มากเหมือนที่คุณจะได้เห็นมัน ลองมาดูสิ่งที่ คุณอาจจะได้เห็น [วิดีโอเล่นภาพ] -OK ตอนนี้ขอได้รับดูดีที่คุณ [เล่นเพลง] -hold มัน วิ่งกลับไปที่ cmd- รอนาที ไปขวา -There แช่แข็งที่ เต็มหน้าจอ -OK แช่แข็งที่ -Tighten ขึ้นไปบนนั้นคุณจะ? เวกเตอร์ในที่ คนที่แต่งตัวประหลาดโดยล้อหลัง ซูมในที่นี่ในจุดนี้ Global- ด้วยอุปกรณ์ที่เหมาะสม ภาพที่สามารถขยายและรุนแรงขึ้น อะไรที่? แต่ก็เป็นโปรแกรมเพิ่มประสิทธิภาพ เลือกแขวนคุณที่ชัดเจนว่าขึ้นหรือไม่ -I ไม่ทราบ ลองเพิ่มความมัน -Enhance มาตรา A6 ผมเพิ่มรายละเอียดที่ and-- -I คิดว่ามีมากพอที่จะเพิ่ม ปล่อยให้หน้าจอของฉัน -I เพิ่มการสะท้อนในสายตาของเธอ และกิจกรรมที่กลุ่มที่ทำงานนี้ผ่าน เพิ่มประสิทธิภาพวิดีโอ -Edgar คุณสามารถเพิ่มนี้ -Hang ที่ -I've รับการทำงานในการสะท้อนนี้ ภาพสะท้อนของคน -There ของ -Reflection -There เป็นภาพสะท้อนของใบหน้าของชายคนนั้น -The สะท้อน! -There สะท้อน ซูมในกระจก คุณสามารถเห็นภาพสะท้อน คุณเลือกแขวนเสริมสร้างภาพลักษณ์จากที่นี่? คุณเลือกแขวนเพิ่มมันได้หรือไม่ คุณเลือกแขวนเพิ่มมันได้หรือไม่ เราเลือกแขวนเพิ่มนี้ คุณเลือกแขวนเพิ่มมันได้หรือไม่ -hold ที่สอง ฉันจะเพิ่ม ซูมในประตู -Times 10 ซูม -Move ใน พูดถึงมากที่สุด cmd- รอหยุด แบบครบวงจร มันหยุดชั่วคราว -Rotate เรา 75 องศา รอบแนวตั้งโปรด แบบครบวงจร กลับไปส่วนหนึ่ง เกี่ยวกับประตูอีกครั้ง -Got เพิ่มภาพที่สามารถบิตแมป? -Maybe เราสามารถใช้ปราดีปซิงห์ วิธีการที่จะมองเข้าไปในหน้าต่าง ซอฟแวร์ -The เป็นรัฐของศิลปะ eigenvalue กรุออก Global- ด้วยขวา การรวมกันของ algorithms-- แสงสว่างนำของพระองค์จึง ขั้นตอนวิธีการในระดับต่อไป และฉันสามารถใช้พวกเขาเพื่อ เพิ่มรูปนี้ -Lock และขยายแกน Z -Enhance เพิ่ม -Enhance ทำให้แข็งตัวและเพิ่ม [จบการเล่นวิดีโอ] เดวิดเจลัน: ดังนั้นผู้ที่มี ทุกคำ แต่พวกเขาไม่ได้ ที่ใช้ในประโยคที่ถูกต้อง และแน่นอนในอนาคตเวลาใด ๆ โปรดที่คุณได้ยินคนพูดคำว่า "เพิ่ม" หัวเราะเพียงเล็กน้อย เพราะเมื่อคุณพยายามที่จะเพิ่มประสิทธิภาพ เช่นนี้เป็นสิ่งที่เกิดขึ้น ดังนั้นนี่คือภาพที่งดงาม นี้เป็นของตัวเอง CS50 Daven และคิดว่าเราต้องการที่จะ มุ่งเน้นในการกระพริบตาในดวงตาของเขา หรือภาพสะท้อนของ คนเลวที่เห็นได้ชัดว่า จับโดยกล้องรักษาความปลอดภัย นี่คือสิ่งที่เกิดขึ้นเมื่อ คุณซูมในภาพที่ มีเพียงจำนวน จำกัด ของบิตที่เกี่ยวข้องกับมัน นั่นคือสิ่งที่คุณจะได้รับ และแน่นอนในสายตาของ Daven แต่สี่อาจจะหกพิกเซล ที่ประกอบด้วยสิ่งที่ ก็มีเสน่ห์มี เพื่อหาชุดที่สี่ในที่สุดจะมี คุณสำรวจโลกนี้โดยเฉพาะอย่างยิ่ง โดยธรรมชาติของสิ่งที่ ที่เราเรียกฉันแฟ้ม / o ที่ I / O เป็นเพียงวิธีที่จินตนาการของ อินพุทและเอาท์พุบอกว่า ดังนั้นป่านนี้ทั้งหมดของการมีปฏิสัมพันธ์ ที่เราเคยมีกับคอมพิวเตอร์ ได้รับส่วนใหญ่ของคุณด้วย แป้นพิมพ์และหน้าจอ แต่ไม่มากกับฮาร์ดดิสก์ หรือบันทึกไฟล์ที่เกินกว่าคนที่คุณ ตัวเองเขียน โปรแกรมของคุณป่านนี้มี ไม่ได้รับการสร้างและประหยัด และการอัพเดตไ​​ฟล์ของตัวเอง ดีสิ่งที่เป็นไฟล์ได้หรือไม่ ดีบางสิ่งบางอย่างเช่น JPEG นี่คือภาพที่คุณอาจจะ มีหรืออัปโหลดไปยัง Facebook, หรือดูทุกที่บนเว็บ อันที่จริงภาพเราที่เพียงแค่ เลื่อยของ Daven เป็น JPEG และสิ่งที่น่าสนใจ เกี่ยวกับไฟล์เช่น JPEGs คือว่าพวกเขาสามารถระบุ มักจะโดยรูปแบบบางอย่างของบิต ในคำอื่น ๆ ก็เป็นสิ่งที่ แตกต่างจาก JPEG GIF จากปิงจาก Word เอกสารจากแฟ้ม Excel? ดีก็แตกต่างกันเพียง รูปแบบของบิต และรูปแบบที่แตกต่างกันเหล่านี้ ปกติจะอยู่ที่จุดเริ่มต้นของไฟล์เหล่านั้น เพื่อที่ว่าเมื่อเปิดเครื่องคอมพิวเตอร์ของคุณคำ หมอหรือเมื่อคอมพิวเตอร์เปิด JPEG, มันก็ดูปกติท​​ี่ หลายบิตแรกในแฟ้ม และถ้ามันตระหนักถึงรูปแบบ มันบอกว่าโอ้นี้เป็นภาพ ผมขอแสดงให้ ผู้ใช้เป็นกราฟิก หรือโอ้นี้ดูเหมือนว่าหมอคำ ผมขอแสดงให้ผู้ใช้เป็นเรียงความ ดังนั้นสำหรับตัวอย่างเช่นภาพ JPEG, มันจะเปิดออกมี ที่มีความซับซ้อนอย่างเป็นธรรม ภายใต้เครื่องดูดควัน แต่สามไบต์ครั้งแรกในทุกส่วน JPEG เริ่มต้นด้วยตัวเลขเหล่านี้สาม ดังนั้นไบต์ศูนย์หนึ่งและสองมีใน ทุก JPEG, 255 แล้วจำนวนมากที่สุด 216 แล้วจำนวน 255 และสิ่งที่คุณจะสามารถ จะเริ่มต้นทำในสัปดาห์หน้า เป็นจริงโผล่ใต้ เครื่องดูดควันของไฟล์เช่น JPEGs และเช่นไฟล์บิตแมปและเห็น สิ่งที่เคยมีมานานเป็น ในขณะที่คุณได้ใช้คอมพิวเตอร์ แต่สิ่งที่มีอยู่ไม่ปกติ เขียนเหมือนเลขทศนิยมเช่นนี้ นักวิทยาศาสตร์คอมพิวเตอร์ไม่ได้ มีแนวโน้มที่จะพูดในทศนิยม พวกเขาไม่ได้จริงๆพูดในไบนารี โดยปกติแล้วเมื่อเราต้องการ ในการแสดงตัวเลข เราจะใช้เลขฐานสิบหก ที่คุณอาจจำ จากการพูดการตั้งปัญหา หนึ่งที่ท้าทาย คุณจะคิดเกี่ยวกับระบบที่แตกต่างกัน เราแน่นอนมีความคุ้นเคย กับทศนิยมศูนย์ถึงเก้า เราได้พูดคุยเกี่ยวกับไบนารี และเราไม่ได้จริงๆมี การใช้ที่มากที่นี่ ที่ออกมาเพราะเครื่องคอมพิวเตอร์ที่จะใช้ว่า แต่โปรแกรมเมอร์จะมาก บ่อยครั้ง แต่ไม่เสมอไป ใช้เลขฐานสิบหกซึ่งก็หมายความว่า คุณมี 16 ตัวอักษรในตัวอักษรของคุณ เมื่อเทียบกับสองคนหรือ 10 ดังนั้นวิธีที่คุณนับถึงสูง กว่าเก้าในเลขฐานสิบหก? คุณไป 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, , b, c, D, E, F, เพียงโดยการประชุม แต่สิ่งที่สำคัญคือว่าแต่ละ ของเหล่านี้เป็นสัญลักษณ์เดียว ไม่มี 10 ไม่มี 11 ต่อ se เพราะแต่ละ จากตัวเลขของคุณเช่นเดียวกับในทศนิยม และเช่นเดียวกับในไบนารีควรเพียง จะเป็นตัวละครตัวเดียวโดยการประชุม เพื่อที่ว่านั้นเป็นตัวอักษรที่เรามี ในการกำจัดของเราสำหรับเลขฐานสิบหก ดังนั้นสิ่งที่จะ JPEG ลักษณะเหมือนถ้าคุณ เขาจะเขียนออกครั้งแรกที่สามผู้ ไบต์ไม่เป็นทศนิยม แต่ เช่นเป็นเลขฐานสิบหก? และเหตุผลที่เป็นฐานสิบหกได้ทั้งหมดที่มีประโยชน์ที่? ดีดูอย่างรวดเร็วที่ยกตัวอย่างเช่น ดังนั้นถ้าผมเขียนออกบิตที่ เป็นตัวแทน numbers-- ทศนิยมเหล่านี้ นี้อาจจะมีสนิมเล็กน้อย ในขณะนี้จากไม่กี่สัปดาห์หลัง แต่คนเดียวที่เหลือและ หนึ่งที่เหมาะสมเป็นเรื่องง่ายสวย 255 เป็นเราจำนวนที่ใหญ่ที่สุด จะเป็นตัวแทนที่มีแปดบิต มันเป็นทุกคน ดังนั้นเพียงคนเดียวที่เป็นอย่างอ่อนโยน ที่น่าสนใจคือหนึ่งกลาง และถ้าคุณทำชนิดของออก คณิตศาสตร์, คุณจะได้ข้อสรุปที่แน่นอน รูปแบบของการหนึ่งที่และ ศูนย์แสดงถึง 216 เพื่อให้เพียงกำหนดสำหรับ ตอนนี้ที่เหล่านี้ถูกต้อง แต่ทำไมนี้เป็นที่น่าสนใจ? ดีไบต์แน่นอนแปดบิต และปรากฎว่าถ้าคุณคิดว่า ของไบต์เป็นสองชิ้นสี่บิต, เช่นนี้ ผมขอเพียงแค่เพิ่มพื้นที่บางส่วน ดังนั้นก่อนที่หลังจาก ฉันได้เพิ่มเพียงพื้นที่สีขาวบาง เพื่อประโยชน์ในการมองเห็นของที่นี่ เราอาจจะทำอย่างไรตอนนี้เป็นตัวแทนใน กล่าวว่าเลขฐานสิบหกรูปสี่เหลี่ยมของบิตแต่ละ ชุดของสี่บิตแต่ละ ดังนั้นสำหรับตัวอย่างเช่นทางด้านซ้าย ตอนนี้เรามี 1111 ในไบนารี อะไรคือสิ่งที่ตัวเลขในทศนิยมที่ ถ้าคุณทำออกคณิตศาสตร์หรือไม่ คุณมีสถานที่ที่คนที่เจ้าตัว, สถานที่ที่สี่และเป็นสถานที่ที่แปด ผู้ชม: 15 เดวิดเจลัน: มันเป็น 15 ดังนั้นหากเราทำแปดบวกสี่ บวกสองบวกหนึ่งที่เราได้รับ 15 เพื่อที่ผมจะเขียนลง 15 ด้านล่าง 1111 แต่จุดทั้งที่นี่ เป็นเลขฐานสิบหกไม่ทศนิยม ดังนั้นแทนที่จะเขียนลง 15, 1-5 ฉันจะเขียนว่าในฐานสิบหก, ซึ่งถ้าคุณกลับคิดว่าถ้าคุณมี ศูนย์ผ่านฉสิ่งที่ 15 จะเป็นอย่างไร ผู้ชม: ฉ เดวิดเจลัน: ดังนั้นมันจะเปิดออกมันฉ และคุณสามารถทำงานที่ออกมาด้วยการพูดว่า ดีถ้าเป็น 10 แล้วตกลงฉ 15 ดังนั้นแน่นอนเราสามารถเขียน ชุดเดียวกันนี้ของตัวเลขที่ฉฉ แล้วถ้าเราทำบิตของคณิตศาสตร์ เราจะได้ข้อสรุปว่าที่ง แปดเป็นเรื่องง่ายสวยเพราะเรา มีหนึ่งในสถานที่ที่แปด แล้วเรามีฉฉคู่มากขึ้นของ ดังนั้นสิ่งที่มนุษย์มักจะทำโดยการประชุม เมื่อพวกเขาใช้เลขฐานสิบหกคือพวกเขาเพียงแค่ เขียนนี้น้อยมากรัดกุม กำจัดส่วนใหญ่ของพื้นที่สีขาวที่ และเพียงเพื่อเป็นซุปเปอร์ที่ชัดเจนในการ ผู้อ่านว่านี้เป็นเลขฐานสิบหก การประชุมง่ายในหมู่ มนุษย์จะถูกคุณเขียนเป็นศูนย์ x ซึ่งมีความหมายอื่น กว่าตัวระบุภาพของ ที่นี่มาจำนวนฐานสิบหก แล้วคุณใส่ตัวเลขสองหลัก, ฉ ฉในกรณีนี้แล้ว d แล้วฉฉ ดังนั้นเรื่องยาวสั้น เลขฐานสิบหกก็มีแนวโน้มที่ จะเป็นประโยชน์เพราะแต่ละคนของ ตัวเลขศูนย์ผ่านฉเส้นอย่างสมบูรณ์แบบ ขึ้นกับรูปแบบของสี่บิต ดังนั้นถ้าคุณมีตัวเลขสองหลักเลขฐานสิบหก ศูนย์ผ่าน F อีกครั้งและอีกครั้ง ที่ช่วยให้คุณได้อย่างสมบูรณ์แบบ แปดบิตหรือหนึ่งไบต์ ดังนั้นที่ว่าทำไมมันมีแนวโน้มที่จะ เป็นประโยชน์ตามอัตภาพ ไม่มีทางปัญญาเป็น เนื้อหาจริงๆถัดจากนั้น ยูทิลิตี้อื่น ๆ นอกเหนือจากที่เกิดขึ้นจริงของ ตอนนี้ภาพ JPEG ไม่เพียง แต่ รูปแบบไฟล์สำหรับกราฟิก คุณอาจจะจำได้ว่ามี ไฟล์เช่นนี้ในโลก อย่างน้อยจากไม่กี่ปีหลัง ดังนั้นนี้เป็นจริง ที่ติดตั้งใน Windows XP ในล้านของคอมพิวเตอร์ทั่วโลก และนี่คือแฟ้มบิตแมป, BMP และแฟ้มบิตแมปที่คุณจะได้เห็นต่อไป สัปดาห์เพียงหมายถึงรูปแบบของจุดที่ พิกเซลที่พวกเขากำลังเรียกว่า แผนที่ในบิตจริงๆ ดังนั้นสิ่งที่น่าสนใจแม้ว่า เกี่ยวกับรูปแบบไฟล์นี้, BMP, เป็น ที่อยู่ใต้ฝากระโปรงก็ มีมากกว่าเพียงแค่สามไบต์ ที่ประกอบด้วยส่วนหัวของตนเพื่อ ที่จะพูดไม่กี่กัดครั้งแรก จริง ๆ แล้วมันดูเล็กน้อย ความซับซ้อนได้อย่างรวดเร็วก่อน และคุณจะเห็นนี้อยู่ในชุด P และได้รับบางสิ่งบางอย่าง ออกมาโดยเฉพาะอย่างยิ่งในเรื่องนี้ตอนนี้ ไม่ได้ให้ความสำคัญเช่นเดียวกับความเป็นจริง ว่าที่จุดเริ่มต้นของทุกบิตแมป ไฟล์รูปแบบกราฟิก, มีทั้งกลุ่มของตัวเลข ตอนนี้ไมโครซอฟท์ ผู้เขียนของรูปแบบนี้ มีแนวโน้มที่จะเรียกคนเหล่านั้น สิ่งที่ไม่ ints และตัวอักษร และลอย แต่คำพูดและง คำและปรารถนาและไบต์ ดังนั้นพวกเขากำลังชนิดข้อมูลที่แตกต่างกันเพียงแค่ พวกเขากำลังชื่อที่แตกต่างกัน สำหรับสิ่งเดียวกัน แต่คุณจะเห็นว่าใน P ชุดสี่ แต่นี้เป็นเพียงการบอกว่าถ้ามนุษย์ ดับเบิลคลิกที่ไฟล์บาง .BMP ของเขา หรือฮาร์ดไดรฟ์ของเธอและหน้าต่างเปิด ขึ้นแสดงให้เขาหรือเธอภาพที่ ที่เกิดขึ้นเนื่องจากการดำเนินงาน ระบบน่าจะสังเกตเห็นไม่เพียง แต่ นามสกุลไฟล์ .BMP ในชื่อไฟล์ แต่ยังมีความจริงที่ว่ามีบาง การประชุมกับรูปแบบของบิต ที่จุดเริ่มต้นมาก ของไฟล์บิตแมปที่ แต่ตอนนี้ขอมุ่งเน้นไปที่ เช่นไฟล์ที่มีความซับซ้อน แต่ในสิ่งที่เช่นนี้ สมมติว่าที่นี่ใน gedit ผม เพียงแค่จุดเริ่มต้น ของโปรแกรมที่ง่ายสวย ฉันมีบางอย่างรวมถึงการขึ้นด้านบน ตอนนี้ผมได้มี #include "structs.h" แต่ ฉันจะกลับมาที่ว่าในช่วงเวลา แต่เรื่องนี้จะเป็นประโยชน์สำหรับในตอนนี้ ดังนั้นนี่คือโปรแกรม ที่จะดำเนินการ เช่นฐานข้อมูลของนายทะเบียน ดังนั้นฐานข้อมูลของนักเรียน และนักเรียนทุกคนในโลก มีชื่อและบ้านและอาจจะบาง สิ่งอื่น ๆ แต่เราจะให้มันง่าย นักเรียนทุกคนมีชื่อและบ้าน ดังนั้นถ้าผมอยากจะเขียน โปรแกรมที่มีจุดมุ่งหมายในชีวิต เป็นเพียงการย้ำจาก เป็นศูนย์ได้ถึงสาม ถ้ามีสามนักเรียน ที่มหาวิทยาลัยฮาร์วาร์ และฉันก็ต้องการที่จะได้รับใช้ GetString, ชื่อของนักเรียนแต่ละคนและบ้าน และจากนั้นเพียงแค่พิมพ์เหล่านั้นออก นี่คือการจัดเรียงของชอบสัปดาห์ หนึ่งสิ่งที่สัปดาห์ที่สองตอนนี้ ที่ฉันต้องการเพียงแค่สำหรับ ห่วงหรือสิ่งที่ต้องการ และฉันต้องการที่จะเรียก GetString ไม่กี่ ครั้งแล้วพิมพ์ฉไม่กี่ครั้ง ดังนั้นวิธีที่ฉันอาจจะทำเช่นนี้แม้ว่า เมื่อทั้งสองชื่อและบ้าน มีส่วนร่วมสำหรับนักเรียนแต่ละคน? ดังนั้นสัญชาตญาณแรกของฉันอาจจะ จะทำอะไรเช่นนี้ ครั้งแรกที่ฉันอาจจะบอกว่าดีให้ฉัน บอกว่าอาเรย์ของสตริงที่เรียกว่าชื่อ และฉันไม่ต้องการ hardcode สามที่นี่ สิ่งที่ฉันต้องการที่จะนำมี? ดังนั้นนักเรียนเพราะนั่นเป็นเพียง คงประกาศที่ด้านบน เพียงเพื่อให้ฉันจะได้ไม่ต้อง hardcode สามในสถานที่หลาย วิธีนี้จะสามารถเปลี่ยนได้ที่เดียว และมันมีผลต่อการเปลี่ยนแปลงทุก และจากนั้นผมอาจจะทำ นักเรียนบ้านสตริง และตอนนี้ฉันอาจจะทำสิ่งที่ชอบ สำหรับ (int i = 0; ฉัน <นักเรียน; i ++ ดังนั้นฉันพิมพ์ได้อย่างรวดเร็ว แต่นี้เป็น ไวยากรณ์อาจคุ้นเคยตอนนี้ และตอนนี้เป็นมากขึ้นล่าสุด ถ้าผมต้องการที่จะใส่ใน i-th ชื่อของนักเรียน, ผมคิดว่าผมทำเช่นนี้ แล้วไม่ได้ชื่อ แต่ยึดบ้านฉัน ผมทำเช่นนี้ GetString และปล่อยให้ ฉันกลับไปแก้ไขบรรทัดนี้ เห็นด้วย? ไม่เห็นด้วย? มันไม่ใช้ง่ายมาก ฉันยังไม่ได้บอกผู้ใช้ว่าจะทำอย่างไร แต่ตอนนี้ถ้าฉันยัง ต้องการที่จะต่อมาให้ พูดพิมพ์สิ่งเหล่านี้ ดังนั้นสิ่งที่ต้องทำแทนดูในภายหลัง ฉันจะทำมากขึ้นด้วย เจ้านี่นี้เนื้อหาคือ การดำเนินการที่ถูกต้องของ ได้รับชื่อและที่บ้านสาม ของพวกเขารวมของแต่ละจากผู้ใช้ แต่นี่ไม่ใช่การออกแบบที่ดีมากใช่มั้ย? เกิดอะไรขึ้นหากนักเรียนไม่ได้เพียงแค่ชื่อ และบ้าน แต่ยังมีจำนวน ID, และหมายเลขโทรศัพท์ และที่อยู่อีเมล และอาจจะหน้าบ้านและ อาจจะจับ Twitter, และจำนวนของรายละเอียดอื่น ๆ ที่เกี่ยวข้องกับนักเรียนหรือบุคคลที่ มากขึ้นโดยทั่วไป วิธีการที่เราจะเริ่มต้นที่จะเพิ่ม ฟังก์ชันการทำงานกับโปรแกรมนี้ ดีฉันรู้สึกเหมือนวิธีที่ง่ายที่สุดอาจจะ จะทำสิ่งที่ต้องการให้พูดว่า นักศึกษารหัส int ดังนั้นผมจึงสามารถใส่รหัสของพวกเขาทั้งหมดในที่นั่น แล้วบางสิ่งบางอย่าง เช่นหมายเลขโทรศัพท์ ฉันไม่แน่ใจว่าวิธีการ รับรองว่าเพียง แต่ จึงขอไปข้างหน้าและเพียงแค่โทร นี้ twitters นักเรียนซึ่ง เป็นเพียงเล็กน้อยแปลก but--, และสาขาพวงมากขึ้น ผมได้เริ่มต้นได้อย่างมีประสิทธิภาพ คัดลอกและวางที่นี่ และนี่คือที่จะเติบโตสวย เทอะทะสวยได้อย่างรวดเร็วใช่มั้ย? มันจะไม่ดีถ้ามี ในโลกโครงสร้างข้อมูลที่รู้จักกัน ไม่เป็น int หรือสตริง แต่สิ่งที่ ระดับที่สูงขึ้นเป็นนามธรรมดังนั้น ที่จะพูดเป็นที่รู้จักกันเป็นนักเรียนหรือไม่ C ไม่ได้มาด้วยในตัว ฟังก์ชั่นสำหรับนักเรียน แต่สิ่งที่ถ้าผมต้องการที่จะให้มันดังกล่าวหรือไม่ ดีก็จะเปิดออกฉันจะไป เปิดไฟล์ที่เรียกว่า structs.h ที่นี่ และคุณสามารถทำตรงนั้น และเรากำลังจะเริ่มต้นการทำเช่นนี้ตอนนี้ และภายใต้ประทุนของ P ชุดสาม, คุณได้รับการทำอยู่แล้วในขณะนี้ ไม่มีสิ่งเช่นกรัมดูแลรักษาหรือ รูปไข่กรัมในการเขียนโปรแกรมภาษาซี คนที่ Stanford ดำเนินการเหล่านั้น ชนิดข้อมูลโดยใช้วิธีการนี​​้ที่นี่ ประกาศข้อมูลใหม่ของตัวเอง ประเภทโดยใช้คำหลักใหม่ เรียกว่า struct และอีก เรียกว่า typedef หนึ่ง และแน่นอนแม้ว่าไวยากรณ์ มีลักษณะเล็ก ๆ น้อย ๆ ที่แตกต่างจากสิ่งที่ ที่เราเคยเห็นมาก่อนใน หลักการมันง่ายสุด เพียงแค่นี้ก็หมายถึง "กำหนดประเภท". ที่เป็นไปได้ โครงสร้างและโครงสร้าง เป็นเหมือนภาชนะ สำหรับสิ่งที่หลาย ๆ และโครงสร้างที่เป็นไป ที่จะมีสายเรียกชื่อ และบ้านสายที่เรียกว่า และขอเรียกเพียงเพื่อความสะดวก นี้นักเรียนโครงสร้างข้อมูลทั้ง ดังนั้นช่วงเวลาที่คุณจะได้รับการ อัฒภาคที่คุณมีในขณะนี้ สร้างข้อมูลของคุณเอง ชนิดที่เรียกว่านักเรียน ที่ตอนนี้ยืนอยู่ข้าง int, และลอยและถ่านและสตริง และดูแลรักษากรัมและกรัมรูปไข่และหมายเลขใด ๆ ในสิ่งที่คนอื่น ๆ ได้คิดค้น ดังนั้นสิ่งที่เป็นประโยชน์เกี่ยวกับเรื่องนี้ ขณะนี้คือว่าถ้าฉันกลับไป เพื่อ struct 0 และจบนี้ การดำเนินการที่ฉันเขียน ล่วงหน้าที่นี่สังเกตได้ว่าทุก ของ messiness หลีกเลี่ยงไม่ได้ เป็นเรื่องเกี่ยวกับที่จะเริ่มต้นสิ่งที่เกิดขึ้นขณะที่ผมเพิ่ม หมายเลขโทรศัพท์และที่ twitters และทุก สิ่งอื่น ๆ เหล่านี้เพื่อ ความหมายของนักเรียนที่ ตอนนี้ก็ห่อรัดกุมขึ้น เป็นเพียงหนึ่งในแถวของนักเรียน และแต่ละของนักเรียนที่ขณะนี้ มีหลายสิ่งภายในของมัน เพื่อให้เพียงใบหนึ่งคำถาม คุณจะได้รับที่ชื่อ และบ้านและ ID, และสิ่งอื่นที่เป็น ด้านในของนักเรียนหรือไม่ ง่ายสุดเช่นกัน ไวยากรณ์ใหม่ แต่เป็นความคิดที่เรียบง่าย คุณเพียงแค่ดัชนีลงในอาร์เรย์ ที่เราได้เมื่อสัปดาห์ที่แล้วและ และสิ่งที่เห็นได้อย่างชัดเจน ชิ้นใหม่ของไวยากรณ์? เพียง. ซึ่งหมายความว่า "ไปภายใน โครงสร้างและได้รับข้อมูลที่เรียกว่า ชื่อที่ได้รับข้อมูลที่เรียกว่าบ้าน ได้รับข้อมูลที่เรียกว่านักเรียน ". ดังนั้นใน P ชุดสามถ้าคุณ ยังคงทำงานอยู่ในนั้น และคนส่วนใหญ่ยังคง จะตระหนักดีว่าในขณะที่คุณ เริ่มใช้สิ่งที่ต้องการ rects กรัมกรัมและนิ้วก้อย และสิ่งอื่น ๆ ที่ดูเหมือนจะไม่ มาจากสัปดาห์ที่ศูนย์หนึ่งหรือสอง ตระหนักดีว่านั่นเป็นเพราะ Stanford ประกาศบางชนิดข้อมูลใหม่ และแน่นอนที่ว่าสิ่งที่เราจะ ทำเช่นเดียวกับใน P ชุดสี่เมื่อ เราเริ่มที่จะจัดการกับสิ่ง เช่นภาพบิตแมปและอื่น ๆ เพื่อให้เป็นเพียงแค่ทีเซอร์และ รูปแบบจิตสำหรับสิ่งที่จะมา ตอนนี้ผม procrastinated เล็กน้อยในเช้าวันนี้ ฉันเป็นชนิดของความอยากรู้อยากเห็นสิ่งที่ วอลล์เปเปอร์ไมโครซอฟท์จริง ดูเหมือนว่าวันนี้ และมันจะเปิดออกคนในปี 2006 จริงไปเกือบได้อย่างแม่นยำ จุดเดียวกันในการถ่ายภาพในความเป็นจริง สิ่งที่ดูเหมือนว่าวันนี้ ข้อมูลนี้เป็นรกน้อย ดังนั้นการพูดตอนนี้ของภาพ ให้นำกลับมา Daven ที่นี่ บนหน้าจอและนิโคลัส และเพียงแค่เตือนให้คุณ ว่าถ้าคุณต้องการที่จะเข้าร่วมกับเราเพื่อรับประทานอาหารกลางวัน นี้วันศุกร์ที่หัวไปยัง URL ตามปกติของเรา ที่นี่ ดังนั้นเราจึงไม่ที่ปล่อยออกในวันจันทร์ที่? เราได้นำปัญหานี้ใช่มั้ย? นี้ดูเหมือนจะถูกต้อง การดำเนินการแลกเปลี่ยน โดยที่คุณสละสอง ints, หนึ่งที่เรียกว่าอย่างใดอย่างหนึ่งที่เรียกว่าข สลับพวกเขาเช่นเดียวกับลอร่าได้ที่นี่ บนเวทีกับนมและน้ำ โดยใช้ชั่วคราว ตัวแปรหรือถ้วยที่ว่างเปล่า เพื่อให้เราสามารถนำขในและใน ขโดยไม่ทำให้ระเบียบของสิ่งที่ เราใช้ตัวแปร มันเรียกว่าอุณหภูมิ แต่สิ่งที่เป็นพื้นฐาน ปัญหากับรหัสนี้ในวันจันทร์ที่? สิ่งที่เป็นปัญหาที่นี่? ใช่ ผู้ชม: มันต้องใช้พื้นที่มากขึ้น เดวิดเจลัน: ใช้เวลามากขึ้น พื้นที่เพราะฉันใช้ตัวแปร และที่ตกลง ที่เป็นจริง แต่ฉัน จะบอกว่าที่ตกลง มันเป็นเพียง 32 บิตในแกรนด์ รูปแบบของสิ่งจึงไม่เป็นเรื่องใหญ่ ความคิดอื่น ๆ ผู้ชม: มันแลกเปลี่ยน ตัวแปรในท้องถิ่น เดวิดเจลัน: แน่นอน มันเป็นเพียงสัญญาแลกเปลี่ยนตัวแปรท้องถิ่น เพราะเวลาที่คุณเรียกฟังก์ชัน เมื่อฉันมีถาดจาก Annenberg ครั้งสุดท้ายที่คุณจะมีหลักที่อยู่ด้านล่าง เร็วที่สุดเท่าที่คุณเรียกฟังก์ชันที่เรียกว่า แลกเปลี่ยนแลกเปลี่ยนไม่ได้รับ x และ y, ค่าเดิม ไม่ได้รับสิ่งแลกเปลี่ยนที่เราได้เรียกร้อง? ผู้ชม: สำเนา เดวิดเจลันดังนั้นสำเนาของพวกเขา จึงได้รับหนึ่งและสองถ้าคุณ จำตัวอย่างจากครั้งสุดท้าย แต่สำเนาของหนึ่งและสอง ที่จะสลับที่ประสบความสำเร็จ แต่โชคร้ายที่ในท้ายที่สุด ค่าเหล่านี้จะยังคงเหมือนเดิม เพื่อให้เราสามารถเห็นสิ่งนี้กับเรา เพื่อนใหม่หวังว่า GDB, ที่คุณหรือ TFS และ Ca มี ได้รับการแนะนำให้คุณไปดังต่อไปนี้ จึงไม่มีการเรียกคืนการแลกดู like-- ให้ เปิดเจ้านี่มีลักษณะเช่นนี้ เราเริ่มต้นได้ x เพื่อหนึ่งถึงสองปี มีพวงของการพิมพ์ของฉ แต่แล้วการเรียกร้องที่สำคัญ นี่คือการสลับที่ เป็นสิ่งที่เรารหัส เพิ่งเห็นช่วงเวลาที่ผ่านมา ซึ่งเป็นที่ถูกต้องในครั้งแรก อย่างรวดเร็ว แต่หน้าที่ โปรแกรมนี้ไม่ได้ทำงานเพราะ ก็ไม่ได้สลับ x และ y อย่างถาวร ดังนั้นเรามาดูนี้อบอุ่นอย่างรวดเร็ว ขึ้นที่นี่กับ GDB, ./noswap พวงของข้อมูลเป็นอย่างดีว่า ฉันจะได้รับการกำจัดด้วยการควบคุม L สำหรับในตอนนี้ และตอนนี้ฉันกำลังจะไป ไปข้างหน้าและเรียกใช้ และโชคร้ายที่ ไม่ได้มีประโยชน์ที่ มันวิ่งโปรแกรมภายในนี้ โปรแกรมที่เรียกว่า GDB ดีบัก, แต่มันก็ไม่ให้ฉันกระตุ้นรอบ ดังนั้นวิธีการที่จริงผมสามารถหยุดชั่วคราว ดำเนินการภายในโปรแกรมนี้ ดังนั้นการหยุดพัก และผมสามารถทำลายใด ๆ จำนวนบรรทัดหนึ่ง, 10, 15 แต่ผมยังสามารถทำลายสัญลักษณ์ โดยกล่าวว่าการหยุดพักเป็นหลัก และที่จะตั้งพัก จุดที่เห็นได้ชัดที่เส้น 16 ในหลัก และสถานที่ที่เป็นสาย 16? ให้ขึ้นไปยังรหัส และไปถึง noswap และแน่นอนสาย 16 ครั้งแรกในโปรแกรม ดังนั้นตอนนี้ถ้าผมไปข้างหน้าและประเภท ใช้เวลานี้ใส่ก็หยุดชั่วคราว จึงขอกระตุ้นรอบ พิมพ์ค่า x ทำไม x ศูนย์? และไม่สนใจเครื่องหมายดอลลาร์ นั่นเป็นเพียงสำหรับนักเล่น การใช้งานของโปรแกรม ทำไม x เป็นศูนย์ในขณะนี้คืออะไร? ใช่ ผู้ชม: มันหยุดขวาก่อนที่ สาย 16, ไม่จริงในบรรทัด 16 เดวิดเจลัน: แน่นอน GDB โดยค่าเริ่มต้นได้หยุดชั่วคราว ดำเนินการก่อนที่จะสาย 16 ดังนั้นจึงยังไม่ได้ดำเนินการซึ่ง หมายถึง x มีค่าที่ไม่รู้จักบาง และเรามีโชคดีว่ามันเป็น สิ่งที่สะอาดเช่นศูนย์ ดังนั้นตอนนี้ถ้าผมพิมพ์ต่อไป ตอนนี้ก็ดำเนินการ 16 มันรอสำหรับผมที่จะดำเนินการ 17 ให้ฉันไปข้างหน้าและพิมพ์ x มันเป็นหนึ่งใน ให้ฉันไปข้างหน้าและพิมพ์ปี สิ่งที่ฉันควรจะเห็นตอนนี้หรือไม่ ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: ดังน้อย ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: ไม่ค่อนข้างเป็นเอกฉันท์ ดังนั้นใช่เราจะเห็นค่าขยะบาง ตอนนี้, y เป็น 134514064 มี ดีก็เป็นเพียงบางค่าขยะ โปรแกรมของฉันจะใช้แรม เพื่อวัตถุประสงค์ที่แตกต่างกัน มีฟังก์ชั่นอื่น ๆ ที่เป็น คนอื่น ๆ เขียนในคอมพิวเตอร์ของฉัน ดังนั้นบิตเหล่านั้นได้ถูกนำมาใช้ ค่าอื่น ๆ และสิ่งที่ฉันเห็น เป็นเศษของบาง ก่อนการใช้งานหน่วยความจำที่ ดังนั้นไม่มีเรื่องใหญ่เพราะทันที ขณะที่ผมพิมพ์ต่อไปแล้วพิมพ์ Y, มันเริ่มต้นได้ที่ ค่าที่ฉันต้องการ ดังนั้นตอนนี้ขอไปข้างหน้าเร็วขึ้นเล็กน้อย ยังไม่มีการต่อไป ลองทำมันอีกครั้ง ลองทำมันอีกครั้ง แต่ฉันไม่ต้องการที่จะตี ได้ที่นี่เพราะถ้าฉัน ต้องการที่จะเห็นสิ่งที่เกิดขึ้นภายใน การแลกสิ่งที่เป็นคำสั่งหรือไม่ ผู้ชม: ขั้นตอน เดวิดเจลัน: ขั้นตอน ดังนั้นขั้นตอนนี้ฉันเป็น ฟังก์ชั่นมากกว่าที่มากกว่านั้น และตอนนี้มันเป็นความลับเล็ก ๆ น้อย ๆ ตรงไปตรงมา แต่นี้เป็นเพียงแค่ บอกฉันฉันอยู่ในสาย 33 ขณะนี้ และขอให้ทำเช่นนี้อีกครั้ง อุณหภูมิพิมพ์ ค่าขยะลบเวลานี้ แต่นั่นเป็นเพียงยังคงค่าขยะ ดังนั้นขอให้ทำต่อไปอุณหภูมิพิมพ์ มันเริ่มต้นได้ที่ 1 ซึ่ง คือค่าของ x อาคา ตอนนี้ที่เป็นของเราและ x มาจากไหน? ดีทราบในหลักของเรา เรียกว่าค่าเหล่านี้ x และ y จากนั้นเราจะผ่านพวกเขาที่จะแลกเปลี่ยนดังต่อไปนี้ X มาก่อนจุลภาคปี แล้วแลกเปลี่ยนสามารถเรียกพวกเขา x และ y แต่เพื่อความชัดเจนก็ เรียกพวกเขาและข แต่ A และ B อยู่ในขณะนี้จะเป็น สำเนาของ x และ y ตามลำดับ ดังนั้นถ้าผมกลับไป GDB ไปชั่วคราว เป็นหนึ่งและเป็นหนึ่ง แต่ถ้าผมทำต่อไปและตอนนี้ทำพิมพ์ , ได้ถูกย้ายไปแล้วกว่า นมที่ได้รับการเทลงไปในอดีต แก้วหรือในทางกลับกันน้ำผลไม้สีส้ม และถ้าผมทำต่อไปอีกครั้งและตอนนี้ ถ้าผมพิมพ์ออกมาในขณะที่การตรวจสอบสติ, ยังคงเป็นสอง แต่ขเป็นหนึ่ง ตรงไปตรงมาก็ยังคงมี ฉันไม่สนใจสิ่งที่อุณหภูมิเป็น แต่ทันทีที่ผมพิมพ์สมมุติว่า ดำเนินการต่อไปจะกลับไปตอนนี้ฉันในตอนท้าย โปรแกรม และโชคไม่ดีที่ x เป็น ยังคงเป็นหนึ่งและ y ยังคงสอง ดังนั้นสิ่งที่เป็นยูทิลิตี้ของ GDB มี? มันไม่ได้ช่วยแก้ไข ปัญหาต่อ se แต่ก็หวังว่าจะช่วยให้ฉัน เข้าใจได้โดยตระหนักถึง ว่าใช่ตรรกะของฉันที่ถูกต้อง แต่ รหัสของฉันไม่ได้ในท้ายที่สุดมี ผลกระทบอย่างถาวร นั่นคือปัญหาที่เรากำลัง ไปตอนนี้แก้วันนี้ แต่ขอให้ได้มีโดยวิธีการนี​​้ สตริงเป็นเรื่องโกหก มันเกินไปไม่ชนิดข้อมูล ที่มีอยู่ใน C. มัน เป็นคำพ้องความหมายสำหรับบางคน เวลาสำหรับสิ่งอื่น และเราสามารถที่จะเปิดเผยว่าดังนี้ ให้ฉันไปข้างหน้าและเปิดขึ้น โปรแกรมที่เรียกว่าเปรียบเทียบ-0 และมากกว่าการพิมพ์หนึ่งออกนี้ เราจะเริ่มต้นที่จะเดินผ่านรห​​ัส ฉันได้เขียน แต่ เป็นเพียงไม่กี่บรรทัด ดังนั้นนี่คือการเปรียบเทียบ-0 และสิ่งแรกที่ฉันทำ จะได้รับบรรทัดของข้อความ แต่สังเกตเห็นสิ่งที่ฉัน ทำครั้งแรก จะแตกต่างกันอย่างเห็นได้ชัดเกี่ยวกับสาย 21 คืออะไร? ที่จริงแล้วรอสักครู่ นี้เป็นสำเนาสอง ที่ไม่ได้แม้กระทั่งโปรแกรมที่เหมาะสม ขวาแจ้งเตือนสปอยเลอร์ทั้งหมด ขวาทั้งหมดดังนั้นจึงไม่ทราบว่า นั่นเป็นคำตอบให้กับคำถามในอนาคต นี่คือเปรียบเทียบ-0, และฉัน เกี่ยวกับการที่จะได้รับบรรทัดของข้อความ โปรแกรมที่ง่ายมาก ดังนั้นนี่คือตรงไปตรงมา นี้เป็นเหมือนสัปดาห์หนึ่งสิ่งที่สัปดาห์ที่สอง ในขณะนี้ สตริง s = GetString ตอนนี้ผมบอกว่ามันลงที่นี่อีกครั้ง สตริง t = GetString และแล้วสิ่งสุดท้ายที่อยู่ในนี้ โปรแกรมเป็นชื่อของมันบ่งบอก คือผมจะพยายามที่จะเปรียบเทียบพวกเขา ดังนั้นถ้าวินาที, สตริงแรก เท่ากับ = t แล้วฉัน จะบอกว่าคุณพิมพ์สิ่งเดียวกัน อื่นผมจะบอกว่า คุณพิมพ์สิ่งที่แตกต่าง จึงขอรวบรวมและเรียกใช้โปรแกรมนี้ เพื่อให้เปรียบเทียบเป็นศูนย์ ดูดี ไม่มีข้อผิดพลาดการรวบรวม ให้ฉันไปข้างหน้าขณะนี้ และพิมพ์ ./compare-0 ให้ฉันไปข้างหน้าและพูดอะไรบางอย่าง : Daven และบางสิ่งบางอย่างร็อบ และฉันพิมพ์สิ่งที่แตกต่าง เพื่อให้ห่างไกลที่ดีเพื่อให้ โปรแกรมที่ดูเหมือนว่าจะมีความถูกต้อง แต่ขอเรียกใช้อีกครั้ง พูดอะไรบางอย่าง: เกบ พูดอะไรบางอย่าง: เกบ ขวาทั้งหมด บางทีฉันอาจจะตีแถบพื้นที่ หรือสิ่งที่ขี้ขลาด ลองทำมันอีกครั้ง ดังนั้น Zamyla Zamyla สิ่งที่แตกต่าง ดังนั้นสิ่งที่เกิดขึ้น? ดังนั้นเราจึงมีทั้งสองสาย รหัส GetString ถูกเรียกว่าเป็นครั้งที่สอง และจากนั้นผมก็ พยายามที่จะเปรียบเทียบและเสื้อ แต่สิ่งที่จริงๆแล้วที่เกิดขึ้น? ดีเขียนด้วยลายมือของฉันเกี่ยวกับการที่ เนื้อตัวอย่างนี้บ้าง และขอให้จริงโยน นี้ขึ้นกว่าที่นี่เป็นอย่างดี ดังนั้นเราจึงมีสายเช่น สตริง s = GetString เพื่อให้เป็นเพียงแค่ครั้งแรก สายที่น่าสนใจจากโปรแกรมที่ แต่สิ่งที่ทุกเวลานี้ได้รับการ ที่เกิดขึ้นภายใต้กระโปรงหน้ารถหรือไม่ ดีที่ซ้ายมือด้านเป็นสตริง ซึ่งเป็นชนิดของตัวแปรบาง และก็เรียกว่าร้าน ดังนั้นผมรู้ว่านี่คือการใช้หน่วยความจำ หรือแรมในคอมพิวเตอร์ของฉันอย่างใด ดังนั้นฉันจะเป็นนามธรรม วาดที่เป็นรูปสี่เหลี่ยม 32 บิตก็จะเปิดออก แต่ เพิ่มเติมว่าในอนาคต และแล้วสิ่งที่เกิดขึ้นที่นี่? ดี GetString เห็นได้ชัด ได้รับสายจากผู้ใช้ และ GetString ได้ Zamyla หรือเกบหรือ Daven จึงขอเลือกแรก ของผู้ซึ่งเป็น Daven เพื่อให้มีประสิทธิภาพสิ่งที่ GetString ได้ ผมในกรณีแรกที่ D--V-E-n และแล้วสิ่งที่คนอื่นทำ มันให้ฉันแอบ? ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: ใช่ / 0 หรือ null ตัวอักษร ดังนั้นมันได้อย่างมีประสิทธิภาพให้ฉันสตริง แต่เรารู้อยู่แล้วว่าก่อนนี้ ดูเหมือนว่าสตริงเป็นเพียงอาร์เรย์ ของตัวละครและจะยกเลิกโดย ตัวอักษรแมวมองพิเศษนี้ / 0 แต่ถ้าเรื่องนี้เป็นความจริง และนี่คือตาราง, นี้เห็นได้ชัดว่ารูปสี่เหลี่ยมผืนผ้าขนาดใหญ่มาก และแน่นอนนี้คือ ฉันเรียกร้องเพียง 32 บิต และนี่คือชัดเจนกว่า 32 บิตเพราะนี่อาจจะเป็น แปดบวกแปดบวกแปด บวกแปดบวกแปด เพียงเพราะไบต์ใน ASCII วิธี heck เราจะไปพอดี Daven ลงในกล่องเล็ก ๆ น้อย ๆ ที่นี่? ดีสิ่งที่ GetString ทำจริง? ดีตารางที่นี่แสดงให้เห็นถึง หน่วยความจำของคอมพิวเตอร์ของฉันหรือแรม จึงขอพลบอกว่าถ้า แต่ละเหล่านี้แสดงให้เห็นถึงไบต์, แล้วเราสามารถคิดของแต่ละ ไบต์ที่มีที่อยู่ เช่น 33 Oxford Street, หรือ 34 Oxford Street หรือ 35 Oxford Street ดังนั้นเช่นเดียวกับบ้านที่มีที่อยู่ และอาคารที่มีอยู่ เพื่อทำแต่ละไบต์ของ หน่วยความจำมีที่อยู่หรือหมายเลข ที่ระบุตัวตนของพวกเขา ตอนนี้เป็นพล แต่การที่จะให้มันง่ายที่ฉันจะ ใช้เลขฐานสิบหกเพียงแค่การประชุม แต่ 0x หมายถึงอะไรอื่น ๆ กว่า "นี่คือเลขฐานสิบหก". และฉันจะอ้างว่า "D" จบลงด้วยการที่ Byte หนึ่งในความทรงจำ ผมไม่มีอะไรอื่นที่เกิดขึ้นใน หน่วยความจำเพื่อ Daven ได้จุดแรก Byte ที่หนึ่ง นี้นั้นเป็นไปได้ 0x2 นี้เป็นไป 0x3 นี้เป็นไปได้ 0x4 นี้เป็นไป 0x5 นี้เป็นไปได้ 0x6 แต่เมื่อคุณเริ่มคิด เกี่ยวกับสิ่งที่กระทำของคอมพิวเตอร์ ภายใต้กระโปรงหน้ารถ คุณสามารถเริ่มต้นเพื่อสรุป วิธีการที่คุณบางปีที่ผ่านมาก็จะ ได้ดำเนินการ C ตัวเอง เป็น GetString อาจเป็นสิ่งที่ returning-- เพราะมัน รู้สึกเหมือนมันไม่ กลับ Daven ต่อ se เพราะเขาก็ไม่ได้ไป ให้พอดีกับ box-- เล็ก ๆ นี้ ดังนั้นสิ่งที่ GetString อาจกลับมา? ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: สถานที่ตั้งของ Daven และจะได้รับการทำเช่นนี้ นับตั้งแต่สัปดาห์หนึ่ง สิ่งที่ GetString เป็นจริง กลับไม่ได้รับสายต่อ se นั่นเป็นหนึ่งในคำโกหกสีขาวเล็ก ๆ น้อย ๆ ก็กลับมาที่อยู่ของ สตริงในหน่วยความจำที่อยู่ไม่ซ้ำกัน Daven อาศัยอยู่ที่ 33 Oxford Street แต่ชัดถ้อยชัดคำ, กาวินมีชีวิตอยู่ ที่ 0x1, ที่อยู่หมายเลขหนึ่ง ดังนั้นสิ่งที่ได้รับอยู่ในนี้ กล่องเล็ก ๆ นั้นจะมีความชัดเจน เป็นเพียงที่อยู่ของสตริงที่ ดังนั้นตลอดเวลานี้นี้ ได้รับไปเมื่อวันที่ แต่สิ่งที่นี้คำว่า ขณะนี้คือว่าถ้าทุก s มี คือหมายเลขภายในของมันที่เป็น ที่จะหยุดคุณ, โปรแกรมเมอร์ จากการวางตัวเลขใด ๆ ใน ใด ๆ ตัวแปรและเพียงแค่กระโดด ที่จะรับรู้ของหน่วยความจำที่? และแน่นอนเราจะได้เห็น ที่เป็นภัยคุกคามในครั้งต่อไป แต่ตอนนี้รู้สึกไม่เพียงพอ ถ้าผมบอกว่าได้รับฉัน สตริงคุณให้ฉัน Daven แต่คุณไม่ได้จริงๆให้ฉัน Daven สิ่งที่คุณให้ฉันเป็นอยู่ Daven ของ ฉันจะแล้วทราบว่า ที่ Daven เริ่มต้นและ ends-- เรื่องราวของการ weird-- Daven ที่เริ่มต้นและสิ้นสุด และจากนั้นต่อไป สตริงในหน่วยความจำเริ่มต้น? ดีถ้าคุณกำลังส่ง ฉันเริ่มต้นของ Daven, เป็นหลักวิธีทำฉันรู้ว่า ที่ส่วนท้ายของชื่อของเขาคืออะไร? ที่ null อักขระพิเศษซึ่ง คือสิ่งที่สำคัญมากในขณะนี้ ถ้าสายใต้ เครื่องดูดควันจะมีการระบุเพียง โดยเฉพาะสถานที่ตั้งของพวกเขาในความทรงจำ ดังนั้นตลอดเวลาที่ สิ่งที่ได้เกิดขึ้น ดังนั้นเมื่อเรามองแล้ววันนี้ที่ รหัสที่นี่อธิบาย ถ้าคุณจะผิดพลาดในบรรทัดที่ 26 ทำไม Zamyla และ Zamyla แตกต่างกันอย่างไร ทำไมเกบเกบและแตกต่างกันอย่างไร ใช่ในด้านหลัง ผู้ชม: พวกเขามีที่อยู่ที่แตกต่างกัน เดวิดเจลัน: เพียงเพราะ พวกเขามีที่อยู่ที่แตกต่างกัน เพราะเมื่อคุณเรียก GetString อีกครั้งที่ฉันจะทำอย่างรวดเร็วที่นี่ ถ้าเป็นสายเส้นที่สอง เสื้อที่ผมทำในโปรแกรมที่ เท่ากับการเรียก GetString อื่น ในครั้งต่อไปที่ผมเรียกว่า GetString ฉันจะ ที่จะได้รับเป็นก้อนที่แตกต่างกันของหน่วยความจำ GetString ที่ได้รับอนุญาต ที่จะขอให้การดำเนินงานของ ระบบสำหรับหน่วยความจำมากขึ้น มันจะไม่นำมาใช้เหมือนกัน หกไบต์ทุกครั้งเดียว มันจะได้รับใหม่ ก้อนของหน่วยความจำที่ หมายความว่าทีเป็นไปได้ บางค่าอื่น ๆ กว่าที่นี่ ดังนั้นเมื่อฉันทำเท่ากับ = ทีคุณไม่ได้เปรียบเทียบ D ต่อนี้และต่อต้าน นี้และ V ต่อนี้ คุณกำลังเปรียบเทียบนี้ ต่อนี้ซึ่ง ตรงไปตรงมาเป็น useless-- useful-- สวย จะไม่ได้ผลสวยเพราะที่จริง ใส่ใจที่สตริงที่อยู่ในหน่วยความจำ? และแน่นอนเราไม่ได้ และเราไม่ได้ไป เริ่มต้นการดูแลโดยเฉพาะอย่างยิ่ง เพียงเท่าที่ข้อผิดพลาดสามารถเกิดขึ้น และภัยคุกคามความปลอดภัยที่อาจเกิดขึ้นจะ เราจะเริ่มต้นในการดูแลเกี่ยวกับเรื่องนี้ ดังนั้นเรามาแก้ไขปัญหานี้ จะเปิดออกคุณแก้ไขได้สุดเพียง และขอให้จริงก่อนที่ผมจะ เผยให้เห็นว่าอีกสิ่งที่จะ คุณจะทำอย่างไรถ้าในชั้นเรียน CS50, และคุณจะต้องดำเนินการ เปรียบเทียบกับสองสาย คุณชัดเจนก็ไม่สามารถใช้ S = t เท่ากับ แต่มีเหตุผลว่า คุณจะเปรียบเทียบสายนี้ กับสตริงโดยใช้รหัส C นี้ ใช่ ผู้ชม: เพ​​ียงแค่ทำ สำหรับวง [ไม่ได้ยิน] เดวิดเจลัน: ที่สมบูรณ์แบบ ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: ใช่ เพียงแค่ใช้การวนหรือ ในขณะที่ห่วงหรืออะไรก็ตาม แต่เพียงแค่ใช้ความคิดพื้นฐานที่ว่า นี้เป็นก้อนของหน่วยความจำหรืออาเรย์ และนี่คือย้ำกว่า ทั้งในเวลาเดียวกัน และเพียงแค่เปรียบเทียบตัวอักษร และคุณได้มีที่จะเป็น ระวัง ๆ หน่อย ๆ เพราะคุณ ไม่ต้องการหนึ่งนิ้ว ไปที่ผ่านมาอื่น ๆ เพราะสตริงหนึ่ง นานกว่าที่อื่น ๆ ดังนั้นคุณจะต้องการตรวจสอบ ราคาพิเศษนี้ในตอนท้าย null แต่มันคือเรื่องจริงใน จบง่ายเหมือนที่ และตรงไปตรงมาเราไม่จำเป็นต้อง ที่จะบูรณาการล้อ นี่คือรุ่นสอง และสิ่งที่ผมกำลังจะบอกว่าที่นี่เป็นที่ แทนการเปรียบเทียบเท่ากับ S = t, ฉันแทนจะบอกว่าถ้าสตริง เปรียบเทียบเครื่องหมายจุลภาค s เสื้อเท่ากับ = 0 ตอนนี้สิ่งที่เป็นสตริงเปรียบเทียบ? มันจะเปิดออกมันเป็นหน้าที่ที่ มาพร้อมกับ C ซึ่งมีจุดมุ่งหมายในชีวิต คือการเปรียบเทียบสองสาย และคนเปรียบเทียบว่าถ้าเราอ่านของ หน้าคนหรือเอกสารหรือ CS50 อ้างอิงก็จะ เพียงแค่บอกคุณคนที่ เปรียบเทียบผลตอบแทนทั้งในทางลบ ตัวเลขหรือจำนวนบวกหรือศูนย์ ที่ศูนย์หมายถึงพวกเขากำลังเท่ากับ ดังนั้นเพียงแค่การคาดเดา สิ่งที่มันอาจหมายถึงถ้า ผัดผลตอบแทนเ​​ปรียบเทียบ ค่าลบหรือค่าบวก? ผู้ชม: มากกว่าหรือน้อยกว่า เดวิดเจลัน: ใช่ มากกว่าหรือน้อยกว่า ดังนั้นถ้าคุณต้องการที่จะเรียงลำดับทั้ง พวงของสตริงใน dictionary-- ในขณะที่เราจะลงในที่สุด road-- ฟังก์ชั่นที่สมบูรณ์แบบที่จะใช้อาจ เพราะมันจะทำอย่างนั้น การเปรียบเทียบสตริงสำหรับคุณและบอก คุณไม่ได้มาก่อนที่จะขหรือไม่ ขมาก่อนตามลำดับตัวอักษร เราสามารถทำตรงนั้น และแจ้งให้ทราบผมอีกคนหนึ่ง สิ่งที่อยู่ในตัวอย่างนี้ อะไรที่มีการเปลี่ยนแปลงสูง ขึ้นมาในหน้าที่หลักนี้ char * และนี่คือที่โกหกสีขาวอื่น ๆ ตลอดเวลานี้เมื่อคุณได้ รับการเขียนสตริง เราได้รับการแอบเขียนใหม่ สตริงเป็น char * เพื่อให้เสียงดังกราวจริงว่า เข้าใจคุณ ในคำอื่น ๆ ใน CS50.h และในที่สุดเราก็จะเห็น เราทำสตริงคำพ้องความหมายที่เรียกว่า นั่นคือสิ่งเดียวกับ char * และสำหรับตอนนี้รู้เพียงว่า * ในบริบทนี้อย่างน้อย หมายถึงที่อยู่ ที่อยู่ของอะไร ดีความจริงที่ว่าผมพูด char * และไม่ int * หรือลอย * หมายความว่า char * เป็น ที่อยู่ของถ่าน ดังนั้นกล่องเล็ก ๆ นี้ที่นี่อาคา สตริงเป็นจริงชนิด char *, ซึ่งเป็นเพียงวิธีแฟนซีของบอกว่า ในกล่องนี้จะไปอยู่ และสิ่งที่ไม่อยู่ที่อ้างถึง? เห็นได้ชัดว่าถ่าน แต่ที่เราจะทำได้อย่างแน่นอน มี int * และสิ่งอื่น ๆ แต่ตอนนี้ char * เป็นจริงมากที่สุด ตรงไปตรงมาและเป็นหนึ่งที่น่าสนใจ ดังนั้นปัญหานี้จะ จะเพิ่มขึ้น แต่อีกครั้ง สมมติว่าผมเปิดโปรแกรมนี้ ลองดูว่าตอนนี้เราสามารถคาดการณ์ ว่ามีอะไรผิดปกติกับรหัสนี้ ดังนั้นในโปรแกรมนี้คัดลอก 0 ฉัน จะไปข้างหน้าและอีกครั้งเรียก GetString และจัดเก็บค่าในนั้น แล้วทำไมฉันถึงทำเช่นนี้ เช่นเดียวกับที่เตือนความทรงจำจากสัปดาห์ที่ผ่านมาหรือไม่ เราได้พูด GetString ที่ บางครั้งกลับเป็นโมฆะ มันหมายความว่าอะไรถ้า GetString กลับ null? สิ่งที่ผิดพลาด มันอาจหมายถึงสายเกินไป ขนาดใหญ่ออกจากคอมพิวเตอร์ของหน่วยความจำ มันเกิดขึ้นซุปเปอร์ซุปเปอร์ซุปเปอร์ ไม่ค่อย แต่มันจะเกิดขึ้น เราต้องการที่จะตรวจสอบมัน และนั่นคือทั้งหมดที่เรากำลังทำ เพราะเราจะเห็นตอนนี้ถ้าคุณทำไม่ได้ เริ่มต้นการตรวจสอบเป็นประจำสำหรับสิ่งที่ เช่น null คุณอาจ จะเริ่มต้นที่จะไป ไปยังที่อยู่ในหน่วยความจำที่ไม่ถูกต้อง และคุณกำลังจะเริ่มต้นก่อให้เกิด มากขึ้นความผิดพลาดของการแบ่งส่วน หรือใน Mac หรือ PC เพียง ทำให้คอมพิวเตอร์ที่จะแขวน หรือโปรแกรมที่จะแช่แข็งอาจ ดังนั้นตอนนี้ฉันเรียกร้องในสำเนา 0.c ที่ฉัน กำลังจะไปคัดลอกสตริงเหล่านี้โดยวิธีการ ของสาย 28 แล้วฉันจะ เพื่อเรียกร้องที่ด้านล่าง ที่นี่ที่ฉันจะ ที่จะเปลี่ยนหนึ่งของพวกเขา เพื่อแจ้งให้ทราบนี้ ฉันโทร strlen เพื่อนเก่าของเรา และเพียงแค่อธิบายในภาษาอังกฤษ สิ่งที่บรรทัดนี้ 34 จะทำ? ไม่สิ่งที่เสื้อวงเล็บ 0 เป็นตัวแทนของทางด้านซ้าย ใช่ ผู้ชม: ตัวอักษรแรกของ t? เดวิดเจลัน: ตัวอักษรแรกของ t นั่นแหล่ะ ตัวอักษรตัวแรกของ t, ฉันต้องการ ที่จะกำหนดให้เป็นรุ่นที่เป็นตัวพิมพ์ใหญ่ ของตัวละครครั้งแรกในเสื้อ ดังนั้นนี้จะพะวง ตัวอักษรตัวแรก และแล้วสิ่งสุดท้ายที่ฉันทำมาก ในโปรแกรมนี้คือผมเรียกร้องที่นี่ เดิม, S, และนี่คือสำเนาที แต่ขึ้นอยู่กับเรื่องที่เราเพิ่ง บอกเกี่ยวกับสิ่งที่สตริงเป็นจริง สิ่งที่เป็นสาย 28 จริงๆ ทำและสิ่งที่เป็น ข้อผิดพลาดที่เกิดขึ้นไป จะต้องอยู่บนหน้าจอหรือไม่ ดังนั้นก่อนที่คำถามแรก, 28 สิ่งที่เป็นสตริง t = จริงๆทำอะไร ถ้าเรามีอยู่ในซ้ายมือ ด้านที่นี่สตริง t = วินาที; ที่ให้ฉันกล่องหนึ่ง ที่นี่และกล่องหนึ่งที่นี่ และคิดว่าที่อยู่นี้เป็น 0x, สมมุติว่า 50 เวลานี้พล สิ่งที่ไม่สตริง t = S ทำภายใต้กระโปรงหน้ารถหรือไม่ ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: มันเก็บความทรงจำ อยู่ที่นั่นเพื่อ 0x50 ไปที่นั่น ดังนั้นถ้าตอนนี้ผมไปครั้งแรก ตัวละครในเสื้อและตัวพิมพ์ใหญ่มัน สิ่งที่ฉันทำเพื่อได้อย่างมีประสิทธิภาพหรือไม่ ฉันจริงๆทำในสิ่งเดียวกันใช่มั้ย? เพราะถ้าอยู่ 0x50-- และเพียงแค่ฉัน ไม่ได้มีห้องพักมากในคณะกรรมการที่นี่ แต่คิดว่านี้จะ 0x50 ลงที่นี่ ที่ไหนสักแห่งในหน่วยความจำของคอมพิวเตอร์ของฉัน และฉันได้เช่นเกบ ในตัวพิมพ์เล็กที่นี่เช่นนี้ และฉันได้กล่าวว่าเสื้อวงเล็บ 0 ได้รับทุน ดีทีวงเล็บ 0 เป็น ตัวอักษรตัวแรกในเ ดังนั้นกรัมเล็ก ๆ น้อย ๆ ที่เป็นไป กลายเป็น G. ใหญ่ แต่ปัญหา เป็นสิ่งที่ไม่ยังชี้ไปที่? ผู้ชม: เดียวกัน เดวิดเจลัน: สิ่งที่แน่นอนเดียวกัน ดังนั้นคำอธิบายง่ายๆบางที แม้ว่าไวยากรณ์แปลกเล็กน้อย ดังนั้นขอให้ทำเช่นนี้ ทำสำเนา-0 แล้ว ./copy-0 พูดอะไรบางอย่าง: เกบ และโชคไม่ดีที่ทั้งสอง พวกเขาได้รับตอนนี้พิมพ์ใหญ่ แต่การที่อยู่ภายใต้ เหตุผลที่เรากำลังเพียง ขณะนี้การซื้อขายที่มีที่อยู่ ดังนั้นเราจะเริ่มต้นในการ address-- ไม่มีเล่นสำนวน intended-- ทำอย่างไรเราจะเริ่มต้นไปยังที่อยู่ โดยเฉพาะอย่างยิ่งปัญหานี้ได้อย่างไร ทั้งใน copy1.c, สิ่งที่กำลังจะ ที่จะได้รับเพียงเล็กน้อยที่ซับซ้อนมากขึ้น แต่ฉันอยากจะเรียกร้อง วิธีง่ายๆแนวคิด จึงยากที่จะได้รับได้อย่างรวดเร็วก่อน ไม่ได้จะเป็นเรื่องง่ายสำหรับครั้งแรก ทุกครั้งที่คุณพิมพ์มันออกมาบางที แต่ถ้าปัญหาคือว่า เพียงแค่ทำ t = แค่ สำเนาที่อยู่อะไร อีกครั้งถ้าฉันสามารถรับกับคุณ เป็นไปได้ที่จะแก้ปัญหา สำหรับการคัดลอกสตริงจริงหรือไม่ ผู้ชม: เราอาจจะ ใช้วงอีกครั้ง เดวิดเจลัน: ใช่ ดังนั้นเราจะต้องห่วงอีกครั้ง และเพราะถ้าเราต้องการที่จะคัดลอก S สตริงเป็นสตริงอื่น เราอาจต้องการที่จะทำ ตัวอักษรตัวอักษร แต่ปัญหาคือถ้า นี้เป็นครั้งแรกวินาที, ตอนนี้เราต้องเริ่มต้นอย่างชัดเจน จัดสรรหน่วยความจำสำหรับ t ในคำอื่น ๆ ให้ วาดนี้เป็นครั้งสุดท้าย ในกรณีนี้คือสตริง s = GetString และขอนำนี้ขึ้นที่นี่เช่นกัน นี้เป็น GetString และแล้วภาพบางอย่าง เช่นเดียวกับที่เป็นไปได้เช่นเดิม G--b-e-/ 0 ที่มีลักษณะบางสิ่งบางอย่างเล็ก ๆ น้อย ๆ เช่นนี้ และ S ดังนั้นเราจึงเรียกสิ่งนี้ 0x50, และนั่นจะเป็น 51, 52 ดังนั้นนี่คือ 0x50 แล้วฉันจะสตริงที ในหน่วยความจำที่แค่ไป ให้ฉันตารางเล็ก ๆ น้อย ๆ เช่นนี้ ดังนั้นสิ่งที่เป็นขั้นตอนสำคัญตอนนี้หรือไม่ ถ้าผมต้องการที่จะคัดลอกลงในเสื้อของสิ่งที่ เราไม่ว่างต้องกรอกที่นี่? หรือเราทำในสิ่งที่จำเป็นต้อง ทำในระดับสูงหรือไม่ ใช่? ใครบางคน? ใช่ ผู้ชม: เราต้องไปที่ [ไม่ได้ยิน] เดวิดเจลัน: ใช่เรา จำเป็นต้องกรอกในช่องว่างนี้ ฉันไม่สามารถคัดลอกและ ประโยชน์ชื่อเกบ จนกว่าฉันจะขอให้ระบบปฏิบัติการ สำหรับก้อนของหน่วยความจำอื่น ที่อย่างน้อยเป็นใหญ่เป็นต้นฉบับ เพื่อที่จะทำให้เรามีคำถาม ฉันขอให้ระบบปฏิบัติการวิธีที่จะไม่ เพียงเพื่อ pointer-- น้อยง่าย เช่นนี้จะเรียกว่า อยู่ pointer-- ไม่ สำหรับกล่องเล็ก ๆ ง่ายๆ เช่นนี้เรียกว่าสตริง? ฉันจะขอให้การดำเนินงานของ ระบบสำหรับก้อนใหญ่ของหน่วยความจำ? ป่านนี้ผมเคยเพียงหลังที่ ทางอ้อมโดยการเรียก GetString ดังนั้นวิธีที่จะ GetString แม้จะได้รับหน่วยความจำของมัน ดีก็ปรากฎว่ามี ฟังก์ชั่นอื่น ๆ ที่นี่ ว่าตอนนี้เราจะเริ่มต้นที่จะใช้ ตอนนี้ดู than-- วิธีลับมากขึ้น และผมเป็นคนเดียวที่สามารถมองเห็นได้พูดไป บรรทัดนี้มีลักษณะวิธีการที่เป็นความลับมากขึ้น แล้วมันควรจะเป็นได้อย่างรวดเร็วก่อน แต่ขอแซวมันนอกเหนือ อยู่ทางด้านซ้ายมือผมมีถ่าน * t ดังนั้นในภาษาอังกฤษขอเริ่มต้นที่จะกำหนด ประโยคที่เหมาะสมในศัพท์แสงทางเทคนิค ดังนั้นนี่คือการจัดสรร ตัวแปรประเภท char * เรียกว่าเสื้อ ตอนนี้สิ่งที่ไม่ว่าจริงๆหมายถึงอะไร ดีนั่นหมายความว่าสิ่งที่ฉันจะ ที่จะใส่ในตัวแปรที่เรียกว่าเสื้อนี้ ที่อยู่ของถ่าน เพื่อให้เป็นเพียงเรียบง่าย วิธีการที่เหมาะสมมากขึ้น การอธิบายด้านซ้ายมือ เพื่อที่จะสร้างช่องนี้ที่นี่เท่านั้น ดังนั้นทางด้านขวามือ น่าจะเป็นไป การจัดสรรที่ใหญ่กว่า ก้อนของหน่วยความจำได้อย่างไร จึงขอแซวนี้นอกเหนือ มันครอบงำได้อย่างรวดเร็วก่อน แต่สิ่งที่เกิดขึ้นภายในที่นี่? ครั้งแรกที่มี malloc ซึ่ง เห็นได้ชัดว่าเพื่อนใหม่ของเรา "ความทรงจำจัดสรร". ดังนั้นนี่คือเหตุผลที่ถูกส่ง เป็นมันจึงเป็นเรื่องใหญ่สวย จึงขอแซวนี้นอกเหนือ strlen ของวินาที, แน่นอนหมายถึงการยกกำลัง ผู้ชม: จำนวนตัวอักษร เดวิดเจลัน: เพียงแค่ จำนวนตัวอักษรในร้าน ดังนั้นความยาวของ S, สายเดิม ดังนั้น G--b-E ดังนั้นมันอาจจะเป็นสี่ในกรณีนี้ ทำไมฉันทำ 1 หลังจากที่ เรียก strlen ของหรือไม่ ผู้ชม: [ไม่ได้ยิน] เดวิดเจลัน: สำหรับที่ อักขระ null พิเศษ หากคุณถามฉันสิ่งที่ความยาวของ ชื่อเกบของฉันกำลังจะบอกว่าสี่ ภายใต้กระโปรงหน้ารถ แต่ฉันต้องการ ที่ไบต์ห้าอักขระ null เพื่อที่ว่าทำไมฉันทำ 1 ขณะนี้เป็นเพียงในกรณีที่คุณกำลังทำงานอยู่นี้ โปรแกรมบนคอมพิวเตอร์เครื่องอื่น ๆ กว่าหนึ่งพูดว่า เครื่องใช้ CS50, ที่ขนาดของถ่าน อาจจะมีที่แตกต่างกัน จาก computer-- ของตัวเอง ปรากฎว่าฉันสามารถเรียกสิ่งนี้ว่า sizeof ผู้ประกอบการเพียงขอเครื่องคอมพิวเตอร์ สิ่งที่เป็นขนาดของ ถ่านในคอมพิวเตอร์เครื่องนี้? และโดยการคูณห้านี้ เช่นโดยขนาดของถ่านซึ่ง บนเครื่องคอมพิวเตอร์ส่วนใหญ่จะ เพียงแค่เป็นหนึ่ง malloc จะจัดสรรสำหรับฉันใหญ่นี้ ก้อนของหน่วยความจำมากกว่าที่นี่ด้านขวา และมันจะ return-- มันเป็นฟังก์ชันดังนั้นจึงเป็น จะกลับมาหาเราอะไร ผู้ชม: ที่อยู่? เดวิดเจลัน: ที่อยู่ของสิ่งที่? ผู้ชม: หน่วยความจำของมันกำหนดหรือไม่? เดวิดเจลัน: ของ หน่วยความจำมันได้รับการจัดสรร ดังนั้นผมจึงมีความคิดที่ไม่ตรงไปตรงมา ที่นี้จะจบลง ฉันจะเสนอว่า มันจะจบลงที่ 0x88 สมบูรณ์โดยพลการ แต่ ที่อื่นนอกเหนือจาก 0x50, เนื่องจากระบบปฏิบัติการอะไร Windows และ Mac OS ทำเพื่อฉันเป็น ตรวจสอบให้แน่ใจว่ามันให้ ฉันชิ้นที่แตกต่างกันของแรม ดังนั้นนี่คือมูลค่าที่นี้ ก้อนของหน่วยความจำอาจจะจบลง ดังนั้นนี่คือสิ่งที่จะสิ้นสุดลงในที่นี่ 0x88 ดังนั้นตอนนี้เห็นได้ชัดว่าผมสามารถเข้าใจ ที่นี้ไม่ได้เช่นเดียวกับที่นี้ เพราะพวกเขากำลังชี้ไปที่ ชิ้นที่แตกต่างกันของหน่วยความจำ ดังนั้นถ้าตอนนี้ผมอยากที่จะคัดลอกนี้ ในขอทำโซลูชั่นที่นำเสนอของคุณ ขอเพียงไปสร้างสำหรับห่วง และทำทีวงเล็บผมได้รับของตัวฉัน เพราะตอนนี้ฉันสามารถใช้ สัญกรณ์อาร์เรย์เช่นนี้ เพราะแม้ว่า malloc มาก โดยทั่วไปฉันจัดสรรหน่วยความจำ หน่วยความจำเป็นเพียงไบต์ที่อยู่ติดกัน ไบต์ไบต์ไบต์หลังการสำรองข้อมูล แน่นอนฉันสามารถเป็นโปรแกรมเมอร์ รักษามันเป็นอาเรย์ซึ่ง หมายถึงการที่ฉันสามารถใช้นี้คุ้นเคยที่สุด สัญกรณ์ของเพียงบางส่วนวงเล็บ เพื่อให้ฉันหยุดที่นั่นเพราะ นี้เป็นจำนวนมากทั้งหมดในครั้งเดียวได้ แม้ว่าความคิดพื้นฐานในการปะยางรถ เป็นสตริงที่ทุกเวลานี้ ไม่ได้ชนิดข้อมูลใหม่ต่อ มันเป็นเพียงตัวชี้ที่เรียกว่า ที่อยู่ของตัวละคร, ซึ่งก็หมายความว่ามันเป็นจำนวนมาก ว่าด้วยการประชุมของมนุษย์ เรามักจะเขียนเป็นสิ่งที่ 0x แต่มันก็เป็นเพียงแค่ตัวเลข เช่น 33 Oxford Street, ที่เกิดขึ้นเป็น ที่อยู่ของอาคาร CS คำถามใด ๆ เกี่ยวกับรายละเอียดเหล่านี้หรือไม่ ใช่? ผู้ชม: ทำไมเราตรวจสอบ สำหรับ t เท่ากับโมฆะ? เดวิดเจลัน: ทำไมเรา ตรวจสอบสำหรับ t เท่ากับโมฆะ? ถ้าเราอ่าน documentation-- คำถามที่ดีสำหรับ malloc, มันจะบอกว่าในการพิมพ์ที่ดี บางครั้งอาจ malloc กลับโมฆะ เช่นเดียว GetString และแน่นอน GetString กลับ null ถ้าในทางกลับกัน malloc กลับโมฆะ เพราะ GetString ใช้ malloc และที่อาจเกิดขึ้นได้หากระบบปฏิบัติการ Mac OS, Windows และสิ่งที่เป็นเพียง ออกจากหน่วยความจำสำหรับคุณ ดังนั้นนั่นคือสิ่งที่เกิดขึ้นที่นั่น และแจ้งให้เราแสดงให้เห็นถึงสิ่งที่อีกคนหนึ่ง ที่เพิ่งจะพัดใจของคุณ หรือสมบูรณ์จะไกลเกินไปกว่าเส้น แต่ให้ฉันดึงขึ้น เดียวกันสำหรับห่วงสำหรับการคัดลอก ซึ่งช่วงเวลาที่ผ่านมาการเรียกคืนเป็น นี้ เสื้อตัวผมได้รับของตัวฉัน อย่างมีความสุขและใช้งานง่าย รู้สึกเหมือนสัปดาห์ที่สองอีกครั้ง แต่รุ่นนี้สามารถจริงจะ เขียนเช่นนี้ซึ่งมีลักษณะที่เป็นความลับ มันเป็นตัวชี้เทคนิคที่เรียกว่า เลขคณิตเลขคณิตที่อยู่ แต่ทำไมไม่ทำงานนี้ ตอนนี้น่ารำคาญ, ผู้เขียนของซีตัดสินใจที่จะใช้ สัญลักษณ์ * เพื่อวัตถุประสงค์ที่แตกต่างกัน เราได้เห็นมันเคยใช้อยู่แล้ว char * ซึ่งหมายความว่า "ให้ฉันตัวแปร ที่จะมี ที่อยู่ของถ่าน ". * เพื่อให้ถ่านในบริบทที่ หมายถึง "ให้ฉันตัวแปร". แต่ถ้าคุณใช้ * โดยไม่ต้อง คำในหน้านั้นเช่นถ่าน, ก็เรียกว่าตอนนี้ ผู้ประกอบการ dereference และเราจะเห็นมากกว่านี้ก่อนที่จะยาว แต่ก็หมายความว่า "ไปที่นั่น". มันก็เหมือนกับการบอกว่าถ้ามีคนมือฉัน บนแผ่นกระดาษ "33 Oxford Street" ถ้าฉันทำ "* 33 Oxford Street" ที่หมายถึง "ไปลงที่ถนนไปที่อาคาร CS". ดังนั้น * หมายถึงเพียงแค่ไปที่นั่นถ้า มีคำในหน้าของมันไม่มี ดังนั้นสิ่งที่เป็นเสื้อที่มีความชัดเจน? เสื้อเป็นที่อยู่ของก้อน หน่วยความจำที่ได้รับกลับมาให้ฉัน คือที่อยู่ของสิ่งที่จะเป็นที่ชัดเจน ในตัวอย่างที่เราได้พูดกันมา ของเกบตัวพิมพ์เล็ก? คือที่อยู่เเล้ ผู้ชม: สตริง เดวิดเจลัน: ชื่อเดิมของเกบ ดังนั้นจึงเป็นที่อยู่ของ ก้อนของหน่วยความจำนี้ ดังนั้นถ้าผมบอกว่า t + i-- i, แจ้งให้ทราบล่วงหน้า เป็นเพียงเพื่อนเก่าของเรา มันเป็นเพียงตัวแปรดัชนี ที่ทำซ้ำจากศูนย์ขึ้น ความยาวของสตริง s ดังนั้นมันจะเป็นศูนย์แล้วหนึ่ง แล้วสองแล้วสามแล้วสี่ จึงขอรวบรวมเหล่านี้ใหม่ รอยขีดข่วนเช่นชิ้นส่วนปริศนา, ถ้าคุณจะ แม้ว่าอีกครั้งไวยากรณ์ อยู่ไกลมากขึ้นกว่าที่เป็นความลับรอยขีดข่วน ดังนั้นเสื้อที่อยู่ + ฉันจะให้ฉัน จำนวนเพราะเหล่านี้ทั้งหมด ตัวเลขที่เราได้รับการวาดภาพเป็นฐานสิบหก แต่พวกเขากำลังเพียงตัวเลข ดังนั้นหากที่อยู่ของ t ที่เรากล่าวว่า 0x88 เป็นสิ่งที่ 0x88 บวกศูนย์ แม้ว่าคุณจะไม่สบาย กับฐานสิบหกยังใช้การคาดเดา ผู้ชม: เดิม เดวิดเจลัน: ยัง 0x88 ดังนั้นสิ่งที่จะ * 0x88 หมายถึงอะไร มันหมายถึง "ไปที่นั่น" ซึ่งหมายความว่า ได้อย่างมีประสิทธิภาพ "วางนิ้วของคุณที่นี่". และตอนนี้อยู่ทางด้านขวามือของ การแสดงออกนี้ * แล้วใน parens, s + ฉันหมายถึงวินาที, ซึ่งเป็น อยู่ที่นี่ของกรัมน้อย s + 0 แน่นอน, s, สิ่งที่คือ ดังนั้นตอนนี้มัน * s ซึ่งเช่นเดียว * 33 Oxford Street หมายความว่าไปที่ที่อยู่ S ดังนั้นนี่คือนิ้วขวามือ ดังนั้นสิ่งที่ฉันจะคัดลอกลงในอะไร สิ่งที่อยู่ด้านขวาซึ่งเป็น เกบ, กเล็ก ๆ น้อย ๆ ที่นี่เป็นที่นี่ และเพื่อให้ผลของการที่ ย้ำแรกของวง ตามที่คุณเสนอแม้ว่ามันจะมีลักษณะ บ้าซับซ้อนมากขึ้นกว่าสิ่งใด ที่เราเคยเห็นมาก่อนเป็นเพียงการบอกว่า ไปที่นี่และคัดลอกตัวอักษรที่นี่ มันให้คุณมีแผนที่ไปยังสถานที่ทั้ง และเราจะเห็นไกลมากกว่านี้ แต่ตอนนี้ความหวังเป็นเพียงการ แนะนำบางส่วนของความคิดพื้นฐานเหล่านี้ และแน่นอนให้ดูที่ หนึ่งโปรแกรมสุดท้ายที่นี่ แล้ว claymation สัญญา ซึ่งจะทำให้ทุกอย่างถูกต้องทั้งหมด ขวาทั้งหมด เพื่อให้ฉันเปิด up-- มีเราไป เพื่อให้ me-- เราจะกลับมา ภาพนี้ไม่นาน ผมขอเปิดตัวอย่างสุดท้ายที่นี่ ดังนั้นนี่คือซุปเปอร์ซุปเปอร์ โปรแกรมที่สำเร็จ ไม่มีอะไรในชีวิตที่ไม่ต่อไปนี้ มันเป็นครั้งแรกประกาศสองตัวแปร x และ y ที่ไม่ได้ตัวเลขเวลานี้ ต่อ พวกเขาไม่ได้จำนวนเต็มต่อ พวกเขาจะเห็นได้ชัด int * ดังนั้นเพียงแค่ใครสิ่งที่ไม่ได้หมายถึง ถ้าชนิดข้อมูลของตัวแปรของคุณ เป็นประเภท int * ดาว? นั่นเป็นที่อยู่ของ int ดังนั้นผมจึงได้ความคิดที่มันเป็นยัง มันก็หมายถึงการ "ใส่ในที่สุด ที่อยู่ของ int ที่นี่ ". 0x50, 0x88, ที่ใดก็ตามที่มันมีอยู่ใน หน่วยความจำที่อยู่ที่จะมี และนั่นคือสิ่งที่เป็นปี ไปได้เป็นอย่างดี ถ้าตอนนี้ผมบอกว่า x = malloc (sizeof (int)) นี้เป็นวิธีที่จินตนาการของบอกว่า เฮ้ระบบปฏิบัติการผ่าน malloc, ให้ฉันหน่วยความจำเพียงพอสำหรับขนาด ของ int ซึ่งอาจเป็น จะเป็น 32 บิตหรือสี่ไบต์ ดังนั้นสิ่งที่จะ malloc กลับ? malloc กลับที่อยู่ ดังนั้นสิ่งที่จะได้รับการจัดเก็บไว้ใน x? ที่อยู่ของก้อน หน่วยความจำสี่ไบต์ malloc ที่ พบเพียงสำหรับฉันโดยขอให้ ระบบปฏิบัติการ ตอนนี้ขณะที่สาย สี่นี่ * x = 42 เพียงเพื่อจะชัดเจน สิ่งที่เกิดขึ้นลงไปที่นั่น? ที่ด้านซ้ายมือ * x ที่เหมือน * 33 Oxford Street ดังนั้น * x หมายถึงอะไร ผู้ชม: ไปที่ เดวิดเจลัน: ไปที่ที่อยู่ที่ ทุกก้อนที่ หน่วยความจำไปกับมัน และนำสิ่งที่มีเห็นได้ชัด? ผู้ชม: 42 เดวิดเจลัน: 42 ทั้งหมดขวา * Y, ความคิดเดียวกัน ไปที่ที่อยู่ในปี ใส่หมายเลข 13 ที่นั่น แต่คือ y ในขณะนี้คืออะไร ผู้ชม: มีหน่วยความจำสำหรับปีไม่มี เดวิดเจลัน: มี เป็นหน่วยความจำสำหรับปีไม่มี ดังนั้นสิ่งที่น่าจะเป็นปี มีที่เราได้รับการบอกว่า? ผู้ชม: ขยะ เดวิดเจลัน: บางค่าขยะ ตอนนี้ค่าขยะยังคงมีจำนวน มันยังสามารถเข้าใจผิดสำหรับที่อยู่ มันราวกับว่ามีใครบางคน ขีดเขียนอะไรบางอย่างลง และผมตีความว่ามันเป็นความหมาย อาคารลงถนนบาง และถ้าคุณเพียงแค่พยายามที่จะไปเป็น อาคารบางอย่างที่คุณไม่ได้เป็นเจ้าของ หรือก้อนของหน่วยความจำบางอย่างที่คุณยังไม่ได้ รับสิ่งที่ไม่ดีอาจจะเกิดขึ้น คอมพิวเตอร์อาจผิดพลาดหรือบางอื่น ๆ พฤติกรรมบึกบึนอาจจะเกิดขึ้น ดังนั้นบทนำแล้วให้บิงกี้นี้ ผมยังจำ, 20 ปีที่แปลกบางอย่างในภายหลัง ที่ฉันคือเมื่อฉันสุดท้าย เข้าใจตัวชี้ ซึ่งเป็นที่จะบอกว่าถ้าคุณ ออกจากที่นี่ในสามนาที และคิดว่าฉันทำไม่ได้ เข้าใจตัวชี้ตระหนักถึง ผมจำได้ว่า 20 ปีสำหรับเหตุผลบางบ้า และทำไมเมื่อในที่สุดมันก็จมลง ในนั่งอยู่กับการเรียนการสอนของฉัน เพื่อน Nishat เมธาใน ด้านหลังของเอเลียตฮอลล์ในการรับประทานอาหาร ตอนนี้ฉันได้จำได้ นี้เพราะนี่คือ หนึ่งในหัวข้อที่ผมใน โดยเฉพาะอย่างยิ่งการต่อสู้กับ และแล้วในที่สุดมันก็คลิก เหมือนที่ผมกล้าพูดมากของหัวข้อ ในที่สุดก็จะ และตอนนี้ที่จะทำให้มันรู้สึก มีความสุขและน่าเชื่อถือขึ้นว่า ลองมาดูสุดท้ายในของเรา สุดท้ายสามนาทีที่นี่ที่บิงกี้ จากเพื่อนของนิคของเรา parlante จาก Stanford [วิดีโอเล่นภาพ] -Hey บิงกี้ ตื่นขึ้นมา! ก็ถึงเวลาสำหรับความสนุกสนานชี้ อะไรที่? เรียนรู้เกี่ยวกับตัวชี้? โอ้คนดี! -Well, การเริ่มต้นผมคิดว่าเรากำลัง จะต้องมีตัวชี้คู่ -OK รหัสนี้จัดสรรสองตัวชี้ ซึ่งสามารถชี้ไปที่เลข -OK ดีฉันเห็นทั้งสองตัวชี้ แต่พวกเขา ดูเหมือนจะไม่ได้รับการชี้ไปที่อะไร ขวานั่นก็คือ ในขั้นต้นชี้ ไม่ได้ชี้ไปที่อะไร สิ่งที่พวกเขาชี้ไปที่จะเรียกว่า pointees และการตั้งค่าของพวกเขาขึ้น ขั้นตอนที่แยกต่างหาก โอ้ขวาขวา ฉันรู้ว่า pointees แยก เอ้อดังนั้นวิธีการที่คุณจัดสรร Pointee? -OK ดีรหัสนี้จัดสรร Pointee จำนวนเต็มใหม่ และชุดนี้เป็นส่วนหนึ่ง x จะชี้ไปที่มัน -Hey ที่ดูดีกว่า เพื่อให้มันทำอะไรบางอย่าง -OK ฉันจะ dereference ตัวชี้ x เพื่อ เก็บหมายเลข 42 เป็น Pointee ของ สำหรับเคล็ดลับนี้ผมจะต้องของฉัน Magic Wand ของ dereferencing ด์ของคุณ Magic Wand ของ dereferencing? That-- ที่ดี นี้เป็นสิ่งที่รหัสดูเหมือนว่า ฉันเพิ่งจะตั้งค่าตัวเลขและ [POP] -Hey ดู มีมันไป งั้นทำ dereference ที่ x ดังนี้ ลูกศรเพื่อเข้าถึง Pointee ของ ในกรณีนี้การจัดเก็บ 42 ในนั้น เฮ้ลองใช้มันในการจัดเก็บจำนวน 13 ผ่านตัวชี้อื่น ๆ , y -OK ฉันเพิ่งจะไปกว่าที่นี่เพื่อ Y, และได้รับหมายเลข 13 การตั้งค่า แล้วใช้ไม้กายสิทธิ์ของ dereferencing และเพียงแค่ [BUZZ] โอ้! โอ้เฮ้! ที่ไม่ทำงาน พูดว่าบิงกี้, ฉันไม่คิดว่า dereferencing Y เป็นความคิดที่ดีเพราะคุณรู้ว่า การตั้งค่า Pointee เป็นขั้นตอนที่แยกต่างหาก และผมไม่คิดว่าเราเคยทำมัน จุดได้ดี -Yeah เราจัดสรร Y ชี้ แต่เรา ไม่เคยตั้งค่าให้ชี้ไปที่ Pointee -Very สังเกต -Hey คุณกำลังมองหาที่ดีมีบิงกี้ คุณสามารถแก้ไขได้เพื่อให้จุดปี เพื่อ Pointee เหมือนกับ x? -Sure ฉันจะใช้ Magic Wand ของฉัน ของตัวชี้กำหนด เค้าว่าจะเป็น ปัญหาเหมือนก่อนหรือไม่ ไม่มี นี้ไม่ได้สัมผัส pointees มันก็มีการเปลี่ยนแปลงอย่างใดอย่างหนึ่งชี้ไปยัง ชี้ไปที่สิ่งเดียวกับอีก โอ้ฉันเห็น จุดนี้ปีไปยังสถานที่เดียวกับ x ดังนั้นรอสักครู่ ตอนนี้, y ได้รับการแก้ไข มันมี Pointee เพื่อให้คุณสามารถลองใช้ไม้กายสิทธิ์ของ dereferencing อีกครั้งเพื่อส่ง 13 กว่า -Uh ตกลง นี่มันไป [POP] -Hey ดูที่ว่า ผลงานตอนนี้ dereferencing ในปี และเนื่องจากตัวชี้มีการใช้งานร่วมกัน ว่าหนึ่ง Pointee พวกเขาทั้งสองเห็น 13 -Yeah การแบ่งปันสิ่งที่ ดังนั้นเราจะเปลี่ยนสถานที่ตอนนี้หรือไม่ โอ้มอง เราออกจากเวลา -But-- อันเดิมจำกฎสามตัวชี้ จำนวนหนึ่งโครงสร้างพื้นฐาน คือการที่คุณมีตัวชี้ และมันชี้ไป Pointee แต่ตัวชี้และ Pointee จะแยก และข้อผิดพลาดที่พบบ่อย คือการตั้งค่าตัวชี้ แต่ที่จะลืมที่จะให้มัน Pointee หมายเลขสองตัวชี้ dereferencing เริ่มต้นที่ตัวชี้ และต่อไปนี้ลูกศรของตนเหนือ ในการเข้าถึง Pointee ของ ในขณะที่เราทุกคนรู้ว่านี้ จะทำงานเฉพาะถ้ามี Pointee, ชนิดของ ได้รับกลับไปปกครองจำนวนหนึ่ง จำนวนสามตัวชี้ การกำหนดตัวชี้จะใช้เวลาหนึ่ง และการเปลี่ยนแปลงก็จะชี้ไปที่ Pointee เดียวกันเป็นตัวชี้อีก ดังนั้นหลังจากที่ได้รับมอบหมายให้ ทั้งสองตัวชี้ จะชี้ไปที่ Pointee เดียวกัน บางครั้งที่เรียกว่าการแบ่งปัน และนั่นคือทั้งหมดที่มีให้มันจริงๆ ลาก่อนตอ​​นนี้ [จบการเล่นวิดีโอ] เดวิดเจลัน: นั่นมันสำหรับ CS50 เราจะเห็นคุณในสัปดาห์หน้า