1 00:00:00,000 --> 00:00:03,395 >> [Bermain muzik] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. MALAN: ini adalah seperti seminar mahasiswa hari ini. 4 00:00:13,280 --> 00:00:14,060 OKAY. 5 00:00:14,060 --> 00:00:15,024 Jadi sangat hujan keluar. 6 00:00:15,024 --> 00:00:17,690 Ini cenderung untuk berlaku pada hari Rabu, tetapi semua peluang yang lebih 7 00:00:17,690 --> 00:00:18,700 untuk soalan hari ini. 8 00:00:18,700 --> 00:00:22,210 Oleh itu, marilah kita mulakan sebenarnya dengan filem itu hanya seketika. 9 00:00:22,210 --> 00:00:24,560 Tetapi kita akan bermula secara besar-besaran seperti biasa. 10 00:00:24,560 --> 00:00:28,000 >> Ini adalah CS50, dan ini adalah akhir minggu 4. 11 00:00:28,000 --> 00:00:30,820 Jadi, jika anda pernah menonton TV atau mana filem 12 00:00:30,820 --> 00:00:34,690 ada beberapa pakar-pakar komputer dan polis, atau FBI, atau agensi beberapa 13 00:00:34,690 --> 00:00:36,930 cuba untuk menangkap beberapa musuh, baik, anda telah 14 00:00:36,930 --> 00:00:40,850 mungkin pernah mendengar ungkapan "meningkatkan," mana juruteknik yang entah bagaimana 15 00:00:40,850 --> 00:00:44,750 ajaib Zum ke dalam tak terhingga jauh untuk melihat penjenayah 16 00:00:44,750 --> 00:00:48,640 pengenalan atau nombor pendaftaran walaupun dalam kilauan cermin 17 00:00:48,640 --> 00:00:50,390 atau bersinar mata seseorang. 18 00:00:50,390 --> 00:00:55,196 Maka sesungguhnya, mari kita lihat pada beberapa adegan seperti dari Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO MAIN SEMULA] 20 00:00:55,862 --> 00:00:59,243 -OK, Sekarang mari kita lihat yang baik pada anda. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Pegang itu. 23 00:01:07,415 --> 00:01:08,267 Berlari kembali itu. 24 00:01:08,267 --> 00:01:09,121 >> -Tunggu sekejap. 25 00:01:09,121 --> 00:01:11,300 Pergi ke kanan. 26 00:01:11,300 --> 00:01:12,209 >> -Terdapat, Pembekuan itu. 27 00:01:12,209 --> 00:01:12,750 -Skrin penuh. 28 00:01:12,750 --> 00:01:13,558 -OK, Pembekuan itu. 29 00:01:13,558 --> 00:01:14,820 -Tighten Pada itu, akan anda? 30 00:01:14,820 --> 00:01:16,530 -Vector Dalam pada itu Lelaki oleh roda belakang. 31 00:01:16,530 --> 00:01:19,400 -Zum Dalam di sini di tempat ini. 32 00:01:19,400 --> 00:01:22,846 -Dengan Peralatan yang betul, imej boleh dibesarkan dan tajam. 33 00:01:22,846 --> 00:01:24,065 -Apa itu? 34 00:01:24,065 --> 00:01:25,600 -Ia Merupakan satu program peningkatan. 35 00:01:25,600 --> 00:01:26,860 -Bolehkah Anda jelas bahawa apa-apa? 36 00:01:26,860 --> 00:01:27,890 -Saya tidak tahu. 37 00:01:27,890 --> 00:01:29,050 Mari kita mempertingkatkannya. 38 00:01:29,050 --> 00:01:31,575 >> Seksyen -Meningkatkan A6. 39 00:01:31,575 --> 00:01:33,642 >> -Saya Dipertingkatkan terperinci, dan- Saya fikir ada 40 00:01:33,642 --> 00:01:35,433 cukup untuk meningkatkan, melepaskannya ke skrin saya. 41 00:01:35,433 --> 00:01:37,080 -Saya Dipertingkatkan refleksi dalam mata dia. 42 00:01:37,080 --> 00:01:38,830 >> -Biarkan Melarikan ini melalui peningkatan video. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Anda boleh meningkatkan ini? 44 00:01:40,100 --> 00:01:41,875 >> -Bertahan. 45 00:01:41,875 --> 00:01:44,010 >> -Aku Telah bekerja pada refleksi ini. 46 00:01:44,010 --> 00:01:44,995 >> Renungan -Someone ini. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Ada Mencerminkan muka orang itu. 49 00:01:47,399 --> 00:01:48,065 Renungan -The. 50 00:01:48,065 --> 00:01:48,981 -Ada Pantulan. 51 00:01:48,981 --> 00:01:50,600 -Zum Masuk pada cermin. 52 00:01:50,600 --> 00:01:52,712 -Anda Boleh melihat pantulan. 53 00:01:52,712 --> 00:01:54,350 -Boleh Anda meningkatkan imej dari sini? 54 00:01:54,350 --> 00:01:55,370 -Boleh Anda meningkatkan dia di sini? 55 00:01:55,370 --> 00:01:56,210 -Boleh Anda meningkatkan ia? 56 00:01:56,210 --> 00:01:56,900 Bolehkah anda meningkatkan ia? 57 00:01:56,900 --> 00:01:57,870 >> -Boleh Kita meningkatkan ini? 58 00:01:57,870 --> 00:01:58,717 >> -Boleh Anda meningkatkan ia? 59 00:01:58,717 --> 00:02:00,050 -Hold Sekejap, saya akan meningkatkan. 60 00:02:00,050 --> 00:02:00,924 -Zum Di pintu. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -Zum. 63 00:02:02,586 --> 00:02:03,490 -Move Masuk. 64 00:02:03,490 --> 00:02:03,990 -Lebih. 65 00:02:03,990 --> 00:02:04,690 -Wait, Berhenti. 66 00:02:04,690 --> 00:02:05,190 -Stop. 67 00:02:05,190 --> 00:02:05,970 -Pause Ia. 68 00:02:05,970 --> 00:02:09,460 -Putar Kita 75 darjah sekitar menegak, sila. 69 00:02:09,460 --> 00:02:10,962 -Stop. 70 00:02:10,962 --> 00:02:14,040 Kembali ke bahagian kira-kira pintu, sekali lagi. 71 00:02:14,040 --> 00:02:15,860 >> -Got Penambah imej bitmap yang boleh? 72 00:02:15,860 --> 00:02:18,776 >> Hey, mungkin kita boleh menggunakan Pradeep Kaedah Sen untuk melihat ke tingkap. 73 00:02:18,776 --> 00:02:20,372 Perisian -Ini adalah keadaan seni. 74 00:02:20,372 --> 00:02:21,845 >> Nilai eigen -The dimatikan. 75 00:02:21,845 --> 00:02:24,300 >> -Dengan Kanan gabungan algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Penghapusan diambil -Dia ini algoritma untuk peringkat seterusnya, 77 00:02:26,755 --> 00:02:28,730 dan saya boleh menggunakannya untuk meningkatkan gambar ini. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Pada dan membesarkan-paksi z. 79 00:02:31,286 --> 00:02:32,560 >> -Meningkatkan. 80 00:02:32,560 --> 00:02:33,100 >> -Meningkatkan. 81 00:02:33,100 --> 00:02:33,600 >> -Meningkatkan. 82 00:02:33,600 --> 00:02:34,960 -Freeze Dan meningkatkan. 83 00:02:34,960 --> 00:02:37,180 >> [AKHIR MAIN SEMULA] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. MALAN: Baiklah, jadi semua orang-orang yang benar-benar kata-kata. 85 00:02:41,160 --> 00:02:44,450 Mereka hanya digantung bersama-sama dalam cara yang tidak benar-benar waras. 86 00:02:44,450 --> 00:02:48,400 Dan, sebenarnya, CS50 dan kursus seperti itu cenderung untuk merosakkan banyak TV dan filem 87 00:02:48,400 --> 00:02:48,900 untuk anda. 88 00:02:48,900 --> 00:02:52,330 Kerana apabila mereka yang pakar komputer adalah suara ketuk-ketuk di luar terma dan berkata 89 00:02:52,330 --> 00:02:56,860 perkara-perkara mewah seperti vektor eigen, dan paksi-z, 90 00:02:56,860 --> 00:02:59,572 dan apa-apa bilangan lain sebenarnya terma yang lebih teknikal, 91 00:02:59,572 --> 00:03:02,030 mereka benar-benar hanya meregang perkataan bersama-sama semua terlalu kerap. 92 00:03:02,030 --> 00:03:05,020 Adakah itu salah satu harapan kita ialah, sebagai kesan sampingan kursus pengambilan 93 00:03:05,020 --> 00:03:08,245 seperti ini, akan lebih ramai orang dalam dunia sebenarnya dapat menimbang dalam 94 00:03:08,245 --> 00:03:12,040 dan hanya pernah jadi sedikit mempengaruhi kualiti dan ketepatan filem-filem? 95 00:03:12,040 --> 00:03:14,350 >> Malah, mari kita lihat pada realiti. 96 00:03:14,350 --> 00:03:18,070 Jadi di sini adalah gambar kakitangan daripada Mary, salah satu daripada rakan-rakan yang mengajar kami. 97 00:03:18,070 --> 00:03:20,050 Dan andaikan dia disyaki sesuatu. 98 00:03:20,050 --> 00:03:23,730 Namun, ada pancaran beberapa keping bukti mata dia, 99 00:03:23,730 --> 00:03:25,480 atau pantulan cermin mata beliau. 100 00:03:25,480 --> 00:03:30,760 Nah, jika kita betul-betul seperti filem-filem mencadangkan, di mana kita mengezum dan "meningkatkan", 101 00:03:30,760 --> 00:03:34,080 ini adalah bagaimana banyak maklumat di muka Mary 102 00:03:34,080 --> 00:03:36,795 apabila anda menangkap imej dengan resolusi asal. 103 00:03:36,795 --> 00:03:39,120 >> Dan, sebenarnya, anda boleh melihat titik ini. 104 00:03:39,120 --> 00:03:41,900 Dan ini adalah apakah dipanggil piksel, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 yang hanya persegi biasanya iaitu titik yang menggubah imej. 106 00:03:45,740 --> 00:03:49,200 Dan kembali pada hari itu, dan sebenarnya walaupun hari ini dengan beberapa LED TV hari ini 107 00:03:49,200 --> 00:03:51,950 atau LCD TV, jika anda telah mendapat satu dalam bilik anda atau di rumah, 108 00:03:51,950 --> 00:03:55,100 jika anda pergi ke super dekat kepadanya, dan terutamanya jika ia TV yang agak lebih tua, 109 00:03:55,100 --> 00:03:58,760 anda boleh mungkin juga melihat titik ini dan itulah yang mengarang imej. 110 00:03:58,760 --> 00:04:00,980 >> Dan tidak ada yang lebih maklumat daripada ini. 111 00:04:00,980 --> 00:04:05,400 Kita boleh "meningkatkan", dalam erti kata melicinkan perkara yang lebih dan jenis 112 00:04:05,400 --> 00:04:09,040 membuat kesimpulan jenis, jenis apa warna harus bersebelahan mata Mary 113 00:04:09,040 --> 00:04:10,910 supaya ia tidak sebenarnya begitu pixelated. 114 00:04:10,910 --> 00:04:14,510 Tetapi jika saya terus zoom masuk, terdapat adalah lelaki yang buruk di mata beliau. 115 00:04:14,510 --> 00:04:16,600 Seperti yang semua maklumat yang kita ada. 116 00:04:16,600 --> 00:04:18,920 Anda tidak boleh mencipta maklumat dari tiada. 117 00:04:18,920 --> 00:04:20,790 Terdapat hanya terbatas Bilangan bit sana. 118 00:04:20,790 --> 00:04:22,873 >> Jadi dalam Set Masalah 4, di mana anda mempunyai peluang 119 00:04:22,873 --> 00:04:24,580 bermain dengan jenis ini dunia. 120 00:04:24,580 --> 00:04:27,610 Dalam Set Masalah 4, anda akan meneroka dunia grafik dan forensik, 121 00:04:27,610 --> 00:04:30,870 dan benar-benar menulis kod yang pulih hilang imej. 122 00:04:30,870 --> 00:04:33,510 Anda akan menulis kod yang memanipulasi imej yang sedia ada 123 00:04:33,510 --> 00:04:36,120 dan akhirnya memahami apa yang berlaku di bawah hood. 124 00:04:36,120 --> 00:04:38,540 >> Dan, ternyata, ia sebenarnya tidak semua yang rumit. 125 00:04:38,540 --> 00:04:41,320 Sebagai contoh, jika kita mahu mewakili muka senyum di mana 126 00:04:41,320 --> 00:04:44,160 dengan ini piksel hitam, atau ini titik hitam, 127 00:04:44,160 --> 00:04:47,230 baik, kita hanya boleh mewakili mereka benar-benar satu bitmap. 128 00:04:47,230 --> 00:04:50,040 Dan jika anda pernah mendengar bahawa bitmap bersuara, mungkin 129 00:04:50,040 --> 00:04:52,330 sekarang mula membuat rasa sedikit lebih hari ini. 130 00:04:52,330 --> 00:04:53,580 >> Kita sudah tahu apa yang sedikit adalah. 131 00:04:53,580 --> 00:04:54,160 Ia adalah 0 atau 1. 132 00:04:54,160 --> 00:04:56,201 Dan peta sahaja sesuatu seperti sekeping kertas 133 00:04:56,201 --> 00:04:59,180 yang memberikan anda arahan dan mempunyai mungkin grid x- dan y-koordinat. 134 00:04:59,180 --> 00:05:00,540 Jadi di sini adalah bitmap. 135 00:05:00,540 --> 00:05:03,680 Ia adalah satu peta bit mana 1 nampaknya 136 00:05:03,680 --> 00:05:07,857 akan mewakili piksel putih, dan 0 akan mewakili piksel hitam. 137 00:05:07,857 --> 00:05:09,440 Tetapi kita boleh flip sekitar. 138 00:05:09,440 --> 00:05:11,648 Ia tidak benar-benar perkara supaya selagi kita konsisten. 139 00:05:11,648 --> 00:05:15,570 Dan di sini adalah bagaimana, dalam binary-- dalam memori komputer, atau di dalam 140 00:05:15,570 --> 00:05:18,160 fail pada keras anda drive-- boleh anda menyimpan 141 00:05:18,160 --> 00:05:20,240 yang paling mudah imej wajah smiley. 142 00:05:20,240 --> 00:05:23,990 Tetapi apakah kita, sudah tentu, kekurangan dalam imej ini? 143 00:05:23,990 --> 00:05:24,610 Warna, bukan? 144 00:05:24,610 --> 00:05:28,220 Ia merupakan satu langkah seterusnya yang jelas atau peningkatan untuk memperbaiki ini dengan warna. 145 00:05:28,220 --> 00:05:32,230 Lebih malang lagi dengan hanya satu bit, 0 atau 1, kita boleh mewakili warna. 146 00:05:32,230 --> 00:05:36,100 Itu boleh menjadi merah, atau biru, atau hitam, atau putih, atau hijau, atau merah jambu, 147 00:05:36,100 --> 00:05:37,420 atau mana-mana pasangan warna. 148 00:05:37,420 --> 00:05:40,860 Tetapi demi kesederhanaan ini, kita akan hanya menganggap hitam dan putih. 149 00:05:40,860 --> 00:05:45,930 >> Jadi apa logiknya kita perlu jika kita mahu melaksanakan warna dalam imej? 150 00:05:45,930 --> 00:05:49,080 Apa yang perlu kita lakukan? 151 00:05:49,080 --> 00:05:51,900 Seperti jika faktor penghad sini adalah bahawa dengan satu bit anda hanya boleh 152 00:05:51,900 --> 00:05:55,977 mewakili kedua-dua negeri, 0 atau 1, putih atau hitam, apa yang anda mahu lakukan? 153 00:05:55,977 --> 00:05:56,810 PENONTON: Lebih data. 154 00:05:56,810 --> 00:05:58,813 DAVID J. MALAN: Lebih bit, yeah lebih banyak data, lebih bit. 155 00:05:58,813 --> 00:06:01,440 Dan, sememangnya, itulah bagaimana imej warna diwakili. 156 00:06:01,440 --> 00:06:05,120 Daripada menggunakan sedikit tunggal, 0 atau 1 untuk setiap piksel, setiap dot, 157 00:06:05,120 --> 00:06:06,170 anda hanya menggunakan berbilang. 158 00:06:06,170 --> 00:06:09,660 Mungkin menggunakan 8, mungkin, lebih biasa menggunakan 24, dan sesungguhnya, dalam Set Masalah 159 00:06:09,660 --> 00:06:13,300 4, anda akan bermain dengan fail format yang menggunakan 24 bit biasanya. 160 00:06:13,300 --> 00:06:15,430 >> Namun yang paling penting anda mungkin biasa dengan JPEG. 161 00:06:15,430 --> 00:06:17,460 Jika anda pernah diambil foto di telefon anda, 162 00:06:17,460 --> 00:06:20,360 atau dimuat naik atau melihat sesuatu pada Facebook, atau Flickr, apa-apa bilangan 163 00:06:20,360 --> 00:06:24,882 laman web berdasarkan gambar-, anda telah mungkin melihat imej JPEG sebelum ini. 164 00:06:24,882 --> 00:06:27,840 Dan ternyata, ini adalah fail format kita akan gunakan dalam pset 4, 165 00:06:27,840 --> 00:06:30,340 di mana anda akan perlu pulih imej 166 00:06:30,340 --> 00:06:35,160 bahawa saya telah sengaja dipadam daripada kad memori rosak dengan kamera, 167 00:06:35,160 --> 00:06:35,800 jika anda akan. 168 00:06:35,800 --> 00:06:38,490 >> Dan ternyata bahawa walaupun JPEG adalah sophisticated-- cantik 169 00:06:38,490 --> 00:06:40,906 ia lebih canggih daripada titik-titik hitam dan putih 170 00:06:40,906 --> 00:06:44,480 kita lihat sebentar tadi, kerana ada algoritma sebenarnya mewah yang 171 00:06:44,480 --> 00:06:47,410 digunakan untuk memampatkan JPEG, jadi bahawa anda boleh mempunyai benar-benar baik, 172 00:06:47,410 --> 00:06:49,832 gambar berkualiti tetapi menggunakan relatif sedikit bit. 173 00:06:49,832 --> 00:06:51,790 Dan kami akan kembali kepada mampatan tidak lama lagi. 174 00:06:51,790 --> 00:06:56,280 Ia ternyata bahawa yang pertama tiga bait dalam image-- JPEG 175 00:06:56,280 --> 00:07:02,750 tidak kira apa yang anda telah ambil gambar daripada- adalah nilai-nilai 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Dalam erti kata lain, jika anda hanya melihat bahawa corak bit, 177 00:07:05,990 --> 00:07:09,180 diwakili di sini tiga bait, atau 24 bit jumlah, 178 00:07:09,180 --> 00:07:13,810 dengan kebarangkalian tinggi anda boleh membuat kesimpulan bahawa anda sedang mencari pada itu tiga pertama ini 179 00:07:13,810 --> 00:07:15,230 bait yang JPEG. 180 00:07:15,230 --> 00:07:18,040 Dan ini adalah apa yang diketahui sebagai tandatangan seorang JPEG. 181 00:07:18,040 --> 00:07:20,540 Banyak format fail di luar sana cenderung untuk mula 182 00:07:20,540 --> 00:07:23,735 dengan corak tertentu 0 dan 1s, supaya Windows dan Mac OS, dan IOS, 183 00:07:23,735 --> 00:07:28,272 dan Android tahu apa jenis fail mereka adalah, sebagai tambahan kepada fail yang dipanggil 184 00:07:28,272 --> 00:07:29,730 lanjutan yang banyak fail ada. 185 00:07:29,730 --> 00:07:32,590 Jika anda telah .jpg, itu satu lagi petunjuk ke komputer. 186 00:07:32,590 --> 00:07:35,310 >> Jadi mari kita lihat sekarang ini lebih sedikit dari segi teknikal. 187 00:07:35,310 --> 00:07:37,390 Kita tahu perpuluhan sistem adalah 0 hingga 9. 188 00:07:37,390 --> 00:07:38,740 Kita tahu binari adalah 0 dan 1. 189 00:07:38,740 --> 00:07:41,842 Dan jika anda berfikir kembali ke pset 0, kita mempunyai anda bergelut dengan, 190 00:07:41,842 --> 00:07:43,800 yang sedikit, sesuatu dipanggil perenambelasan, 191 00:07:43,800 --> 00:07:47,320 di mana anda mempunyai 16 digit, dan bukannya 10 atau bukan 2. 192 00:07:47,320 --> 00:07:50,405 Dan orang-digit, oleh konvensyen, 0 hingga 9 dan kemudian 193 00:07:50,405 --> 00:07:55,040 melalui f, di mana f mewakili apa nombor perpuluhan, hanya sebagai kewarasan cepat 194 00:07:55,040 --> 00:07:56,640 cek? 195 00:07:56,640 --> 00:07:57,610 Jadi, 15. 196 00:07:57,610 --> 00:08:01,390 Dan mesti mewakili 10, hanya dengan sifat pesanan yang saya telah diberikan. 197 00:08:01,390 --> 00:08:04,350 Ia hanya konvensyen sewenang-wenangnya, tetapi ia agak standard. 198 00:08:04,350 --> 00:08:06,870 >> Jadi, jika kita melihat corak ini tiga bytes-- mari 199 00:08:06,870 --> 00:08:09,620 hanya mula melihat ia dalam cara yang konsisten dengan bagaimana 200 00:08:09,620 --> 00:08:12,450 saintis komputer umumnya melihat dan berfikir tentang fail. 201 00:08:12,450 --> 00:08:15,580 Anda tentu boleh berfikir tentang gambar dalam 0s dan 1s, dan perpuluhan, 202 00:08:15,580 --> 00:08:19,340 tetapi pada hakikatnya, kita cenderung untuk menggunakan binari atau lebih biasanya hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 kembali dari Serangga 0. 204 00:08:20,760 --> 00:08:25,857 Jadi biarlah saya mencadangkan supaya 255, 216, dan 255 hanya ini corak 0 dan 1s. 205 00:08:25,857 --> 00:08:28,440 Dan anda boleh menyemak ini jika anda mahu lakukan matematik dari Minggu 0. 206 00:08:28,440 --> 00:08:30,810 Tetapi, buat masa ini, hanya menganggap bahawa ini memang betul. 207 00:08:30,810 --> 00:08:33,850 Saya baru sahaja ditulis semula tiga perpuluhan nombor sebagai tiga nilai binari. 208 00:08:33,850 --> 00:08:36,100 Sekarang apa yang saya akan lakukan ialah hanya menambah sedikit ruang putih, 209 00:08:36,100 --> 00:08:37,266 hanya demi pembacaan itu. 210 00:08:37,266 --> 00:08:39,940 Dan notis, saya hanya akan untuk menggerakkan kereta. 211 00:08:39,940 --> 00:08:43,090 Jadi sebelum, selepas, sebelum, selepas. 212 00:08:43,090 --> 00:08:46,180 Saya melakukan apa-apa lain yang menarik daripada sekadar menyebarkan perkara-perkara di luar jadi 213 00:08:46,180 --> 00:08:50,380 bahawa notis setiap set lapan bit kini dua set empat bit. 214 00:08:50,380 --> 00:08:54,920 Ini berguna kerana perenambelasan amat bergaya 215 00:08:54,920 --> 00:09:00,930 kerana setiap perenambelasan digit 0 melalui f, atau lebih khusus 0 hingga 15, 216 00:09:00,930 --> 00:09:03,430 boleh diwakili dengan tepat empat bit. 217 00:09:03,430 --> 00:09:07,960 Dengan kata lain, dalam perenambelasan jika anda mahu mewakili 0, ia hanya 0000, 218 00:09:07,960 --> 00:09:08,780 empat sifar. 219 00:09:08,780 --> 00:09:13,997 Dan jika anda mahu untuk mewakili 15, itu 1111, yang merupakan empat bit. 220 00:09:13,997 --> 00:09:16,080 Dan jika anda matematik, jika ini adalah tempat sa, 221 00:09:16,080 --> 00:09:18,210 ini adalah tempat 16s itu, yang akan memberi atasmu, 222 00:09:18,210 --> 00:09:19,960 dan bukan yang akan supaya- maaf, dalam binari, 223 00:09:19,960 --> 00:09:23,660 yang akan memberikan anda 15, orang-orang yang berlaku, tempat berdua-dua, merangkak dan lapan tempat. 224 00:09:23,660 --> 00:09:26,821 Jadi biarlah saya mencadangkan bahawa set empat bit di sebelah kiri 225 00:09:26,821 --> 00:09:28,070 adalah apa yang kita akan memanggil f. 226 00:09:28,070 --> 00:09:30,110 Ia adalah jumlah yang paling besar anda boleh mewakili empat bit. 227 00:09:30,110 --> 00:09:33,300 Dan kita sudah tahu dari perenambelasan, f adalah angka yang paling besar dalam perenambelasan. 228 00:09:33,300 --> 00:09:36,020 Kami telah mendapat f lain di sana, dua lagi di sana. 229 00:09:36,020 --> 00:09:38,980 Dan buat masa ini, hanya mengambil iman bahawa saya telah dilakukan dengan betul matematik 230 00:09:38,980 --> 00:09:41,890 dan separuh kiri mereka bit, 1101, 231 00:09:41,890 --> 00:09:43,980 adalah perkara yang sama seperti d dalam perenambelasan. 232 00:09:43,980 --> 00:09:46,490 Dan tangan kanan, 1000, hanya 8. 233 00:09:46,490 --> 00:09:48,140 >> Dan bahawa seseorang mudah untuk melihat, bukan? 234 00:09:48,140 --> 00:09:51,670 8 represents-- yang tepat di bawah bahawa tempat lapan. 235 00:09:51,670 --> 00:09:56,040 Oleh itu, kita mempunyai satu di ruangan lapan yang dan apa-apa dalam merangkak, berdua-dua atau orang-orang. 236 00:09:56,040 --> 00:09:59,830 Jadi sekarang lebih konvensional, manusia cenderung untuk menulis digit perenambelasan seperti ini, 237 00:09:59,830 --> 00:10:03,000 anda hanya squish mereka bersama-sama, dan kemudian anda awalan mereka dengan 0x. 238 00:10:03,000 --> 00:10:05,920 Ini bermakna apa-apa selain daripada petunjuk visual untuk human-- yang 239 00:10:05,920 --> 00:10:10,350 di sini datang value-- perenambelasan kerana ia mungkin yang tidak jelas. 240 00:10:10,350 --> 00:10:13,629 >> Yang mengatakan, akhirnya, yang corak sifar dan satu, 241 00:10:13,629 --> 00:10:16,170 atau corak perenambelasan digit setara bahawa anda 242 00:10:16,170 --> 00:10:18,990 akan mula mencari dalam Set Masalah 4 adalah this-- 243 00:10:18,990 --> 00:10:22,120 dan Set Masalah 4 spec akan berjalan anda melalui ini dengan lebih detail-- 244 00:10:22,120 --> 00:10:25,344 tetapi menyedari sebagai jenis yang sukar difahami sebagai ini mungkin kelihatan pada pandangan pertama, 245 00:10:25,344 --> 00:10:27,010 anda akan mula melihat banyak ini. 246 00:10:27,010 --> 00:10:30,320 Dan sebenarnya, walaupun dalam GDB, yang penyahpepijat kami memperkenalkan pada Isnin 247 00:10:30,320 --> 00:10:35,440 dan Dan memperkenalkan dalam Serangga 3, akan sering menunjukkan nilai-nilai perenambelasan 248 00:10:35,440 --> 00:10:39,910 hanya kerana mereka cenderung untuk menjadi lebih konvensional daripada perpuluhan atau binari 249 00:10:39,910 --> 00:10:41,157 dalam dunia komputer. 250 00:10:41,157 --> 00:10:42,490 Sekarang mari kita meletakkan ini ke dalam konteks. 251 00:10:42,490 --> 00:10:48,040 Ramai daripada anda mungkin ingat ini gambar di sini, yang datang dari apa? 252 00:10:48,040 --> 00:10:51,240 Vista, jadi lebih awal daripada itu, Windows XP melakukan debut ini. 253 00:10:51,240 --> 00:10:52,620 Jadi ini adalah landskap yang indah. 254 00:10:52,620 --> 00:10:55,940 Dan sebenarnya, jika anda mencucuk di sekitar online-- Saya fikir ia adalah satu artikel Wikipedia, 255 00:10:55,940 --> 00:11:00,110 di mana seseorang yang sangat menakjubkan keluar mendapati lokasi ini di dunia ditubuhkan 256 00:11:00,110 --> 00:11:02,240 atau kamera beliau dalam tepat place-- yang betul 257 00:11:02,240 --> 00:11:06,510 dan hari ini kelihatan like-- tetapi ia betul-betul tetapan yang sama. 258 00:11:06,510 --> 00:11:10,060 Imej ini, walaupun, adalah dalam fail format dipanggil bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Dan kita akan mengambil yang super renungan pada apa yang bermakna. 260 00:11:12,910 --> 00:11:17,770 >> Tetapi bitmap hanya cara yang berbeza imej yang mewakili masih menggunakan piksel 261 00:11:17,770 --> 00:11:19,580 dalam 0 dan 1s, akhirnya. 262 00:11:19,580 --> 00:11:23,282 Tetapi pada pandangan cepat, ia mempunyai tandatangan yang lebih menarik 263 00:11:23,282 --> 00:11:24,490 pada awal fail. 264 00:11:24,490 --> 00:11:26,670 Ia bukan hanya tiga bait, dan bukan ada 265 00:11:26,670 --> 00:11:30,770 sejumlah besar pola bait yang telah ditentukan terlebih dahulu makna. 266 00:11:30,770 --> 00:11:34,490 Sebagai contoh, di suatu tempat di Beberapa bait pertama imej bitmap 267 00:11:34,490 --> 00:11:37,440 akan menjadi saiz imej, lebar imej, 268 00:11:37,440 --> 00:11:40,390 ketinggian imej, jadi metadata berguna, jika anda akan. 269 00:11:40,390 --> 00:11:43,940 Maklumat yang berguna yang Photoshop atau program apa-apa grafik anda menggunakan 270 00:11:43,940 --> 00:11:45,180 sebenarnya mungkin hargai. 271 00:11:45,180 --> 00:11:47,170 >> Jadi lebih mengenai ini dalam Set Masalah 4, tetapi ini 272 00:11:47,170 --> 00:11:49,220 hanya untuk mengatakan bahawa pada akhir hari 273 00:11:49,220 --> 00:11:52,390 semua format fail yang anda telah menggunakan untuk years-- fail Microsoft Word, 274 00:11:52,390 --> 00:11:55,820 Nombor fail, fail Excel, apa-apa bilangan format fail 275 00:11:55,820 --> 00:11:57,770 yang mungkin mempunyai beberapa dikenali sambungan fail 276 00:11:57,770 --> 00:12:00,130 hanya 0s dan 1s bawah hood. 277 00:12:00,130 --> 00:12:02,970 Dan manusia telah membuat keputusan apa konvensyen berada, 278 00:12:02,970 --> 00:12:08,340 apa corak 0 dan 1s mewakili memfailkan Word berbanding fail Excel, 279 00:12:08,340 --> 00:12:10,322 berbanding apa-apa bilangan format fail lain. 280 00:12:10,322 --> 00:12:12,780 Jadi dalam pset 4, anda akan mempunyai peluang untuk bermain dengan itu. 281 00:12:12,780 --> 00:12:14,405 >> Tetapi apakah ertinya mempunyai struct. 282 00:12:14,405 --> 00:12:18,012 Ini sebenarnya Shalawat bagus sekarang ke dalam C, yang hanya mempunyai satu pasangan 283 00:12:18,012 --> 00:12:20,220 ciri-ciri tambahan yang kami tidak melihat lagi. 284 00:12:20,220 --> 00:12:24,230 Ia adalah satu bahasa yang cukup kecil dan salah satu ciri-ciri yang menarik mengenai C adalah struct. 285 00:12:24,230 --> 00:12:27,300 Sebagai contoh, jika anda mahu represent-- mari 286 00:12:27,300 --> 00:12:33,690 katakan anda mahu mempunyai pembolehubah yang mewakili pelajar dalam program tertentu. 287 00:12:33,690 --> 00:12:37,330 Mungkin anda telah menulis kursus program pendaftaran, atau membeli-belah teras 288 00:12:37,330 --> 00:12:38,870 alat, atau sesuatu seperti itu. 289 00:12:38,870 --> 00:12:42,922 Apakah bahagian data yang berkaitan kepada pelajar yang datang ke fikiran? 290 00:12:42,922 --> 00:12:44,880 Seperti pelajar adalah diwakili dengan nilai apa? 291 00:12:44,880 --> 00:12:45,732 Ya? 292 00:12:45,732 --> 00:12:46,940 Anda mempunyai nama sebagai pelajar. 293 00:12:46,940 --> 00:12:48,900 Apa lagi perkara yang pelajar biasa ada? 294 00:12:48,900 --> 00:12:49,320 >> PENONTON: [didengar] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. MALAN: Jadi, maaf. 296 00:12:50,200 --> 00:12:50,660 >> PENONTON: Age. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. MALAN: Umur Satu atau hari jadi setara, yep. 298 00:12:52,980 --> 00:12:53,557 Apa lagi? 299 00:12:53,557 --> 00:12:54,390 PENONTON: nombor ID? 300 00:12:54,390 --> 00:12:57,460 DAVID J. MALAN: Jadi nombor ID, mungkin nombor telefon, mungkin asrama, atau rumah, 301 00:12:57,460 --> 00:12:58,670 atau kolej, atau sesuatu seperti itu. 302 00:12:58,670 --> 00:13:01,820 Apa-apa bilangan bahagian data yang anda mungkin mempunyai dalam senarai kenalan anda 303 00:13:01,820 --> 00:13:03,890 adalah apa yang mungkin menentukan pelajar. 304 00:13:03,890 --> 00:13:08,490 Jadi, jika kita mahu melakukan ini, kod, mungkin kita lakukan sesuatu yang mudah seperti ini. 305 00:13:08,490 --> 00:13:15,670 Kita mungkin mempunyai program supaya mempunyai katakan, int main (tidak sah). 306 00:13:15,670 --> 00:13:18,920 Dan jika saya mahu untuk mewakili pelajar saya mungkin mempunyai, misalnya, 307 00:13:18,920 --> 00:13:24,330 tali yang dikenali sebagai nama untuk pelajar itu, tali yang dikenali sebagai asrama untuk pelajar itu, 308 00:13:24,330 --> 00:13:26,900 mungkin int dipanggil ID untuk pelajar itu. 309 00:13:26,900 --> 00:13:30,840 Dan kerana saya menggunakan tali, Saya perlu kembali dan meletakkan CS50.h. 310 00:13:30,840 --> 00:13:33,300 Mungkin saya akan memerlukan stdio.h. 311 00:13:33,300 --> 00:13:38,190 Jadi biarlah saya preemptively cara orang-orang dan saya akan memanggil student.c ini buat masa ini 312 00:13:38,190 --> 00:13:40,080 dan menyelamatkan ini. 313 00:13:40,080 --> 00:13:44,206 >> Dan sekarang saya boleh melakukan sesuatu dengan pembolehubah ini. 314 00:13:44,206 --> 00:13:46,830 Dan kami hanya akan menulis bahawa sebagai komen kod pseudo, 315 00:13:46,830 --> 00:13:48,829 kerana ia tidak menarik apa yang kita lakukan sekarang. 316 00:13:48,829 --> 00:13:51,242 OK, jadi ini adalah program yang entah bagaimana menyimpan pelajar. 317 00:13:51,242 --> 00:13:53,450 Apa yang saya mahu lakukan jika saya mahu menyimpan dua pelajar? 318 00:13:53,450 --> 00:13:55,991 Jadi naluri pertama saya akan menjadi hak semua, tunggu satu minit, 319 00:13:55,991 --> 00:14:01,920 jika saya mempunyai pelajar lain mengapa tidak saya hanya melakukan rentetan nama 2, tali asrama 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 Dan kita telah melakukan pergi ke jalan ini sebelum 322 00:14:06,540 --> 00:14:10,890 dan apa yang penyelesaian kami untuk apa yang kelihatan untuk berbuat baik daripada copy paste hackish 323 00:14:10,890 --> 00:14:11,555 kerja di sini? 324 00:14:11,555 --> 00:14:12,346 PENONTON: Pelbagai. 325 00:14:12,346 --> 00:14:13,830 DAVID J. MALAN: Ya, kita boleh menggunakan array. 326 00:14:13,830 --> 00:14:15,620 Hak ini dengan cepat menjadi dikawal. 327 00:14:15,620 --> 00:14:18,453 Anda perlu menyelesaikan sewenang-wenangnya mula menamakan semua pemboleh ubah ini. 328 00:14:18,453 --> 00:14:22,190 Dan anda, manusia, perlu terus trek yang sepadan OK NAME2 329 00:14:22,190 --> 00:14:25,060 dengan dorm2 sepadan dengan ID2. 330 00:14:25,060 --> 00:14:26,200 Ia hanya menjadi kacau-bilau. 331 00:14:26,200 --> 00:14:29,350 Jadi ia adalah lebih mudah, ingat dari beberapa minggu yang lalu, 332 00:14:29,350 --> 00:14:34,300 hanya perlu memanggil nama rentetan dan mungkin memberi kita tiga daripada mereka. 333 00:14:34,300 --> 00:14:36,940 Dan kemudian mungkin kita mempunyai asrama tali dan mempunyai 334 00:14:36,940 --> 00:14:41,900 tiga daripada mereka, atau dengan tetap, int id dan mempunyai tiga daripada mereka. 335 00:14:41,900 --> 00:14:45,250 Tetapi sekarangpun ini berasa ceroboh, bukan sedikit. 336 00:14:45,250 --> 00:14:49,440 Kami bercakap tentang pelajar dan lagi Saya benar-benar kediaman pada tahap yang rendah 337 00:14:49,440 --> 00:14:50,470 butir-butir pelaksanaan. 338 00:14:50,470 --> 00:14:52,790 Pelajar adalah nama dan asrama dan ID. 339 00:14:52,790 --> 00:14:59,814 >> Mengapa saya tidak boleh hanya mengisytiharkan pembolehubah dipanggil pelajar dan memanggilnya s. 340 00:14:59,814 --> 00:15:02,230 Dan jika saya mahu pelajar lain, mengapa tidak saya hanya memanggilnya t. 341 00:15:02,230 --> 00:15:05,260 Atau jika saya mahu sejumlah pelajar, mengapa tidak saya 342 00:15:05,260 --> 00:15:09,740 mengatakan saya mempunyai kelas keseluruhan pelajar, dan ia adalah tiga daripada mereka. 343 00:15:09,740 --> 00:15:12,470 Dengan kata lain, mengapa saya tidak boleh datang dengan jenis data saya sendiri, yang dipanggil 344 00:15:12,470 --> 00:15:15,641 Pelajar, di dalam yang adalah nama, adalah ID, adalah asrama, 345 00:15:15,641 --> 00:15:16,890 apa-apa beberapa bidang lain. 346 00:15:16,890 --> 00:15:19,030 Dan ternyata anda boleh melakukan perkara tersebut. 347 00:15:19,030 --> 00:15:21,850 >> Jadi C mempunyai ciri-ciri ini dipanggil struct. 348 00:15:21,850 --> 00:15:24,700 Itu adalah ciri bahasa yang membolehkan kita untuk melakukan perkara ini. 349 00:15:24,700 --> 00:15:28,370 Saya akan pergi ke hadapan dan membuka structs.h 350 00:15:28,370 --> 00:15:32,299 di mana kita akan melihat mengikut definisi pelajar. 351 00:15:32,299 --> 00:15:35,215 Ia ternyata - dan ini adalah juga lebih mudah daripada yang melibatkan satu ID 352 00:15:35,215 --> 00:15:36,080 masa lalu. 353 00:15:36,080 --> 00:15:39,120 Jika anda ingin datang dengan jenis data buatan sendiri anda, 354 00:15:39,120 --> 00:15:42,750 dan sebagai tambahan kepada int, dan char dan terapung dan semua yang lain ini yang wujud, 355 00:15:42,750 --> 00:15:45,810 anda boleh berbuat demikian dengan literal menulis typedef struct, 356 00:15:45,810 --> 00:15:47,880 kemudian beberapa pendakap kerinting, di dalam yang anda 357 00:15:47,880 --> 00:15:51,460 menyenaraikan pembolehubah anda mahu kaitkan dengan data adat baru ini 358 00:15:51,460 --> 00:15:55,670 menaip seperti nama dan asrama, dan kemudian selepas pendakap kerinting 359 00:15:55,670 --> 00:15:57,860 anda memberikan nama kepada jenis data yang baru. 360 00:15:57,860 --> 00:15:59,220 Jadi, sebagai contoh, pelajar. 361 00:15:59,220 --> 00:16:03,247 >> Dan apa yang baik tentang ini sekarang ialah jika kita melihat kod yang sama, 362 00:16:03,247 --> 00:16:05,080 konvensyen, pertama sekali, adalah untuk meletakkan ini 363 00:16:05,080 --> 00:16:08,230 dalam fail dipanggil sesuatu dot h, fail header, yang kita tidak mempunyai 364 00:16:08,230 --> 00:16:09,780 mula menggunakan diri kita terlalu banyak. 365 00:16:09,780 --> 00:16:12,120 Tetapi kita akan mula menggunakan agak sedikit sekarang. 366 00:16:12,120 --> 00:16:18,650 Dan apa yang boleh kita lakukan dengan ini, akhirnya, dalam ayat-ayat ini beberapa kod 367 00:16:18,650 --> 00:16:22,130 adalah mengisytiharkan perkara tersebut jenis data, pelajar. 368 00:16:22,130 --> 00:16:23,230 Dan sekarang mari kita menggunakannya. 369 00:16:23,230 --> 00:16:27,274 >> Saya akan pergi ke dalam sekarang fail yang dipanggil structs1.c. 370 00:16:27,274 --> 00:16:29,440 Dan mari kita lihat pada Beberapa ciri-ciri di sini. 371 00:16:29,440 --> 00:16:32,250 Jadi barangan di sini adalah kebanyakannya biasa, dan kita akan 372 00:16:32,250 --> 00:16:35,040 kembali kepada apa yang tidak biasa dalam hanya seketika. 373 00:16:35,040 --> 00:16:39,880 Ini sudah tentu termasuk saya sendiri file kepala, yang baru juga, 374 00:16:39,880 --> 00:16:42,580 kecuali Serangga 3 di mana, ingat, kita ada helpers.h. 375 00:16:42,580 --> 00:16:45,150 Jadi, anda mungkin ingat helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> Kenapa walaupun saya gunakan petikan bukannya kurungan bersudut? 377 00:16:49,381 --> 00:16:50,630 Bilakah saya memilih di antara mereka? 378 00:16:50,630 --> 00:16:52,310 Hampir selalu saya seolah-olah menggunakan kurungan bersudut. 379 00:16:52,310 --> 00:16:55,040 Dan kemudian, tiba-tiba pada garisan enam saya menggunakan tanda petik. 380 00:16:55,040 --> 00:16:55,860 Mengapa yang mungkin? 381 00:16:55,860 --> 00:16:56,700 Ya? 382 00:16:56,700 --> 00:16:57,725 >> PENONTON: [didengar] 383 00:16:57,725 --> 00:16:59,350 DAVID J. MALAN: Itu yang sebenar, apa? 384 00:16:59,350 --> 00:17:00,559 PENONTON: Itu dalam IDE anda. 385 00:17:00,559 --> 00:17:02,475 DAVID J. MALAN: Ya, yang dalam IDE sebenar saya. 386 00:17:02,475 --> 00:17:05,690 Dan jangan menyentuh mengenai IDE, kerana itu hanya alat yang saya gunakan. 387 00:17:05,690 --> 00:17:08,119 Yang dalam semasa saya direktori, secara khusus. 388 00:17:08,119 --> 00:17:11,647 Jadi structs.h adalah fail saya sendiri tidak dipasang dalam IDE, 389 00:17:11,647 --> 00:17:14,480 dalam sistem operasi itu sendiri, sebaliknya ia adalah di dalam direktori semasa saya. 390 00:17:14,480 --> 00:17:16,910 Jadi konvensyen itu jika anda mahu untuk memasukkan fail header anda sendiri, 391 00:17:16,910 --> 00:17:18,200 anda hanya menggunakan tanda petik. 392 00:17:18,200 --> 00:17:23,290 >> Apa yang kita panggil perkara ini dalam baris 8, secara umum? 393 00:17:23,290 --> 00:17:25,200 Ini adalah apa? 394 00:17:25,200 --> 00:17:28,220 # menentukan sesuatu. 395 00:17:28,220 --> 00:17:31,040 Ini mewakili pemalar, bukan? 396 00:17:31,040 --> 00:17:33,140 Jika anda ingin mempunyai nilai dalam program anda 397 00:17:33,140 --> 00:17:35,110 bahawa anda menggunakan keseluruhan sekumpulan kali, adalah 398 00:17:35,110 --> 00:17:39,330 adat baik untuk faktor ia keluar, mengisytiharkan ia, dengan simbol hash 399 00:17:39,330 --> 00:17:43,340 menentukan, maka, oleh konvensyen, dalam semua huruf besar word-- walaupun ia bukan 400 00:17:43,340 --> 00:17:45,320 tegas perlu, tetapi ia konvensyen manusia 401 00:17:45,320 --> 00:17:47,210 untuk mengambil kesempatan pemalar supaya mereka melompat keluar 402 00:17:47,210 --> 00:17:50,380 pada anda visually-- ruang dan maka nilai yang anda mahu 403 00:17:50,380 --> 00:17:52,250 bersamaan dengan nama yang berterusan ini. 404 00:17:52,250 --> 00:17:56,110 Tiada koma bertitik, tetapi anda hanya mengikuti corak yang di sana. 405 00:17:56,110 --> 00:17:57,770 >> Jadi apa yang saya lakukan dalam kod sebenar ini. 406 00:17:57,770 --> 00:18:00,660 Oleh itu, mari kita lihat pada program utama di sini. 407 00:18:00,660 --> 00:18:04,080 Selaras 12 kerana saya telah merangkumkan structs.h, 408 00:18:04,080 --> 00:18:06,492 Saya kini mempunyai ajaib pada saya gunakan jenis data baru. 409 00:18:06,492 --> 00:18:09,200 Saya tidak hanya mempunyai akses kepada int, dan char, dan apungan, dan tali, 410 00:18:09,200 --> 00:18:10,060 dan biru dan lain-lain. 411 00:18:10,060 --> 00:18:12,470 Saya kini mempunyai akses kepada jenis data pelajar. 412 00:18:12,470 --> 00:18:17,740 Jadi dalam talian 12, saya menggabungkan dua ideas-- satu jenis data adat dan dua, 413 00:18:17,740 --> 00:18:18,940 menggunakan array. 414 00:18:18,940 --> 00:18:21,700 Dan sebagainya dalam program ini jika Saya mahu sebenarnya menyokong 415 00:18:21,700 --> 00:18:24,320 tiga pelajar yang berbeza dalam program saya, saya 416 00:18:24,320 --> 00:18:30,480 hanya boleh mengatakan memberi saya pembolehubah dipanggil pelajar, setiap yang 417 00:18:30,480 --> 00:18:32,970 adalah pelajar jenis, yang adalah jenis data peribadi saya. 418 00:18:32,970 --> 00:18:35,890 Dan, khususnya, memberi saya tiga daripada mereka yang pelbagai saya. 419 00:18:35,890 --> 00:18:37,750 >> Jadi sekarang apa yang kita lakukan dalam program ini? 420 00:18:37,750 --> 00:18:40,670 Di sini hanya untuk gelung iterating 0-3, kerana itulah 421 00:18:40,670 --> 00:18:42,110 apa nilai pelajar adalah. 422 00:18:42,110 --> 00:18:44,420 Saya hanya mendorong pengguna memberi saya nama pelajar. 423 00:18:44,420 --> 00:18:48,090 Dan kemudian dalam talian 17, kita mempunyai garis kebanyakannya biasa. 424 00:18:48,090 --> 00:18:50,370 Kami mempunyai kawan lama kami GetString di sebelah kanan. 425 00:18:50,370 --> 00:18:52,345 Dan apa yang sekeping sintaks nampaknya baru, 426 00:18:52,345 --> 00:18:55,130 jika anda tidak pernah diprogramkan dalam C sebelum ini, dan tidak pernah menggunakan structs? 427 00:18:55,130 --> 00:18:55,510 Ya? 428 00:18:55,510 --> 00:18:56,417 >> PENONTON: .name ini. 429 00:18:56,417 --> 00:18:57,500 DAVID J. MALAN: .name ini. 430 00:18:57,500 --> 00:19:01,220 Tetapi ini tidak terlalu banyak lompat, kerana sekarang pelajar braket i 431 00:19:01,220 --> 00:19:02,590 memberikan anda i-ke-pelajar. 432 00:19:02,590 --> 00:19:04,730 Dan jika anda mahu untuk menyelam dalam struktur itu, 433 00:19:04,730 --> 00:19:09,490 anda hanya menggunakan masa yang tunggal dan kemudian nama pembolehubah di dalam, 434 00:19:09,490 --> 00:19:11,900 atau kekayaan di dalam yang anda ingin mendapatkan akses kepada. 435 00:19:11,900 --> 00:19:14,816 Begitu juga, jika saya kemudian mendorong pengguna, memberi saya asrama pelajar, 436 00:19:14,816 --> 00:19:18,390 anda boleh menyimpan sama yang rentetan dalam pembolehubah asrama dalam 437 00:19:18,390 --> 00:19:19,940 daripada struktur pelajar. 438 00:19:19,940 --> 00:19:21,410 >> Dan sekarang hal-hal yang mewah sedikit. 439 00:19:21,410 --> 00:19:24,420 Dan ini akan kelihatan di mungkin banyak tidak lama lagi. 440 00:19:24,420 --> 00:19:27,970 Tetapi anda akan melihat ini jauh lebih dalam Serangga 4, jadi mari kita hanya renungan sekarang. 441 00:19:27,970 --> 00:19:33,364 Ia ternyata bahawa selaras 23 melalui 38, apa yang anda fikir saya mungkin buat? 442 00:19:33,364 --> 00:19:35,530 Saya telah dikeluarkan komen untuk hari ini, tetapi versi 443 00:19:35,530 --> 00:19:38,660 kod dalam talian rujukan mempunyai semua komen. 444 00:19:38,660 --> 00:19:40,171 Apa yang saya seolah-olah melakukan? 445 00:19:40,171 --> 00:19:42,530 >> PENONTON: Menyimpan fail dengan semua maklumat yang pengguna yang dimasukkan. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. MALAN: Ya, betul-betul, ini adalah cara yang baru 447 00:19:44,530 --> 00:19:46,370 yang kita lihat dua, satu lagi ciri C, 448 00:19:46,370 --> 00:19:48,700 di mana saya boleh membuat fail sendiri. 449 00:19:48,700 --> 00:19:51,580 Setakat ini, hampir setiap program anda tulis adalah tidak bernegara. 450 00:19:51,580 --> 00:19:53,334 Sebaik sahaja ia dilakukan berjalan, itu sahaja. 451 00:19:53,334 --> 00:19:55,000 Tidak ada memori atau ingatan itu. 452 00:19:55,000 --> 00:19:56,110 Tiada fail yang disimpan. 453 00:19:56,110 --> 00:19:58,120 Tetapi jika anda mahu menyelamatkan input yang mempunyai 454 00:19:58,120 --> 00:20:02,100 berlaku, seperti dalam permainan atau program seperti ini, ternyata kita boleh berbuat demikian. 455 00:20:02,100 --> 00:20:04,360 Dan anda akan melihat ini lebih dalam pset 4 dan Bahagian. 456 00:20:04,360 --> 00:20:08,661 Tetapi garis 23 dasarnya mencipta fail yang dipanggil students.csv. 457 00:20:08,661 --> 00:20:10,160 Dan anda mungkin telah melihat ini sebelum ini. 458 00:20:10,160 --> 00:20:14,250 Walaupun anda tidak pernah belajar CS sebelum ini, CSV adalah pembolehubah yang dipisahkan dengan koma. 459 00:20:14,250 --> 00:20:19,000 Ia seperti seorang lelaki yang sangat miskin versi fail Excel, 460 00:20:19,000 --> 00:20:22,270 yang bermaksud bahawa ia boleh dibuka dalam Excel dan dalam Bilangan Apple, 461 00:20:22,270 --> 00:20:23,830 dan ia mempunyai baris dan lajur. 462 00:20:23,830 --> 00:20:26,485 Tetapi ia bukan proprietari format seperti Microsoft atau Apple. 463 00:20:26,485 --> 00:20:29,840 Ia hanya koma memisahkan nilai-nilai yang kita akan melihat dalam seketika. 464 00:20:29,840 --> 00:20:31,010 >> Dan hanya mengambil tekaan. 465 00:20:31,010 --> 00:20:33,480 Selaras 23, sekurang- akhir, hujah saya yang kedua 466 00:20:33,480 --> 00:20:37,700 dengan fungsi baru ini dipanggil f terbuka untuk fail terbuka w. 467 00:20:37,700 --> 00:20:39,430 Apa yang mungkin w menandakan? 468 00:20:39,430 --> 00:20:40,022 Ya? 469 00:20:40,022 --> 00:20:41,260 >> PENONTON: Ia membolehkan anda menulis kepada fail? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. MALAN: Ia membolehkan anda menulis kepada fail. 471 00:20:42,630 --> 00:20:44,810 Jadi ada beberapa variasi yang kita boleh pasangkan di sini. 472 00:20:44,810 --> 00:20:47,184 Tetapi jika anda hanya mahu membaca fail, yang melihat ia 473 00:20:47,184 --> 00:20:50,010 dan membacanya ke dalam ingatan, anda hanya menggunakan quote unquote "r". 474 00:20:50,010 --> 00:20:53,110 Jika anda ingin menulis surat kepada fail, anda menggunakan quote unquote "w". 475 00:20:53,110 --> 00:20:55,190 Ada juga menambah dan beberapa perkara lain 476 00:20:55,190 --> 00:20:57,356 jika anda ingin mengubah suai fail yang sedia ada. 477 00:20:57,356 --> 00:21:00,480 Sekarang kita akan terus melihat ini perkara, maka kita akan kembali ke talian 24. 478 00:21:00,480 --> 00:21:02,640 NULL, ia ternyata, nilai khas yang 479 00:21:02,640 --> 00:21:06,070 boleh dipulangkan oleh fungsi-fungsi tertentu jika sesuatu yang telah pergi wrong-- 480 00:21:06,070 --> 00:21:08,490 jika fail yang tidak wujud, jika anda telah kehabisan memori, 481 00:21:08,490 --> 00:21:09,620 atau sekumpulan kesilapan lain. 482 00:21:09,620 --> 00:21:13,470 Tetapi untuk sekarang, mari kita hanya menganggap bahawa ini adalah pemeriksaan ralat hanya konvensional. 483 00:21:13,470 --> 00:21:17,090 Di sini di baris 26, saya iterating 0-3 ke atas semua pelajar saya. 484 00:21:17,090 --> 00:21:20,470 Dan ini adalah jenis jenis sesuatu fungsi baru, fprintf, 485 00:21:20,470 --> 00:21:21,460 tetapi hanya mengambil tekaan. 486 00:21:21,460 --> 00:21:24,370 Jika printf hanya cetak rentetan diformat, 487 00:21:24,370 --> 00:21:26,507 apakah fprintf mungkin bermakna? 488 00:21:26,507 --> 00:21:27,590 PENONTON: Cetak ke fail. 489 00:21:27,590 --> 00:21:29,290 DAVID J. MALAN: Cetak yang rentetan diformat ke fail. 490 00:21:29,290 --> 00:21:31,180 Itulah apa tambahan f cara adalah fail. 491 00:21:31,180 --> 00:21:36,420 Dan hujah pertama yang baru telah menjadi pembolehubah yang mewakili fail anda. 492 00:21:36,420 --> 00:21:38,866 Maka kita hanya mempunyai format rentetan seperti printf. 493 00:21:38,866 --> 00:21:40,740 Dan walaupun ini sintaks yang baru, ini hanya 494 00:21:40,740 --> 00:21:44,610 ertinya pasangkan nama pelajar, plug-di asrama pelajar, dan kemudian 495 00:21:44,610 --> 00:21:47,160 dengan fclose, tutup fail. 496 00:21:47,160 --> 00:21:49,730 Dan kemudian lastly-- ini adalah baru dan kami akan kembali kepada ini 497 00:21:49,730 --> 00:21:53,240 sebelum long-- saya membebaskan pelajar atas sebab-sebab 498 00:21:53,240 --> 00:21:54,860 yang berlaku sehingga di atas sana. 499 00:21:54,860 --> 00:21:56,820 Tetapi kita akan kembali itu sebelum long-- 500 00:21:56,820 --> 00:21:59,820 itu kerana bagaimana GetString adalah sebenarnya bekerja di bawah hood. 501 00:21:59,820 --> 00:22:01,280 >> Jadi mari kita lihat cepat di sini. 502 00:22:01,280 --> 00:22:04,380 Saya menaip ls di dalam direktori saya, melihat bahawa saya tidak 503 00:22:04,380 --> 00:22:09,360 mempunyai fail yang dipanggil students.csv, hanya tidak ada, tidak wujud. 504 00:22:09,360 --> 00:22:14,965 Jadi, jika saya kini menyusun program ini, membuat structs-1,. / structs-1, 505 00:22:14,965 --> 00:22:20,570 dan saya akan pergi ke hadapan dan taip Andi, yang tinggal di Berkeley di Yale. 506 00:22:20,570 --> 00:22:26,350 Kami akan mempunyai Rob yang tinggal di Thayer hari ini. 507 00:22:26,350 --> 00:22:33,760 Dan mari kita datang dengan mana adalah, saya fikir, Maria di Mather, 508 00:22:33,760 --> 00:22:35,100 jika saya ingat dengan betul. 509 00:22:35,100 --> 00:22:36,460 >> Jadi tiada apa yang berlaku. 510 00:22:36,460 --> 00:22:40,680 Tetapi jika saya menaip ls sekarang, terdapat students.csv. 511 00:22:40,680 --> 00:22:43,080 Mari kita pergi ke hadapan dan students.csv terbuka. 512 00:22:43,080 --> 00:22:46,050 Dan itulah yang sangat file format ringan. 513 00:22:46,050 --> 00:22:49,570 Tetapi saya hanya pakai konvensyen bahawa saya mempunyai dua baris dan lajur di sini. 514 00:22:49,570 --> 00:22:52,020 Lajur pertama ialah nama pertama rakyat. 515 00:22:52,020 --> 00:22:55,740 Lajur kedua ialah pelajar yang asrama, atau kolej, atau rumah, atau barang kecil. 516 00:22:55,740 --> 00:22:57,900 Dan sekarang saya telah menyimpan ini secara kekal dalam fail. 517 00:22:57,900 --> 00:22:59,280 >> Jadi ia tidak semua yang menarik. 518 00:22:59,280 --> 00:23:02,980 Tetapi ini hanya batu loncatan sekarang untuk dapat maklumat berterusan 519 00:23:02,980 --> 00:23:04,040 selama-lamanya. 520 00:23:04,040 --> 00:23:08,340 Jadi mari kita lihat sekarang apa lagi yang kita boleh lakukan dengan ini dan lain-lain ciri-ciri. 521 00:23:08,340 --> 00:23:10,729 Tetapi pertama, apa-apa soalan? 522 00:23:10,729 --> 00:23:12,145 Itu adalah banyak, dan yang cepat. 523 00:23:12,145 --> 00:23:16,131 Tetapi anda akan melihat banyak lebih dalam pset 4, juga. 524 00:23:16,131 --> 00:23:16,630 Ya? 525 00:23:16,630 --> 00:23:19,360 >> PENONTON: Adakah terdapat cara untuk terus menambah nama-nama ke fail tersebut? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. MALAN: Soalan yang baik. 527 00:23:19,880 --> 00:23:21,800 Adakah terdapat cara untuk terus menambah nama kepada fail ini? 528 00:23:21,800 --> 00:23:22,340 Ya. 529 00:23:22,340 --> 00:23:24,630 Dan, sebenarnya, jika anda menamatkan up semula membuka fail, 530 00:23:24,630 --> 00:23:26,780 anda akan menggunakan quote unquote "a" untuk tambah, 531 00:23:26,780 --> 00:23:31,090 yang hanya akan menambah baris baru, baris baru lagi dan lagi, betul-betul. 532 00:23:31,090 --> 00:23:32,010 Soalan yang baik. 533 00:23:32,010 --> 00:23:32,950 Soalan-soalan lain? 534 00:23:32,950 --> 00:23:33,450 Ya? 535 00:23:33,450 --> 00:23:35,580 PENONTON: Jika anda berlari program lagi sekarang, 536 00:23:35,580 --> 00:23:38,000 ia akan terus menambah nama-nama kepada fail atau ia akan membuka fail baru? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. MALAN: Ah, soalan yang baik. 538 00:23:38,740 --> 00:23:41,448 Jika anda berlari program sekali lagi betul sekarang, mungkin ditaip dalam nama-nama baru, 539 00:23:41,448 --> 00:23:44,820 ia akan menambah ke fail atau menulis ganti fail? 540 00:23:44,820 --> 00:23:47,420 Yang terakhir ini, kerana saya tidak menggunakan mod tambah. 541 00:23:47,420 --> 00:23:49,930 Dan kerana saya hanya membuta tuli membuka fail untuk menulis, 542 00:23:49,930 --> 00:23:51,310 ia hanya akan menulis ganti fail. 543 00:23:51,310 --> 00:23:54,570 Jadi saya memang akan perlu lakukan adalah menambah, jika saya ingin benar-benar mempunyai jangka panjang 544 00:23:54,570 --> 00:23:55,350 pangkalan data. 545 00:23:55,350 --> 00:23:58,220 >> Sekarang CSV berguna, terus-terang, walaupun untuk seperti jika anda writing-- 546 00:23:58,220 --> 00:24:00,100 dan akhirnya kita akan melihat ini kemudian pada semester apabila 547 00:24:00,100 --> 00:24:01,455 kita menggunakan CSVs untuk tujuan lain. 548 00:24:01,455 --> 00:24:04,920 Jika anda ingin menyimpan semua rakyat yang telah mendaftar untuk acara tertentu, 549 00:24:04,920 --> 00:24:07,420 atau mendaftar untuk pelajar anda kumpulan, atau sesuatu seperti itu, 550 00:24:07,420 --> 00:24:10,330 menyimpan data dalam jenis ini format adalah super mudah. 551 00:24:10,330 --> 00:24:12,580 Kerana secara literal, jika saya adalah untuk memuat turun fail ini. 552 00:24:12,580 --> 00:24:14,540 Saya boleh double-- dan mari kita sebenarnya cuba ini 553 00:24:14,540 --> 00:24:16,720 jika saya mempunyai Excel atau Nombor di sini. 554 00:24:16,720 --> 00:24:19,130 >> Saya akan klik kanan atau kawalan-klik fail saya. 555 00:24:19,130 --> 00:24:20,020 Alamak. 556 00:24:20,020 --> 00:24:21,830 Klik kanan atau kawalan-klik fail saya. 557 00:24:21,830 --> 00:24:24,960 Ayuh, tetikus saya tidak bekerjasama. 558 00:24:24,960 --> 00:24:32,694 Download-- saya akan memuat turun semua fail di sini supaya 559 00:24:32,694 --> 00:24:33,860 hanya jadi saya boleh turun satu ini. 560 00:24:33,860 --> 00:24:37,850 Dan mari kita lihat jika ini kerja-kerja students.csv-- kali pertama 561 00:24:37,850 --> 00:24:39,310 Saya telah diaktifkan. 562 00:24:39,310 --> 00:24:41,360 Kini mereka mahu melihat kenalan saya. 563 00:24:41,360 --> 00:24:44,310 Sekarang, saya perlu mendaftar. 564 00:24:44,310 --> 00:24:47,620 Melihat betapa mudahnya adalah dengan menggunakan CSVs? 565 00:24:47,620 --> 00:24:50,840 Ya, menyimpannya sehingga setakat ini. 566 00:24:50,840 --> 00:24:52,375 OK, sekarang kita sudah bersedia untuk kelas. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, apa yang baru? 569 00:25:00,370 --> 00:25:02,920 OK, rapat. 570 00:25:02,920 --> 00:25:04,750 Itu adalah ajaib. 571 00:25:04,750 --> 00:25:07,280 OK, sekarang kita perlu dikemas kini. 572 00:25:07,280 --> 00:25:10,890 Dan kini, ia terlupa apa memfailkan saya asalnya dibuka, 573 00:25:10,890 --> 00:25:13,090 tetapi apa yang a-- ada kita pergi. 574 00:25:13,090 --> 00:25:16,341 OK, jadi sekarang kita mempunyai fail Excel. 575 00:25:16,341 --> 00:25:18,290 Terima kasih. 576 00:25:18,290 --> 00:25:20,764 >> OK, jadi apa yang saya lakukan adalah bahagian yang mudah. 577 00:25:20,764 --> 00:25:23,930 Sudah tentu saya boleh mempunyai pra-dipasang Excel atau Nombor, atau apa sahaja program. 578 00:25:23,930 --> 00:25:25,846 Tetapi ini adalah baik, kerana sekarang saya boleh memanipulasi 579 00:25:25,846 --> 00:25:28,090 data dalam format yang standard. 580 00:25:28,090 --> 00:25:30,294 >> Jadi sekarang mari kita konteks beralih ke mana kita berhenti 581 00:25:30,294 --> 00:25:32,710 Kali terakhir, yang adalah untuk mula untuk mengambil kira roda latihan. 582 00:25:32,710 --> 00:25:34,543 Tetapi pertama, anda tidak melihat makan tengah hari sebelum ini 583 00:25:34,543 --> 00:25:38,150 sekali lagi berlaku di sini di Bomba dan Ais di Cambridge, Sitar di New Haven. 584 00:25:38,150 --> 00:25:43,150 Daftar di laman web CS50s ASAP untuk menyertai pelajar CS50 dan kakitangan. 585 00:25:43,150 --> 00:25:46,090 >> Oleh itu, kita mengambil roda latihan off pada hari Isnin sebagai follows-- 586 00:25:46,090 --> 00:25:49,120 rentetan telah diisytiharkan di Perpustakaan CS50s untuk beberapa ketika. 587 00:25:49,120 --> 00:25:52,650 Dan ia adalah baik, kerana ia membolehkan kita bercakap tentang pembolehubah sebagai 588 00:25:52,650 --> 00:25:54,660 kata-kata yang lengkap dan ayat dan banyak lagi. 589 00:25:54,660 --> 00:25:56,710 Tetapi ternyata rentetan tidak wujud. 590 00:25:56,710 --> 00:26:00,200 Itu baru sinonim, atau alias, bahawa kami telah mencipta sesuatu yang 591 00:26:00,200 --> 00:26:03,780 sebenarnya adalah lebih sedikit teknikal dipanggil char *. 592 00:26:03,780 --> 00:26:07,900 >> Dan sesungguhnya, kita lihat contoh program pada hari Isnin 593 00:26:07,900 --> 00:26:11,200 yang tidak berkelakuan agak seperti yang kita harapkan. 594 00:26:11,200 --> 00:26:13,630 Ini adalah fail, membandingkan-0. 595 00:26:13,630 --> 00:26:17,910 Dan ingat bahawa perbandingan-0, jika Saya susun semula program Isnin 596 00:26:17,910 --> 00:26:22,670 dan menjalankan perbandingan-0 dan taip ibu dalam huruf kecil, dan ibu dalam huruf kecil lagi. 597 00:26:22,670 --> 00:26:25,320 Program ini menegaskan Saya menaip perkara yang berbeza, 598 00:26:25,320 --> 00:26:29,210 walaupun ibu, semua dalam huruf kecil, adalah sama secara visual. 599 00:26:29,210 --> 00:26:31,990 Oleh itu, apa jawapan pendek mengapa komputer yang difikirkan 600 00:26:31,990 --> 00:26:34,500 kedua-dua tali berbeza? 601 00:26:34,500 --> 00:26:35,250 Ya? 602 00:26:35,250 --> 00:26:36,534 >> PENONTON: [didengar] 603 00:26:36,534 --> 00:26:37,450 DAVID J. MALAN: Betul. 604 00:26:37,450 --> 00:26:39,600 Jadi, ibu, kali pertama Saya menaip dalam, sedang 605 00:26:39,600 --> 00:26:42,710 disimpan di suatu tempat di komputer saya memori tetapi di lokasi yang berbeza 606 00:26:42,710 --> 00:26:44,690 daripada kali kedua saya taip ibu. 607 00:26:44,690 --> 00:26:46,580 Sekarang ia sudah tentu dapat dioptimumkan. 608 00:26:46,580 --> 00:26:49,205 Komputer boleh menjadi pintar dan menyedari kedua-dua tali, hey, 609 00:26:49,205 --> 00:26:49,954 mereka sama. 610 00:26:49,954 --> 00:26:51,520 Janganlah aku redundantly menyimpannya. 611 00:26:51,520 --> 00:26:54,229 Tetapi komputer tidak berbuat demikian pengoptimuman kecuali anda memberitahu mereka untuk. 612 00:26:54,229 --> 00:26:56,061 Jadi, secara lalai, mereka hanya akan berakhir 613 00:26:56,061 --> 00:26:57,670 di dua tempat yang berbeza dalam ingatan. 614 00:26:57,670 --> 00:27:01,570 Dan supaya menjadi lebih jelas, apabila kita berbanding dua tali, 615 00:27:01,570 --> 00:27:03,950 yang pertama telah dipanggil s, yang kedua dipanggil 616 00:27:03,950 --> 00:27:08,530 t, apa yang khusus telah saya membandingkan sini pada baris 13? 617 00:27:08,530 --> 00:27:09,494 Yeah. 618 00:27:09,494 --> 00:27:12,390 >> PENONTON: Ia adalah tempat yang dalam ingatan yang berubah-ubah akan menunjukkan. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. MALAN: Tepat sekali, saya membandingkan tempat dalam ingatan 620 00:27:14,900 --> 00:27:16,300 bahawa orang-orang pembolehubah menunjukkan kepada. 621 00:27:16,300 --> 00:27:20,560 Jadi secara khusus, jika ibu berada di bilangan bait 1 dan 2, dan 3, 622 00:27:20,560 --> 00:27:24,020 dan 4-- kerana ingat backslash 0 perlu sepanjang jalan pada akhir. 623 00:27:24,020 --> 00:27:29,420 Dan contoh lain ibu, m-o-m, adalah di alamat 10, 11, 12, dan 13. 624 00:27:29,420 --> 00:27:33,100 Saya membandingkan 1, alamat itu, lokasi itu dalam ingatan, 625 00:27:33,100 --> 00:27:35,160 terhadap 10, yang merupakan jelas tidak sama. 626 00:27:35,160 --> 00:27:36,260 1 tidak 10. 627 00:27:36,260 --> 00:27:39,620 >> Jadi ini adalah baik kerana ia cukup mudah. 628 00:27:39,620 --> 00:27:42,870 Tetapi ia bermasalah setakat yang kita tidak boleh seolah-olah untuk membandingkan tali. 629 00:27:42,870 --> 00:27:44,930 Jadi fundamentally-- dan pada tahap yang rendah ini, 630 00:27:44,930 --> 00:27:47,300 jika anda mahu untuk melaksanakan program untuk membandingkan 631 00:27:47,300 --> 00:27:50,270 dua perkataan berasingan bahawa pengguna telah ditaip dalam untuk kualiti, 632 00:27:50,270 --> 00:27:53,944 adakah mereka beratur untuk char char, hanya secara umum, 633 00:27:53,944 --> 00:27:55,360 apa yang perlu kita lakukan, nampaknya? 634 00:27:55,360 --> 00:27:57,940 Ia tidak mencukupi hanya untuk melihat kedua-dua alamat. 635 00:27:57,940 --> 00:27:58,860 Apa yang perlu kita lakukan? 636 00:27:58,860 --> 00:27:59,360 Ya? 637 00:27:59,360 --> 00:28:01,120 >> PENONTON: Melelar melalui tali [didengar]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. MALAN: Ya, mari kita melelar melalui tali. 639 00:28:02,600 --> 00:28:05,808 Mari kita gunakan untuk gelung, gelung sementara, atau apa sahaja yang anda paling selesa dengan. 640 00:28:05,808 --> 00:28:08,840 Dan jika kami mempunyai dua tali di suatu tempat dalam ingatan, mari kita lihat pada setiap yang 641 00:28:08,840 --> 00:28:11,770 Watak pertama, maka setiap yang kedua watak, kemudian ketiga, dan keempat, 642 00:28:11,770 --> 00:28:15,206 dan kelima, sehingga kita mencapai apa nilai sentinel istimewa? 643 00:28:15,206 --> 00:28:16,080 PENONTON: [didengar] 644 00:28:16,080 --> 00:28:18,800 DAVID J. MALAN: Ya, backslash sifar, di mana titik sama ada rentetan 645 00:28:18,800 --> 00:28:20,100 kita boleh membuat keputusan itu sahaja. 646 00:28:20,100 --> 00:28:21,970 Adakah kita telah dipadankan setiap watak tunggal? 647 00:28:21,970 --> 00:28:22,990 Jika tidak, kembali palsu. 648 00:28:22,990 --> 00:28:24,770 Jika ya, kembali benar. 649 00:28:24,770 --> 00:28:28,800 Dan supaya betul-betul apa versi ini program membandingkan-1.c tidak. 650 00:28:28,800 --> 00:28:31,677 Ia adalah sama dengan apa yang kita melihat Isnin kecuali bahawa saya telah 651 00:28:31,677 --> 00:28:34,760 mendapat menghapuskan daripada rentetan perkataan walaupun yang tidak mempunyai impact-- berfungsi semua 652 00:28:34,760 --> 00:28:37,450 Saya lakukan sekarang adalah membuang beberapa roda latihan visual, 653 00:28:37,450 --> 00:28:40,880 tetapi untuk melihat dengan jelas bahawa s dan t adalah alamat. 654 00:28:40,880 --> 00:28:43,020 Dan itulah apa yang bintang, asterisk, mewakili 655 00:28:43,020 --> 00:28:46,690 adalah alamat, atau dikenali lebih teknikal sebagai penunjuk. 656 00:28:46,690 --> 00:28:49,880 >> Oleh itu, apabila saya mengaku s pada line 9 dan berkata char * s, 657 00:28:49,880 --> 00:28:52,160 itu tidak bermakna memberi saya rentetan. 658 00:28:52,160 --> 00:28:56,360 Ini bermakna memberi saya pembolehubah yang tujuan dalam hidup adalah untuk menyimpan alamat. 659 00:28:56,360 --> 00:29:00,400 Kerana saya kira-kira untuk meletakkan alamat rentetan ke dalamnya. 660 00:29:00,400 --> 00:29:03,500 Dan sesungguhnya GetString, untuk menjadi jelas, tidak akan kembali rentetan. 661 00:29:03,500 --> 00:29:06,110 Ia tidak kembali ibu garis miring sifar, per se. 662 00:29:06,110 --> 00:29:10,005 Apakah GetString khusus dan tepat kembali? 663 00:29:10,005 --> 00:29:10,880 PENONTON: [didengar] 664 00:29:10,880 --> 00:29:14,080 DAVID J. MALAN: Satu alamat, alamat aksara pertama 665 00:29:14,080 --> 00:29:16,070 dalam beberapa rentetan ia telah mendapat. 666 00:29:16,070 --> 00:29:19,250 Dan sekarang kita lihat kata kunci yang khas lagi. 667 00:29:19,250 --> 00:29:20,640 Dan, saya dirujuk kepada ini lebih awal. 668 00:29:20,640 --> 00:29:23,620 Ini akan menjadi adat baik bahawa kita akan melihat sekali lagi dan sekali lagi sekarang. 669 00:29:23,620 --> 00:29:27,540 Saya memeriksa memastikan bahawa s tidak batal dan t tidak null. 670 00:29:27,540 --> 00:29:30,100 Kerana berdasarkan saya benar-benar sebutan cepat sebelum ini, 671 00:29:30,100 --> 00:29:35,510 apa yang mungkin bermakna jika GetString tidak mengembalikan alamat tetapi N-U-L-L, yang sekali lagi, 672 00:29:35,510 --> 00:29:36,990 beberapa nilai istimewa? 673 00:29:36,990 --> 00:29:37,890 >> PENONTON: Error. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. MALAN: Ia ralat. 675 00:29:38,600 --> 00:29:39,550 Ada sesuatu yang tidak salah. 676 00:29:39,550 --> 00:29:41,341 Dan apa yang biasanya mungkin berlaku, terutamanya 677 00:29:41,341 --> 00:29:45,162 dengan yang strings-- mungkin panjang tidak diketahui di advance-- 678 00:29:45,162 --> 00:29:46,870 mungkin komputer ' daripada ingatan, mungkin 679 00:29:46,870 --> 00:29:49,280 anda taip dalam apa-apa perkataan lama atau ayat 680 00:29:49,280 --> 00:29:51,880 atau ditampal seperti esei yang besar ada hanya tidak cukup memori. 681 00:29:51,880 --> 00:29:55,340 Dan sebagainya GetString tidak boleh kembali alamat segala-galanya, 682 00:29:55,340 --> 00:29:56,620 jadi ia hanya mengembalikan apa-apa. 683 00:29:56,620 --> 00:30:00,580 Dan ia berkata kesilapan yang telah berlaku dengan mengembalikan nilai NULL khas. 684 00:30:00,580 --> 00:30:02,890 Ia alamat sifar, jadi untuk bercakap. 685 00:30:02,890 --> 00:30:06,157 >> Kini ternyata C datang dengan fungsi yang melakukan lelaran itu. 686 00:30:06,157 --> 00:30:09,240 Kami tidak mempunyai untuk melaksanakan ini dengan untuk gelung atau gelung sementara diri kita sendiri. 687 00:30:09,240 --> 00:30:11,150 Kita boleh menggunakan fungsi, dipanggil ringkas, 688 00:30:11,150 --> 00:30:15,400 menggerakkan kompas, atau tali membandingkan, yang tujuan dalam hidup adalah untuk melakukan perkara tersebut. 689 00:30:15,400 --> 00:30:19,990 Anda memberikan dua petunjuk, dua alamat, dan ia akan pergi ke alamat 690 00:30:19,990 --> 00:30:23,130 dan kemudian bandingkan surat untuk surat surat untuk kualiti, 691 00:30:23,130 --> 00:30:26,610 berhenti hanya apabila apa yang benar? 692 00:30:26,610 --> 00:30:31,540 Apabila intuitif perlu kacau comp berhenti iterating, hanya untuk menjadi nyata? 693 00:30:31,540 --> 00:30:35,400 Apabila ia mencecah garis sendeng terbalik 0 dalam sama ada tali, di mana titik ia boleh membuat keputusan 694 00:30:35,400 --> 00:30:38,910 segala-galanya telah dipadankan, atau telah terdapat percanggahan? 695 00:30:38,910 --> 00:30:42,740 >> Jadi, jika kita menjalankan ini sekarang dan cuba permainan permodalan kecil kita, 696 00:30:42,740 --> 00:30:49,260 sehingga membuat perbandingan-1, ./compare-1, dan menaip ibu dalam huruf kecil kedua-dua kali. 697 00:30:49,260 --> 00:30:50,560 Kini ia adalah perkara yang sama. 698 00:30:50,560 --> 00:30:54,080 Dan jika saya melakukannya sekali lagi dengan huruf kecil dan kemudian mungkin huruf besar. 699 00:30:54,080 --> 00:30:56,720 Kini ia memang membezakan antara huruf besar dan huruf kecil. 700 00:30:56,720 --> 00:31:00,440 Jadi tidak semua yang keras atau ajaib, tetapi ia kini menerangkan 701 00:31:00,440 --> 00:31:03,140 apa yang sedang berlaku di bawah hood. 702 00:31:03,140 --> 00:31:07,640 >> Jadi apa lagi yang boleh kita mengeluarkan dari jenis ini pelajaran? 703 00:31:07,640 --> 00:31:08,980 Jadi mari kita lihat ini. 704 00:31:08,980 --> 00:31:15,380 Saya akan pergi ke hadapan dan menulis program cepat di sini dipanggil salinan-0. 705 00:31:15,380 --> 00:31:21,594 Dan sekarang mari kita pergi ke depan dan benar-benar mari kita buat this-- dengan salinan-0, 706 00:31:21,594 --> 00:31:23,010 kita lihat apa yang saya dapat di sini. 707 00:31:23,010 --> 00:31:24,712 Saya mula-mula memberitahu pengguna, mengatakan sesuatu. 708 00:31:24,712 --> 00:31:26,420 Kemudian saya mendapatkan tali yang dan saya menyimpannya di dalam s. 709 00:31:26,420 --> 00:31:29,810 Kemudian saya memeriksa jika s sama sama NULL, hanya kembali 1. 710 00:31:29,810 --> 00:31:31,590 Jadi ini adalah hanya semakan ralat piawai. 711 00:31:31,590 --> 00:31:33,112 Tiada apa-apa yang menarik berlaku. 712 00:31:33,112 --> 00:31:36,320 Dan sebenarnya, jika kita menghilangkan kesilapan memeriksa, ini kelihatan seperti minggu 1 kod 713 00:31:36,320 --> 00:31:36,985 pada masa ini. 714 00:31:36,985 --> 00:31:39,110 Tetapi saya telah mula mendapat sedikit lebih baik tentang itu. 715 00:31:39,110 --> 00:31:43,340 >> Sekarang dalam talian 16, seminggu lalu, mungkin walaupun pasangan hari atau minit yang lalu, 716 00:31:43,340 --> 00:31:46,720 anda mungkin berkata garis 16 adalah mewujudkan pembolehubah dipanggil t 717 00:31:46,720 --> 00:31:48,219 dan penyalinan s ke dalamnya. 718 00:31:48,219 --> 00:31:50,010 Dan itulah yang sempurna Fleet munasabah. 719 00:31:50,010 --> 00:31:51,560 Tetapi lebih tepat sekarang. 720 00:31:51,560 --> 00:31:54,190 Apa yang berlaku di garis 16? 721 00:31:54,190 --> 00:31:56,170 Apa yang mendapat disalin dari kanan ke kiri? 722 00:31:56,170 --> 00:31:56,669 Ya? 723 00:31:56,669 --> 00:31:58,490 PENONTON: Apakah t mendapat alamat sesuatu s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. MALAN: Tepat, t semakin alamat s. 725 00:32:01,220 --> 00:32:05,170 Jadi untuk menjadi jelas sekarang, jika saya pergi kembali kepada contoh yang awal 726 00:32:05,170 --> 00:32:08,520 dan saya menarik keluar perkara yang saya telah ditaip. 727 00:32:08,520 --> 00:32:11,640 Dan apa yang saya telah ditaip dalam- inilah s, dan di sini 728 00:32:11,640 --> 00:32:15,830 adalah apa yang saya telah ditaip di suatu tempat di ingatan, ibu dan kemudian garis sendeng terbalik yang 729 00:32:15,830 --> 00:32:17,840 0 yang yang ditambah untuk saya. 730 00:32:17,840 --> 00:32:23,060 Apa yang saya disimpan di sini, masih ingat, ini adalah pada lokasi 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 ini adalah apa yang kini dalam s. 732 00:32:24,655 --> 00:32:29,220 Jadi, jika pada baris 16 Aku berkata memberi saya pembolehubah dipanggil lain t dan menyimpan 733 00:32:29,220 --> 00:32:33,590 dalam pada nilai s, apa akan disimpan di sini tidak akan ibu 734 00:32:33,590 --> 00:32:35,480 tetapi hanya nombor 1. 735 00:32:35,480 --> 00:32:38,520 >> Jadi, jika kita melihat ke hadapan dalam program ini sekarang, apa yang akan berlaku? 736 00:32:38,520 --> 00:32:40,690 Jadi notis bahawa ada fungsi ini anda mungkin 737 00:32:40,690 --> 00:32:44,410 telah menggunakan ini sedikit masa lalu untuk Caesar, atau Vigenere, atau mungkin tidak sama sekali. 738 00:32:44,410 --> 00:32:48,170 Saya menuntut dengan printf saya, saya akan mengambil kesempatan salinan t. 739 00:32:48,170 --> 00:32:51,616 Pertama dalam talian 19, kewarasan cepat cek, cek strlen panjang t. 740 00:32:51,616 --> 00:32:53,740 Kerana saya tidak mahu cuba untuk mengambil kesempatan ke sesuatu 741 00:32:53,740 --> 00:32:55,104 jika tidak ada tali di sana. 742 00:32:55,104 --> 00:32:57,520 Jika pengguna hanya tekan Enter, tiada apa-apa untuk mengambil kesempatan. 743 00:32:57,520 --> 00:33:01,100 Jadi, saya tidak mahu melakukan line 21. 744 00:33:01,100 --> 00:33:05,758 Jadi garis 21 mengambil kesempatan mana surat, nampaknya, dalam t? 745 00:33:05,758 --> 00:33:06,514 >> PENONTON: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. MALAN: Ia kelihatan seperti ia penyalinan yang mana satu? 747 00:33:08,722 --> 00:33:09,486 PENONTON: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. MALAN: Eh, m. 749 00:33:10,450 --> 00:33:12,685 OK, jadi m yang pertama, kerana notis bahawa saya 750 00:33:12,685 --> 00:33:14,935 berpindah kepada toupper, yang jika anda tidak pernah melihat ia itu 751 00:33:14,935 --> 00:33:16,980 hanya fungsi untuk mengambil kesempatan sebagai input. 752 00:33:16,980 --> 00:33:20,240 t kurungan sifar bermakna memberi saya watak sifar t. 753 00:33:20,240 --> 00:33:22,550 Dan sebagainya bagaimana ini perubahan picture, perlu jelas? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Apa yang perlu untuk ditulis semula atau diubah berkenaan dengan s dan t dan ibu 756 00:33:29,160 --> 00:33:30,097 sifar garis sendeng terbalik. 757 00:33:30,097 --> 00:33:31,470 >> PENONTON: [didengar] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. MALAN: Ya, jadi yang satu ini di sini semata-mata 759 00:33:34,030 --> 00:33:40,860 keperluan untuk berubah supaya- menetapkan this-- perlu mendapatkan ditukar kepada m modal. 760 00:33:40,860 --> 00:33:44,330 Tetapi sekarang, lihatlah kemudian dalam program, jika saya mencetak 761 00:33:44,330 --> 00:33:49,800 s dan t seperti yang saya membersihkan sini, menonton apa yang akan berlaku mencetak s dan t. 762 00:33:49,800 --> 00:33:54,310 Oleh itu, salinan-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Biar saya pergi ke hadapan dan taip di ibu dalam semua huruf kecil. 764 00:33:57,140 --> 00:34:00,140 Perhatikan kedua-dua asal dan salinan yang telah dipermodalkan. 765 00:34:00,140 --> 00:34:00,850 Mengapa? 766 00:34:00,850 --> 00:34:04,431 Nah, s dan t kedua-duanya menunjuk ke, jika anda akan, sebahagian yang sama ingatan. 767 00:34:04,431 --> 00:34:06,930 Dan terus terang, ini semakin benar-benar uninteresting-- fakta 768 00:34:06,930 --> 00:34:09,150 bahawa kita menggunakan alamat sifar di sini. 769 00:34:09,150 --> 00:34:11,719 Maksud saya, saya tidak peduli di mana barangan adalah dalam ingatan. 770 00:34:11,719 --> 00:34:13,550 Maaf saya memadamkan sedikit terlalu banyak. 771 00:34:13,550 --> 00:34:15,674 Tetapi saya tidak peduli di mana perkara-perkara yang dalam ingatan. 772 00:34:15,674 --> 00:34:18,510 Dan sebagainya, sesungguhnya apa pengaturcara cenderung untuk berfikir tentang 773 00:34:18,510 --> 00:34:21,080 ialah apabila anda bercakap tentang alamat, atau penunjuk, 774 00:34:21,080 --> 00:34:22,679 yang mengambil berat di mana ia adalah dalam ingatan. 775 00:34:22,679 --> 00:34:24,989 Saya tidak peduli, kalau di bait satu atau satu bilion. 776 00:34:24,989 --> 00:34:27,920 Saya hanya peduli bahawa ini pembolehubah adalah berkesan 777 00:34:27,920 --> 00:34:29,620 menghala ke arah yang sebahagian memori. 778 00:34:29,620 --> 00:34:33,350 Dan sebagainya, selepas ini, bukannya berdalih lebih alamat ingatan sewenang-wenangnya, mari kita 779 00:34:33,350 --> 00:34:36,710 hanya mula untuk menarik petunjuk sebagai petunjuk, sebagai anak panah. 780 00:34:36,710 --> 00:34:39,340 Jadi apa s dan t yang sebenarnya, mengikut program ini, 781 00:34:39,340 --> 00:34:42,130 kerana bagaimana saya mencipta t, ia hanya dua pembolehubah berasingan 782 00:34:42,130 --> 00:34:43,840 menghala ke arah yang sama sebahagian memori. 783 00:34:43,840 --> 00:34:45,215 Dan kita tidak peduli di mana mereka berada. 784 00:34:45,215 --> 00:34:47,130 Oleh itu, kita boleh abstrak jauh detail itu. 785 00:34:47,130 --> 00:34:48,780 >> Jadi bagaimana saya boleh menetapkan ini? 786 00:34:48,780 --> 00:34:54,120 Jika saya mahu menulis versi salinan program yang benar-benar salinan tali 787 00:34:54,120 --> 00:34:56,840 dan memanfaatkan sahaja menyalin, hanya intuitif, 788 00:34:56,840 --> 00:34:59,766 apa yang mendapat menjadi satu ramuan untuk penyelesaian kami? 789 00:34:59,766 --> 00:35:00,640 PENONTON: [didengar] 790 00:35:00,640 --> 00:35:01,420 DAVID J. MALAN: Kami memerlukan apa? 791 00:35:01,420 --> 00:35:01,820 PENONTON: Chunk memori. 792 00:35:01,820 --> 00:35:03,280 DAVID J. MALAN: Kita perlu lain sebahagian memori, bukan? 793 00:35:03,280 --> 00:35:05,360 Kita tidak tahu bagaimana untuk melakukannya lagi, semestinya. 794 00:35:05,360 --> 00:35:11,330 Tetapi saya jenis perlu ini berlaku supaya bahawa ibu asal dalam kes yang lebih rendah 795 00:35:11,330 --> 00:35:14,170 berakhir dalam itu sebahagian tambahan memori. 796 00:35:14,170 --> 00:35:19,770 Dan kemudian apabila saya menukar salinan, saya tidak mahu mengubah salinan ini di sini. 797 00:35:19,770 --> 00:35:26,020 Saya bukannya mahu menukar sahaja ini salinan supaya asal tidak diubah. 798 00:35:26,020 --> 00:35:27,980 >> Jadi, mari kita lihat bagaimana kita boleh melakukan ini. 799 00:35:27,980 --> 00:35:31,800 Dalam salinan-1, yang telah telah dilucutkan komen, 800 00:35:31,800 --> 00:35:33,250 tetapi komen dalam talian. 801 00:35:33,250 --> 00:35:36,710 Kami bukannya melakukan following-- ini baris adalah sama, mendapatkan saya rentetan 802 00:35:36,710 --> 00:35:38,340 dan memanggil ia s. 803 00:35:38,340 --> 00:35:43,500 Tetapi sekarang mari kita lihat salah satu yang paling kami kompleks tetapi terakhir kerumitan 804 00:35:43,500 --> 00:35:47,340 untuk sementara, line 16 tidak betul-betul ini. 805 00:35:47,340 --> 00:35:49,400 Jadi, jika anda selesa dengan gambar kita hanya drew-- 806 00:35:49,400 --> 00:35:51,790 memberikan saya sebahagian baru ingatan, menyalin segala-galanya ke dalamnya, 807 00:35:51,790 --> 00:35:53,730 mari kita lihat bagaimana kita menterjemahkan kod. 808 00:35:53,730 --> 00:35:59,400 >> Jadi garis 16, di sebelah kiri, char * t memberikan saya ruang ini di sini. 809 00:35:59,400 --> 00:36:00,230 Itu sahaja yang ia. 810 00:36:00,230 --> 00:36:03,240 Di sebelah kanan, m alloc, atau malloc, 811 00:36:03,240 --> 00:36:06,480 adalah peruntukan memori, super mewah, cara yang samar hanya mengatakan 812 00:36:06,480 --> 00:36:07,640 memberikan saya sebahagian memori. 813 00:36:07,640 --> 00:36:09,290 Berapa banyak memori yang kita perlukan? 814 00:36:09,290 --> 00:36:10,910 Nah, adalah jenis ungkapan besar. 815 00:36:10,910 --> 00:36:12,570 Tetapi mari kita lihat apa yang dikatakan di sini. 816 00:36:12,570 --> 00:36:15,940 Jadi ini, sudah tentu, adalah memberikan saya panjang tali s. 817 00:36:15,940 --> 00:36:19,094 Jadi, ibu ia perlu apa? 818 00:36:19,094 --> 00:36:21,010 Jadi hanya tiga, bukan? ibu adalah tiga watak. 819 00:36:21,010 --> 00:36:22,830 Anda tidak mengira garis miring sifar apabila anda 820 00:36:22,830 --> 00:36:25,960 bercakap tentang panjang rentetan itu sebenarnya surat-surat boleh dilihat manusia. 821 00:36:25,960 --> 00:36:28,020 Jadi ibu, jadi ini memberikan saya 3. 822 00:36:28,020 --> 00:36:31,170 Tetapi tunggu satu minit, saya kini menambah 1. 823 00:36:31,170 --> 00:36:34,861 Mengapa saya benar-benar ingin memperuntukkan 4 bait dan bukan hanya 3? 824 00:36:34,861 --> 00:36:35,360 Ya? 825 00:36:35,360 --> 00:36:36,910 >> PENONTON: Untuk nilai sentinel? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. MALAN: Tepat sekali, untuk nilai sentinel. 827 00:36:38,951 --> 00:36:40,840 Untuk backslash sifar, Saya memerlukan 4 bait jumlah. 828 00:36:40,840 --> 00:36:42,870 Jadi saya perlu panjang tali plus 1. 829 00:36:42,870 --> 00:36:45,400 Dan kemudian hanya untuk measure-- baik walaupun pada sistem ini, 830 00:36:45,400 --> 00:36:49,390 ia sentiasa akan menjadi 1-- saya katakan membiak ini dengan saiz char. 831 00:36:49,390 --> 00:36:51,552 Rupa-rupanya sizeof adalah pengendali dalam C yang 832 00:36:51,552 --> 00:36:53,260 hanya memberitahu anda Jumlah bait itu 833 00:36:53,260 --> 00:36:54,700 diperlukan untuk jenis data tertentu. 834 00:36:54,700 --> 00:36:57,740 Ia tidak berfungsi untuk tatasusunan, biasanya, kadang-kadang tidak. 835 00:36:57,740 --> 00:36:59,210 Tetapi dalam kes umum, tidak. 836 00:36:59,210 --> 00:37:02,330 Tetapi ia memberitahu saya berapa banyak bait yang char adalah, yang ternyata sentiasa 1. 837 00:37:02,330 --> 00:37:04,080 Jadi ini adalah seperti didarab dengan 1. 838 00:37:04,080 --> 00:37:05,900 >> Garis kelihatan begitu super samar kod. 839 00:37:05,900 --> 00:37:09,320 Tetapi semua hal ini adalah memberikan saya sebahagian memori. 840 00:37:09,320 --> 00:37:13,590 Tetapi adakah ia seolah-olah menyalin apa-apa ke dalam ingatan itu? 841 00:37:13,590 --> 00:37:14,560 Belum lagi. 842 00:37:14,560 --> 00:37:22,040 Dan supaya apa yang saya di talian 22, dan 23, 24, 25, baik, saya hanya melakukan ini. 843 00:37:22,040 --> 00:37:23,760 Dan ini adalah jenis barangan sekolah lama sekarang. 844 00:37:23,760 --> 00:37:26,010 Ini seperti pset 2, di mana anda hanya bergerak perkara 845 00:37:26,010 --> 00:37:28,620 sekitar dalam ingatan, atau lebih tepat di tali. 846 00:37:28,620 --> 00:37:31,920 >> Jadi, saya iterating dari 0 hingga panjang tali s. 847 00:37:31,920 --> 00:37:37,820 Dan saya menyalin i-ke-watak dalam s ke i-ke-watak dalam t. 848 00:37:37,820 --> 00:37:41,820 Dan kerana saya, pengaturcara, yang dibuat Pastikan anda memperuntukkan betul-betul seperti banyak bait 849 00:37:41,820 --> 00:37:44,600 seperti yang saya perlukan, ia sesuai satu-sama-satu hubungan. 850 00:37:44,600 --> 00:37:47,060 Dan saya menyalin ibu dalam huruf kecil kepada yang baru. 851 00:37:47,060 --> 00:37:50,170 Dan kemudian akhir sekali, saya lakukan baris ini. 852 00:37:50,170 --> 00:37:54,637 Dan supaya kesannya adalah hanya untuk mengambil kesempatan t ini di sini. 853 00:37:54,637 --> 00:37:56,470 Jadi banyak untuk menyerap, tetapi jika kamu mempertimbangkan 854 00:37:56,470 --> 00:37:58,220 apa yang sebenarnya berlaku di bawah hood 855 00:37:58,220 --> 00:38:00,880 hanya bergerak ini bait sekitar, semua yang 856 00:38:00,880 --> 00:38:06,617 diperlukan untuk menyelesaikan masalah ini adalah hanya untuk memberikan kita ini sebahagian memori. 857 00:38:06,617 --> 00:38:08,450 Sekarang pada risiko menggalakkan, mari saya tunjukkan 858 00:38:08,450 --> 00:38:13,200 satu contoh lain yang hampir sama, kecuali untuk yang satu ini 859 00:38:13,200 --> 00:38:14,350 baris kod. 860 00:38:14,350 --> 00:38:18,870 Jadi ini adalah versi penggodam program ini, jika anda akan. 861 00:38:18,870 --> 00:38:21,050 Tetapi mari kita menyuling ia ke dalam apa yang sedang berlaku. 862 00:38:21,050 --> 00:38:28,920 Line 24 pernah menjadi t ini kurungan i mendapat s kurungan i. 863 00:38:28,920 --> 00:38:33,370 Sekarang, saya menukar ini kepada t bintang lebih samar 864 00:38:33,370 --> 00:38:36,280 ditambah 1 sama dengan bintang s campur 1. 865 00:38:36,280 --> 00:38:38,702 >> Jadi apa yang berlaku dan mengapa kita mempunyai watak bintang? 866 00:38:38,702 --> 00:38:41,410 Kami telah melihat bintang sebelum ini, dan ia digunakan secara berbeza di sini. 867 00:38:41,410 --> 00:38:45,490 Kami sebelum ini menyaksikan * char, sekarang saya melihat seorang bintang pada awal, dan tidak apa-apa. 868 00:38:45,490 --> 00:38:48,190 Kerana ternyata kita boleh jenis membuat kesimpulan hanya 869 00:38:48,190 --> 00:38:50,280 daripada yang pertama prinsip-prinsip apa yang sedang berlaku. 870 00:38:50,280 --> 00:38:53,860 Jadi hanya perlu jelas, apa yang s? 871 00:38:53,860 --> 00:38:55,052 Minggu lalu, ia adalah rentetan. 872 00:38:55,052 --> 00:38:56,260 Itu tidak memadai lagi. 873 00:38:56,260 --> 00:38:57,690 Apa yang s, khususnya? 874 00:38:57,690 --> 00:38:58,590 >> PENONTON: [didengar] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. MALAN: Ia adalah penunjuk. 876 00:38:59,881 --> 00:39:02,610 Ia adalah alamat yang Watak pertama kita ditaip. 877 00:39:02,610 --> 00:39:04,780 OK, apa yang t? 878 00:39:04,780 --> 00:39:05,660 >> PENONTON: [didengar] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. MALAN: The alamat bait pertama 880 00:39:07,950 --> 00:39:10,490 dalam t, yang sebahagian memori diagihkan semula. 881 00:39:10,490 --> 00:39:14,720 Jadi, ternyata bahawa apabila kita melelar dari 0 pada sehingga tali 882 00:39:14,720 --> 00:39:17,424 length-- pertama sekali, i bermula pada 0, kerana 883 00:39:17,424 --> 00:39:18,840 sekolah ini lama untuk perkara gelung. 884 00:39:18,840 --> 00:39:22,400 Jadi hanya untuk kesederhanaan, mari kita menganggap bahawa baris pertama kod 885 00:39:22,400 --> 00:39:23,760 adalah benar-benar hanya ini, betul. 886 00:39:23,760 --> 00:39:26,080 Jika saya adalah sifar, menambah sifar kepada sesuatu yang mungkin 887 00:39:26,080 --> 00:39:27,540 tidak akan mempunyai kesan. 888 00:39:27,540 --> 00:39:28,560 >> Jadi apakah perkataan itu? 889 00:39:28,560 --> 00:39:31,600 Ia ternyata bahawa bintang pengendali dalam konteks ini 890 00:39:31,600 --> 00:39:33,700 adalah dereference yang pengendali, yang hanya 891 00:39:33,700 --> 00:39:37,530 cara yang mewah untuk mengatakan pergi ke alamat berikut. 892 00:39:37,530 --> 00:39:42,080 Jadi, jika s adalah alamat pertama watak dalam ini sebahagian memori, 893 00:39:42,080 --> 00:39:43,630 * s cara pergi ke sana. 894 00:39:43,630 --> 00:39:45,630 Dan kerana kita telah disediakan gambar dengan cara ini, 895 00:39:45,630 --> 00:39:47,430 anda boleh menerima pakai mengikut model mental. 896 00:39:47,430 --> 00:39:51,030 Jika ini adalah s, dan kamu berkata * s, * s jenis seperti pelongsor dan tangga, 897 00:39:51,030 --> 00:39:54,540 jika anda masih ingat permainan dari zaman kanak-kanak, adalah seperti ikut arah anak panah itu dan pergi 898 00:39:54,540 --> 00:39:55,570 ke alamat. 899 00:39:55,570 --> 00:39:57,080 >> * t adalah perkara yang sama. 900 00:39:57,080 --> 00:39:59,855 Jadi bermula di sini, pergi ke sebahagian itu. 901 00:39:59,855 --> 00:40:03,350 Saya tidak boleh hanya menarik pada skrin ini dengan cara itu. 902 00:40:03,350 --> 00:40:05,560 * t bermakna untuk pergi di sini. 903 00:40:05,560 --> 00:40:08,830 Dan kemudian, untuk gelung hanya berkata menggerakkan watak ini di sini, 904 00:40:08,830 --> 00:40:11,330 menggerakkan watak ini di sini, menggerakkan watak ini di sini. 905 00:40:11,330 --> 00:40:12,890 Tetapi bagaimana saya lakukan incrementation itu? 906 00:40:12,890 --> 00:40:15,430 Saya perlu untuk membatalkan apa yang saya hanya dipadamkan. 907 00:40:15,430 --> 00:40:18,140 Ini adalah apa yang biasanya dipanggil aritmetik penunjuk, yang 908 00:40:18,140 --> 00:40:20,040 bermakna matematik dengan alamat. 909 00:40:20,040 --> 00:40:22,460 >> Jika, dalam hal ini untuk gelung, Saya sentiasa menokok i, 910 00:40:22,460 --> 00:40:26,880 dan s adalah alamat dan t adalah alamat, jika saya terus menambah 1, 911 00:40:26,880 --> 00:40:31,406 yang hanya bermakna terus bergerak ke hadapan, dan ke hadapan, dan ke hadapan dalam memori. 912 00:40:31,406 --> 00:40:34,030 Ia seperti Oxford Street, jalan bahawa bangunan CS dihidupkan. 913 00:40:34,030 --> 00:40:36,490 Bangunan-bangunan CS adalah pada 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Jadi, jika anda melakukannya 33 Oxford Street campur 1, 915 00:40:39,870 --> 00:40:42,870 yang membawa anda ke 34 Oxford Jalan, kemudian 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 kemudian 36 Oxford Street, apa sahaja yang mereka bangunan sebenarnya adalah - jika wujud. 917 00:40:46,380 --> 00:40:50,540 Dan sebagainya, itu sahaja yang kita lakukan di sini dengan penunjuk aritmetik. 918 00:40:50,540 --> 00:40:53,820 >> Jadi ia adalah cara yang super batin untuk menyatakan diri kita sendiri. 919 00:40:53,820 --> 00:40:56,160 Tetapi semua itu yang berlaku di bawah hood 920 00:40:56,160 --> 00:40:59,330 hanya mengikut alamat-alamat ini, seperti berikut peta, jika anda akan, 921 00:40:59,330 --> 00:41:02,692 atau anak panah seperti berikut kami telah dilukis pada skrin. 922 00:41:02,692 --> 00:41:04,910 OK, banyak untuk dihadam. 923 00:41:04,910 --> 00:41:10,410 Sebarang persoalan sintaksis, konsep, petunjuk, malloc, atau sebagainya. 924 00:41:10,410 --> 00:41:11,480 Ya, di sini pertama. 925 00:41:11,480 --> 00:41:13,755 >> PENONTON: Jadi di mana yang kata * t sama toupper * t, 926 00:41:13,755 --> 00:41:15,575 adalah bahawa akan mengambil kesempatan semua huruf atau just-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. MALAN: Ah, soalan yang benar-benar baik. 928 00:41:17,283 --> 00:41:19,805 Jadi dalam talian ini di sini, 31, ini berlaku untuk mengambil kesempatan 929 00:41:19,805 --> 00:41:21,430 huruf pertama atau huruf. 930 00:41:21,430 --> 00:41:23,460 Jadi mari kita menjawab bahawa dengan pergi kembali kepada prinsip-prinsip pertama. 931 00:41:23,460 --> 00:41:26,168 Dan prinsip-prinsip pertama di sini saya maksudkan hanya pergi ke definisi asas 932 00:41:26,168 --> 00:41:27,000 daripada apa yang terlibat. 933 00:41:27,000 --> 00:41:29,770 Jadi toupper yang fungsi yang memanfaatkan char. 934 00:41:29,770 --> 00:41:30,530 Itu sahaja. 935 00:41:30,530 --> 00:41:36,740 * t bermakna pergi ke first-- pergi ke alamat dalam t. 936 00:41:36,740 --> 00:41:40,350 Jadi, dalam gambar, jika ini adalah sebahagian yang memori kita diperuntukkan malloc, 937 00:41:40,350 --> 00:41:43,310 dan ini adalah t, * t bermakna pergi sini. 938 00:41:43,310 --> 00:41:46,710 >> Sementara itu, anda lulus bahawa nilai, huruf kecil m 939 00:41:46,710 --> 00:41:50,040 untuk toupper, anda mendapat kembali modal M, di mana anda meletakkan ia? 940 00:41:50,040 --> 00:41:52,410 Anda meletakkan ia di lokasi yang sama. 941 00:41:52,410 --> 00:41:55,540 Dan dengan yang logik dari orang-orang definisi asas ia hanya 942 00:41:55,540 --> 00:41:58,792 mengambil kesempatan huruf pertama melainkan anda melelar dengan i atau 943 00:41:58,792 --> 00:42:02,000 untuk gelung atau gelung sementara, ia tidak akan berbuat apa-apa lebih daripada yang anda tanyakan itu. 944 00:42:02,000 --> 00:42:02,583 Soalan yang baik. 945 00:42:02,583 --> 00:42:03,237 Ya? 946 00:42:03,237 --> 00:42:05,369 >> PENONTON: Mengapa anda menggunakan dereference kaedah bukan 947 00:42:05,369 --> 00:42:05,979 array? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. MALAN: Ah, soalan yang baik. 949 00:42:07,395 --> 00:42:10,672 Mengapa anda akan menggunakan dereference yang kaedah dan bukannya kaedah array? 950 00:42:10,672 --> 00:42:12,130 Ada sebab tertentu, untuk bersikap jujur. 951 00:42:12,130 --> 00:42:15,290 Dan, sebenarnya, untuk ini jenis contoh, ke kanan, 952 00:42:15,290 --> 00:42:17,556 Saya hanya dengan alasan membuat program yang lebih rumit, 953 00:42:17,556 --> 00:42:19,680 lebih mata yang kaca ke atas, orang check-out, 954 00:42:19,680 --> 00:42:22,830 kerana ini kelihatan super yang sukar difahami, tetapi walaupun ia melakukan perkara yang sama. 955 00:42:22,830 --> 00:42:26,695 Dan sebagainya, terus-terang, ini adalah satu penyelesaian tidak perlu visual kompleks 956 00:42:26,695 --> 00:42:27,320 kepada masalah ini. 957 00:42:27,320 --> 00:42:29,580 >> Ia masih reka bentuk yang baik, lima daripada lima untuk reka bentuk, 958 00:42:29,580 --> 00:42:33,140 sama ada dalam kurungan notasi notasi atau penunjuk. 959 00:42:33,140 --> 00:42:36,299 But-- terutama apabila kita kemudian dalam perjalanan dalam pset 5 960 00:42:36,299 --> 00:42:39,340 apabila kita melaksanakan kamus yang yang Saya sebutkan beberapa times-- 961 00:42:39,340 --> 00:42:42,300 kita benar-benar akan mengambil berat tentang alamat ingatan peringkat rendah 962 00:42:42,300 --> 00:42:44,140 yang kita benar-benar memahami apa yang berlaku. 963 00:42:44,140 --> 00:42:48,300 >> Tetapi, buat masa ini, ternyata bahawa ini baris kod kurungan sini persegi 964 00:42:48,300 --> 00:42:49,900 tidak benar-benar wujud. 965 00:42:49,900 --> 00:42:52,230 Mereka adalah apa yang dipanggil gula sintaksis, yang 966 00:42:52,230 --> 00:42:58,390 adalah hanya cara yang weirdly sejuk mengatakan pengkompil menukarkan tanda kurung siku menjadi 967 00:42:58,390 --> 00:43:00,420 bahawa ungkapan matematik. 968 00:43:00,420 --> 00:43:02,660 Jadi ia adalah satu konvensyen manusia dapat hanya menulis 969 00:43:02,660 --> 00:43:04,220 kurungan sangat user-friendly. 970 00:43:04,220 --> 00:43:06,850 Tetapi apa pengkompil, dilafaz, adalah benar-benar melakukan bila-bila masa 971 00:43:06,850 --> 00:43:10,970 anda menulis apa yang ditonjolkan dalam talian 24, di bawah hood ia benar-benar 972 00:43:10,970 --> 00:43:12,330 ditukarkan kepada ini. 973 00:43:12,330 --> 00:43:16,200 Ia hanya lebih menyeronokkan sebagai manusia membaca dan menulis kod seperti garis 24. 974 00:43:16,200 --> 00:43:18,530 Tetapi akhirnya mereka roda latihan terlalu terkeluar 975 00:43:18,530 --> 00:43:21,780 apabila keselesaan sendiri mendapat lebih kukuh. 976 00:43:21,780 --> 00:43:27,240 >> Baiklah, jadi ingat kemudian bahawa ini adalah jenis masalah yang paling besar 977 00:43:27,240 --> 00:43:27,807 kami berlari ke dalam. 978 00:43:27,807 --> 00:43:30,640 Dan itulah yang mencetuskan keseluruhan ini perbualan sialan tentang petunjuk, 979 00:43:30,640 --> 00:43:32,340 dan alamat, dan perkara-perkara menyalin. 980 00:43:32,340 --> 00:43:35,410 Ia adalah kerana kita tersandung bodoh, isu bodoh ini, di mana 981 00:43:35,410 --> 00:43:38,830 Saya telah melaksanakan logically-- dengan Lauren di sini pada demo dan jus oren 982 00:43:38,830 --> 00:43:43,770 dalam milk-- yang sempurna fungsi algorithmically betul 983 00:43:43,770 --> 00:43:47,010 untuk bertukar-tukar dua pembolehubah ' nilai, tetapi perkara terkutuk 984 00:43:47,010 --> 00:43:50,550 tidak mempunyai sebarang berterusan, atau kekal, kesan ke atas kod saya. 985 00:43:50,550 --> 00:43:51,820 >> Dan mengapa itu? 986 00:43:51,820 --> 00:43:54,650 Secara ringkas, mengapa ini pelaksanaan pertukaran 987 00:43:54,650 --> 00:43:58,740 secara logik betul, tetapi tidak memberi kesan pada pembolehubah yang akan dihantar kepadanya, 988 00:43:58,740 --> 00:44:01,119 seperti x dan y untuk utama? 989 00:44:01,119 --> 00:44:02,410 Apakah intipati isu ini? 990 00:44:02,410 --> 00:44:02,909 Ya? 991 00:44:02,909 --> 00:44:05,532 PENONTON: Oleh kerana pembolehubah dibuat salinan berubah-ubah dalam pas 992 00:44:05,532 --> 00:44:06,240 melalui fungsi. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. MALAN: Tepat sekali, apabila anda meninggal pembolehubah ke dalam fungsi, atau hujah-hujah 994 00:44:09,060 --> 00:44:11,030 ke dalam satu majlis, mereka diluluskan oleh salinan, yang 995 00:44:11,030 --> 00:44:14,770 bermakna anda mendapat sama mencari corak bit untuk kedua-dua x dan y, 996 00:44:14,770 --> 00:44:15,955 dipanggil di sini a dan b. 997 00:44:15,955 --> 00:44:18,080 Dan anda boleh berbuat apa-apa anda mahu dengan salinan itu, 998 00:44:18,080 --> 00:44:20,657 tetapi mereka akan tidak mempunyai kesan ke atas fungsi panggilan. 999 00:44:20,657 --> 00:44:22,990 Dan, sebenarnya, kita menarik yang gambar pada skrin, ingat 1000 00:44:22,990 --> 00:44:25,520 Kali terakhir, di mana jika anda benar-benar berfikir tentang apa yang 1001 00:44:25,520 --> 00:44:28,570 berlaku di bawah yang hood-- jika ini adalah memori komputer anda, 1002 00:44:28,570 --> 00:44:31,650 dan turun di sini adalah sebahagian daripada memori yang digunakan untuk utama, 1003 00:44:31,650 --> 00:44:34,020 ini adalah sebahagian daripada memori yang digunakan untuk swap, 1004 00:44:34,020 --> 00:44:37,090 dan mempunyai jadi walaupun utama dua pembolehubah, x dan y, 1005 00:44:37,090 --> 00:44:41,840 swap mungkin mempunyai sama mencari nilai, kedua-dua yang 1 dan 2, 1006 00:44:41,840 --> 00:44:44,520 tetapi ia benar-benar ketulan berbeza ingatan. 1007 00:44:44,520 --> 00:44:46,130 >> Oleh itu, kita memerlukan penyelesaian kepada ini. 1008 00:44:46,130 --> 00:44:51,580 Dan terus-terang, ia akan kelihatan seolah-olah kita kini mempunyai penyelesaian kepada masalah ini, betul. 1009 00:44:51,580 --> 00:44:55,760 Jika kita kini mempunyai keupayaan untuk memanipulasi perkara melalui alamat 1010 00:44:55,760 --> 00:44:59,310 dan, jenis pelongsor dan tangga gaya, mengikuti anak panah ini 1011 00:44:59,310 --> 00:45:02,820 dan ke mana-mana kita mahu dalam ingatan, tidak boleh kita 1012 00:45:02,820 --> 00:45:06,220 menyelesaikan masalah ini dengan lulus dari utama untuk menukar 1013 00:45:06,220 --> 00:45:09,650 bukan nilai yang kita mahu swap, tetapi hanya mengikut gerak hati 1014 00:45:09,650 --> 00:45:11,630 apa yang kita boleh lulus untuk menukar bukan? 1015 00:45:11,630 --> 00:45:12,620 >> [Interposing SUARA] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. MALAN: Mengapa tidak kita hanya lulus alamat, bukan? 1017 00:45:15,244 --> 00:45:17,470 Kenapa kita tidak memberi swap peta harta, jika anda akan, 1018 00:45:17,470 --> 00:45:20,950 yang membawa kepada nilai sebenar x dan y. 1019 00:45:20,950 --> 00:45:24,340 Mari kita swap, benar-benar mengubah bit-bit asal, dan bukannya 1020 00:45:24,340 --> 00:45:26,797 hanya lulus salinan bit. 1021 00:45:26,797 --> 00:45:29,130 Dan sebagainya, sebenarnya, itu apa yang akan menjadi penyelesaian. 1022 00:45:29,130 --> 00:45:31,899 Versi ini di sini adalah jelas buruk dan cacat. 1023 00:45:31,899 --> 00:45:35,190 Oleh sebab itu, pada pandangan pertama, ia hanya kelihatan seperti kita menambah sekumpulan bintang secara rawak 1024 00:45:35,190 --> 00:45:37,106 dan melintasi jari kita bahawa ia akan menyusun. 1025 00:45:37,106 --> 00:45:38,460 Tetapi, ia kini akan menyusun. 1026 00:45:38,460 --> 00:45:40,090 >> Tetapi mari kita lihat apa artinya. 1027 00:45:40,090 --> 00:45:43,990 Dan, malangnya, pengarang C akan memilih apa simbol lain 1028 00:45:43,990 --> 00:45:46,380 untuk membuat ini sedikit lebih jelas, tetapi pengendali bintang 1029 00:45:46,380 --> 00:45:48,610 mempunyai erti yang berbeza dalam dua konteks yang berbeza. 1030 00:45:48,610 --> 00:45:50,890 Dan kita telah melihat kedua-duanya, tetapi mari kita membezakan. 1031 00:45:50,890 --> 00:45:55,310 >> Jadi sehingga di atas sana, apabila saya telah berubah a dan b 1032 00:45:55,310 --> 00:46:00,470 daripada menjadi int dalam yang buruk versi untuk int bintang, a dan b, 1033 00:46:00,470 --> 00:46:01,740 sebelum ini, adalah integer. 1034 00:46:01,740 --> 00:46:05,752 Apakah a dan b kini dalam baik, versi hijau? 1035 00:46:05,752 --> 00:46:06,900 Mereka alamat. 1036 00:46:06,900 --> 00:46:09,610 Alamat apa, perlu jelas? 1037 00:46:09,610 --> 00:46:10,770 Alamat integer. 1038 00:46:10,770 --> 00:46:12,520 Jadi hakikat bahawa saya berkata cara int bintang 1039 00:46:12,520 --> 00:46:15,440 ini adalah alamat integer, secara khusus. 1040 00:46:15,440 --> 00:46:19,120 >> Jadi sekarang perhatikan dalam baris kod, sesuatu yang lain telah berubah juga. 1041 00:46:19,120 --> 00:46:22,770 tmp tetap sama, kerana ia hanya integer sementara, 1042 00:46:22,770 --> 00:46:24,110 ada sihir memori di sana. 1043 00:46:24,110 --> 00:46:26,370 Tetapi kini memerlukan bintang. 1044 00:46:26,370 --> 00:46:28,560 Dan, sebenarnya, setiap sebutan lain a dan b, 1045 00:46:28,560 --> 00:46:31,780 melihat bahawa semua yang berubah dari merah ke hijau 1046 00:46:31,780 --> 00:46:34,209 adalah bahawa saya awalan pembolehubah-pembolehubah dengan bintang. 1047 00:46:34,209 --> 00:46:35,750 Kerana saya tidak mahu menyalin a dan b. 1048 00:46:35,750 --> 00:46:40,350 Kerana jika saya hanya menyalin a dan b dan swap a dan b, apa yang saya benar-benar bertukar-tukar? 1049 00:46:40,350 --> 00:46:43,760 Hanya alamat, saya mahu untuk menukar apa yang di alamat tersebut. 1050 00:46:43,760 --> 00:46:44,860 Saya hendak pergi ke sana. 1051 00:46:44,860 --> 00:46:48,000 Dan supaya pengendali bintang dalam fungsi saya, 1052 00:46:48,000 --> 00:46:51,700 tidak di dalam senarai parameter, bermakna anda pergi ke alamat tersebut 1053 00:46:51,700 --> 00:46:54,490 dan benar-benar mengubah nilai-nilai. 1054 00:46:54,490 --> 00:46:56,500 >> Jadi apakah gambar kini kelihatan seperti sebaliknya. 1055 00:46:56,500 --> 00:47:03,250 Nah, jika bukan saya lulus dalam untuk dan b tidak 1 dan 2-- 1056 00:47:03,250 --> 00:47:05,790 Saya benar-benar perlu menambah satu definisi lain di sini. 1057 00:47:05,790 --> 00:47:09,030 Jadi katakan bahawa ini sebahagian ingatan adalah di lokasi 10. 1058 00:47:09,030 --> 00:47:12,960 >> Ini adalah di lokasi 11, tetapi ini adalah sedikit kaedah mudah, 1059 00:47:12,960 --> 00:47:18,900 Saya kini mempunyai dua pilihan saya lulus x dan y atau saya lulus alamat mereka? 1060 00:47:18,900 --> 00:47:22,500 Jika saya lulus alamat mereka seperti ini, saya hanya 1061 00:47:22,500 --> 00:47:25,390 kini perlu melaksanakan swap bagi setiap kod hijau 1062 00:47:25,390 --> 00:47:29,080 supaya apabila ia melihat dan apabila ia Jangka b, ia tidak hanya menyalin dan b 1063 00:47:29,080 --> 00:47:30,540 dan menggerakkan susu dan jus oren. 1064 00:47:30,540 --> 00:47:32,664 Susu dan jus oren metafora sekarang rosak, 1065 00:47:32,664 --> 00:47:35,060 kerana mereka adalah cawan peta cecair dan tidak. 1066 00:47:35,060 --> 00:47:37,750 Kami bukannya perlu pergi untuk menangani 10 dan kami 1067 00:47:37,750 --> 00:47:42,420 perlu ke alamat 11, dan kemudian melaksanakan bahawa logik bertukar-tukar. 1068 00:47:42,420 --> 00:47:45,580 >> Jadi logik adalah yang sama, tetapi kita perlu cara yang sedikit berbeza 1069 00:47:45,580 --> 00:47:47,160 daripada mengakses pembolehubah-pembolehubah. 1070 00:47:47,160 --> 00:47:52,400 Dan sebagainya pada akhirnya, apa yang program perlu kelihatan seperti adalah ini. 1071 00:47:52,400 --> 00:47:56,610 Dalam swap.c literal disalin dan ditampal versi hijau. 1072 00:47:56,610 --> 00:47:58,450 Tetapi saya perlu membuat satu perubahan. 1073 00:47:58,450 --> 00:48:00,180 Ia tidak mencukupi hanya untuk menukar swap. 1074 00:48:00,180 --> 00:48:03,830 Apa jalan lain untuk kod saya perlu berubah? 1075 00:48:03,830 --> 00:48:04,330 Ya? 1076 00:48:04,330 --> 00:48:05,770 >> PENONTON: Di mana ia mengambil hujah-hujah. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. MALAN: Di mana ia mengambil hujahnya. 1078 00:48:07,603 --> 00:48:09,985 Jadi, jika saya tatal ke atas untuk utama, saya tidak boleh hanya lulus dalam x dan y, 1079 00:48:09,985 --> 00:48:12,820 dan, saya berjanji, yang terakhir sekeping sintaks baru hari ini. 1080 00:48:12,820 --> 00:48:17,200 Saya perlu lulus dalam tidak x dan y tetapi alamat x dan y. 1081 00:48:17,200 --> 00:48:20,400 Dan ternyata, simbol bahawa pengarang C memilih 1082 00:48:20,400 --> 00:48:23,860 adalah jika anda menggunakan Ampersand di sini, tidak dikelirukan dengan Ampersand bitwise, 1083 00:48:23,860 --> 00:48:27,130 jika anda menggunakan Ampersand yang di sini dan Ampersand sini, 1084 00:48:27,130 --> 00:48:29,570 ini angka untuk anda, apa yang alamat x, 1085 00:48:29,570 --> 00:48:31,740 mungkin ia adalah 10, apa alamat y, mungkin ia 1086 00:48:31,740 --> 00:48:35,400 11, dan pas mereka yang sebaliknya. 1087 00:48:35,400 --> 00:48:37,210 >> Jadi banyak untuk menyerap semua sekali gus. 1088 00:48:37,210 --> 00:48:40,190 Tetapi mari kita lihat sekarang dengan cepat dalam baki empat minit kami 1089 00:48:40,190 --> 00:48:42,150 di mana perkara yang boleh pergi jauh menyimpang. 1090 00:48:42,150 --> 00:48:45,120 Dan sebagai diketepikan, sebenarnya Saya mengambil gambar ini, 1091 00:48:45,120 --> 00:48:46,920 TF mengambil gambar ini satu atau dua tahun lalu. 1092 00:48:46,920 --> 00:48:49,190 Jadi ini adalah sudut belakang Dewan Makan Eliot. 1093 00:48:49,190 --> 00:48:52,310 Penunjuk adalah mungkin yang paling sukar topik yang kita buat di dalam CS50. 1094 00:48:52,310 --> 00:48:54,810 Jadi, jika anda bimbang jenis yang cerun adalah seperti mungkin ia 1095 00:48:54,810 --> 00:48:56,770 lebih daripada satu kayu hoki seperti ini, menyedari 1096 00:48:56,770 --> 00:49:00,160 kita jenis menghampiri puncak pada segi kerumitan konsep. 1097 00:49:00,160 --> 00:49:02,300 >> Dan saya membawa ini photo, kerana saya bersumpah 1098 00:49:02,300 --> 00:49:05,920 kepada tuhan, pada musim gugur tahun 1996, apabila saya mengambil CS50 dengan rakan-rakan firman-Ku, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, dia duduk saya ke bawah dalam sudut Eliot D. Dewan semasa makan tengah hari, 1100 00:49:09,620 --> 00:49:12,330 atau makan malam, atau sesuatu untuk mencuba untuk membantu saya memahami petunjuk. 1101 00:49:12,330 --> 00:49:16,520 Dan ini adalah di mana saya minggu selepas ia diperkenalkan pada kuliah apabila 1102 00:49:16,520 --> 00:49:18,170 Saya akhirnya memahami petunjuk. 1103 00:49:18,170 --> 00:49:20,590 Dan saya berharap bahawa ini akan klik jauh lebih cepat untuk anda. 1104 00:49:20,590 --> 00:49:23,540 Tetapi sedar ini benar-benar di kalangan topik yang lebih canggih 1105 00:49:23,540 --> 00:49:24,420 kita telah melihat. 1106 00:49:24,420 --> 00:49:25,819 Tetapi ia adalah antara yang paling kuat. 1107 00:49:25,819 --> 00:49:28,860 Dan apabila anda mendapatkannya, ia benar-benar semua hanya akan akhirnya datang bersama-sama. 1108 00:49:28,860 --> 00:49:31,460 Jadi yakinlah ia tidak perlu semua tenggelam di hari ini. 1109 00:49:31,460 --> 00:49:32,980 >> Jadi di sini adalah program terakhir kita akan melihat. 1110 00:49:32,980 --> 00:49:35,605 Dan kita akan berakhir dengan cepat tiga minit claymation 1111 00:49:35,605 --> 00:49:37,030 yang dibuat oleh rakan kami, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Berikut adalah program, yang pada kedua-dua bahagian garis mengisytiharkan pembolehubah x dan y. 1113 00:49:41,440 --> 00:49:44,780 Kedua-duanya alamat integer, petunjuk AKA. 1114 00:49:44,780 --> 00:49:48,125 Kami kemudian memperuntukkan cukup memori untuk menyimpan int 1115 00:49:48,125 --> 00:49:51,344 dan menyimpan alamat daripada memori dalam x. 1116 00:49:51,344 --> 00:49:53,260 Jadi, ia adalah lebih mudah daripada contoh sebelumnya. 1117 00:49:53,260 --> 00:49:56,100 Berikan saya empat bait ingatan, itulah saiz int, 1118 00:49:56,100 --> 00:49:58,000 dan meletakkan alamat yang dalam x. 1119 00:49:58,000 --> 00:50:01,070 Keturunan ini di sini bermaksud pergi ke alamat dalam x 1120 00:50:01,070 --> 00:50:05,270 dan meletakkan makna kehidupan, nombor 42 di sana. 1121 00:50:05,270 --> 00:50:07,710 Tetapi baris ini membimbangkan saya. 1122 00:50:07,710 --> 00:50:12,620 Bintang y bermakna pergi ke alamat dalam y, dan meletakkan nombor malang 13 di sana. 1123 00:50:12,620 --> 00:50:15,780 Mengapa ia merbahaya, pada ketika ini dalam story-- walaupun cepat kepada 1124 00:50:15,780 --> 00:50:17,980 dalam beberapa minit menyusut kami sini-- mengapa ia tidak baik 1125 00:50:17,980 --> 00:50:19,660 bagi saya untuk mengatakan, pergi ke alamat dalam y? 1126 00:50:19,660 --> 00:50:21,077 >> PENONTON: Anda tidak mempunyai [didengar]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. MALAN: Saya tidak mempunyai meletakkan apa-apa dalam y. 1128 00:50:22,910 --> 00:50:25,520 Jadi apakah nilai y, pada ketika ini dalam cerita? 1129 00:50:25,520 --> 00:50:26,570 Kami tidak tahu. 1130 00:50:26,570 --> 00:50:29,190 Ia adalah beberapa nilai sampah dan juga tidak Binky tahu. 1131 00:50:29,190 --> 00:50:32,532 Jika kita boleh berakhir pada nota ini. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO MAIN SEMULA] 1133 00:50:34,832 --> 00:50:36,500 >> Hey, Binky, bangun. 1134 00:50:36,500 --> 00:50:39,140 Ia adalah masa untuk penunjuk menyeronokkan. 1135 00:50:39,140 --> 00:50:40,210 >> -Apa itu? 1136 00:50:40,210 --> 00:50:41,690 Ketahui mengenai petunjuk? 1137 00:50:41,690 --> 00:50:43,570 Oh, goody. 1138 00:50:43,570 --> 00:50:46,600 >> -Baik, Untuk bermula, saya rasa kita akan memerlukan beberapa petunjuk. 1139 00:50:46,600 --> 00:50:47,380 >> -OKAY. 1140 00:50:47,380 --> 00:50:51,120 Kod ini memperuntukkan dua petunjuk yang boleh menunjukkan kepada integer. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Baik saya melihat dua petunjuk, tetapi mereka 1142 00:50:53,557 --> 00:50:55,140 seolah-olah tidak menjadi menunjuk kepada apa-apa. 1143 00:50:55,140 --> 00:50:55,970 >> -Itu Betul. 1144 00:50:55,970 --> 00:50:58,100 Pada mulanya petunjuk tidak menunjukkan apa-apa. 1145 00:50:58,100 --> 00:51:00,950 Apa yang mereka menunjukkan adalah dipanggil pointees dan menetapkan mereka 1146 00:51:00,950 --> 00:51:02,330 adalah langkah yang berasingan. 1147 00:51:02,330 --> 00:51:03,210 >> -Oh, Betul, betul. 1148 00:51:03,210 --> 00:51:03,940 Saya sudah tahu. 1149 00:51:03,940 --> 00:51:05,730 The pointees adalah berasingan. 1150 00:51:05,730 --> 00:51:08,310 Jadi bagaimana anda memperuntukkan pointee satu? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Dan ini kod Peruntuk yang pointee integer baru, 1152 00:51:11,960 --> 00:51:15,050 dan ini set bahagian x untuk menunjukkan kepadanya. 1153 00:51:15,050 --> 00:51:16,240 >> Hey, yang kelihatan lebih baik. 1154 00:51:16,240 --> 00:51:17,743 Oleh itu, ia melakukan sesuatu. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Saya akan dereference x penunjuk kepada menyimpan nombor 42 ke dalam pointee itu. 1156 00:51:23,580 --> 00:51:27,130 Untuk silap mata ini, saya perlu saya tongkat sihir dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> Tongkat sakti Your daripada dereferencing? 1158 00:51:30,200 --> 00:51:32,310 Eh, itu, itu hebat. 1159 00:51:32,310 --> 00:51:34,270 >> -Ini Adalah apa kod kelihatan seperti. 1160 00:51:34,270 --> 00:51:35,970 Saya hanya akan menetapkan jumlah dan- 1161 00:51:35,970 --> 00:51:37,070 >> [POP BUNYI] 1162 00:51:37,070 --> 00:51:39,140 >> Hey, lihat di sana ia pergi. 1163 00:51:39,140 --> 00:51:43,980 Jadi, melakukan dereference pada x berikut anak panah untuk mengakses pointee itu. 1164 00:51:43,980 --> 00:51:46,150 Dalam kes ini, untuk menyimpan 42 di sana. 1165 00:51:46,150 --> 00:51:50,700 Hey, cuba menggunakannya untuk menyimpan nombor 13 melalui penunjuk lain, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OKAY. 1167 00:51:51,840 --> 00:51:56,270 Saya hanya akan pergi ke sini untuk y, dan mendapatkan nombor 13 set up. 1168 00:51:56,270 --> 00:52:00,380 Dan kemudian mengambil tongkat dereferencing dan just-- 1169 00:52:00,380 --> 00:52:01,646 >> [Buzzer BUNYI] 1170 00:52:01,646 --> 00:52:04,080 >> -Oh, Hey yang tidak berjaya. 1171 00:52:04,080 --> 00:52:06,470 Katakanlah, uh, Binky, saya tidak berfikir dereferencing 1172 00:52:06,470 --> 00:52:10,850 y adalah idea yang baik, kerana menetapkan sehingga pointee adalah langkah yang berasingan. 1173 00:52:10,850 --> 00:52:12,480 Dan saya tidak fikir kita pernah melakukannya. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Titik yang baik. 1175 00:52:14,620 --> 00:52:19,810 >> -Yeah, Kita memperuntukkan penunjuk, y, tetapi kami tidak menetapkan ia untuk menunjukkan pointee a. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Sangat taat. 1177 00:52:21,590 --> 00:52:23,215 Hey, yang anda cari baik di sana, Binky. 1178 00:52:23,215 --> 00:52:26,390 Bolehkah anda menetapkan ia supaya y mata untuk pointee yang sama seperti x. 1179 00:52:26,390 --> 00:52:29,290 >> -Sure, Saya menggunakan tongkat sihir saya tugasan penunjuk. 1180 00:52:29,290 --> 00:52:31,970 >> -Adakah Yang akan menjadi masalah, seperti sebelum ini? 1181 00:52:31,970 --> 00:52:33,790 >> -Tiada, Ini tidak menyentuh pointees. 1182 00:52:33,790 --> 00:52:35,840 Ia hanya mengubah satu penunjuk untuk menunjukkan yang sama thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Pop BUNYI] 1184 00:52:36,465 --> 00:52:37,450 --as lain. 1185 00:52:37,450 --> 00:52:38,440 >> -Oh begitu. 1186 00:52:38,440 --> 00:52:41,200 Sekarang y mata kepada tempat yang sama seperti x. 1187 00:52:41,200 --> 00:52:42,950 Jadi, tunggu, kini y adalah tetap. 1188 00:52:42,950 --> 00:52:44,110 Ia mempunyai pointee a. 1189 00:52:44,110 --> 00:52:47,779 Jadi, anda boleh cuba tongkat dereferencing lagi untuk menghantar 13 ke atas. 1190 00:52:47,779 --> 00:52:51,110 >> -Oh, OK, di sini pergi. 1191 00:52:51,110 --> 00:52:52,330 >> Hey, tengok tu. 1192 00:52:52,330 --> 00:52:53,570 Sekarang dereferencing kerja-kerja y. 1193 00:52:53,570 --> 00:52:57,900 Dan kerana petunjuk berkongsi bahawa salah pointee, mereka berdua melihat 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Yeah, Perkongsian, uh, apa sahaja. 1195 00:52:59,952 --> 00:53:01,535 Jadi, kita akan bertukar tempat sekarang? 1196 00:53:01,535 --> 00:53:03,730 >> -Oh, Melihat, kita berada di luar masa. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Hanya Ingat tiga peraturan penunjuk. 1199 00:53:06,520 --> 00:53:09,550 Number 1, struktur asas adalah bahawa anda mempunyai penunjuk, 1200 00:53:09,550 --> 00:53:11,630 dan ia menjurus kepada pointee a. 1201 00:53:11,630 --> 00:53:13,740 Tetapi penunjuk dan pointee adalah berasingan. 1202 00:53:13,740 --> 00:53:15,620 Dan kesilapan yang sama adalah untuk menubuhkan penunjuk 1203 00:53:15,620 --> 00:53:18,000 tetapi lupa untuk memberikan pointee a. 1204 00:53:18,000 --> 00:53:21,170 >> Nombor 2, penunjuk penyahrujukan bermula pada penunjuk 1205 00:53:21,170 --> 00:53:24,020 dan mengikuti anak panah ke atas untuk mengakses pointee itu. 1206 00:53:24,020 --> 00:53:27,815 Seperti yang kita semua tahu, ini hanya berfungsi jika ada adalah pointee, yang jenis mendapat kembali 1207 00:53:27,815 --> 00:53:29,260 untuk memerintah nombor 1. 1208 00:53:29,260 --> 00:53:31,990 >> Nombor 3, penunjuk tugasan mengambil masa satu penunjuk 1209 00:53:31,990 --> 00:53:35,330 dan perubahan itu untuk menunjuk kepada pointee sama dengan penunjuk lain. 1210 00:53:35,330 --> 00:53:37,150 Jadi selepas tugasan, kedua-dua petunjuk 1211 00:53:37,150 --> 00:53:40,927 akan menunjukkan kepada pointee yang sama, kadang-kadang yang dipanggil perkongsian. 1212 00:53:40,927 --> 00:53:42,510 Dan itu semua yang ada padanya, benar-benar. 1213 00:53:42,510 --> 00:53:43,130 Selamat tinggal sekarang. 1214 00:53:43,130 --> 00:53:43,475 >> [AKHIR MAIN SEMULA] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. MALAN: Itu sahaja untuk CS50. 1216 00:53:44,830 --> 00:53:46,246 Terima kasih kepada Profesor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Kita akan melihat lagi minggu depan. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Bermain muzik ELECTRONIC] 1220 00:53:56,435 --> 00:57:22,775