1 00:00:00,000 --> 00:00:03,395 >> [MUSIC PLAYING] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. Malan: Ini seperti seminar mahasiswa hari ini. 4 00:00:13,280 --> 00:00:14,060 OKE. 5 00:00:14,060 --> 00:00:15,024 Jadi sangat hujan keluar. 6 00:00:15,024 --> 00:00:17,690 Hal ini cenderung terjadi pada hari Rabu, tapi semua lebih banyak kesempatan 7 00:00:17,690 --> 00:00:18,700 untuk pertanyaan hari ini. 8 00:00:18,700 --> 00:00:22,210 Jadi mari kita mulai benar-benar dengan film hanya dalam beberapa saat. 9 00:00:22,210 --> 00:00:24,560 Tapi kita akan mulai anggun seperti biasa. 10 00:00:24,560 --> 00:00:28,000 >> Ini CS50, dan ini adalah akhir minggu 4. 11 00:00:28,000 --> 00:00:30,820 Jadi, jika Anda pernah melihat TV atau film dimana 12 00:00:30,820 --> 00:00:34,690 ada beberapa ahli komputer dan polisi, atau FBI, atau lembaga 13 00:00:34,690 --> 00:00:36,930 sedang mencoba untuk menangkap beberapa musuh, baik, Anda sudah 14 00:00:36,930 --> 00:00:40,850 mungkin pernah mendengar ungkapan "meningkatkan," dimana teknisi yang entah bagaimana 15 00:00:40,850 --> 00:00:44,750 ajaib memperbesar jauh jauh untuk melihat penjahat 16 00:00:44,750 --> 00:00:48,640 identitas atau nomor plat bahkan kilau cermin 17 00:00:48,640 --> 00:00:50,390 atau kilatan mata seseorang. 18 00:00:50,390 --> 00:00:55,196 Jadi memang, mari kita lihat adegan seperti beberapa dari Hollywood. 19 00:00:55,196 --> 00:00:55,862 [VIDEO PLAYBACK] 20 00:00:55,862 --> 00:00:59,243 -OK, Sekarang mari kita lihat baik pada Anda. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -Tahan. 23 00:01:07,415 --> 00:01:08,267 Jalankan itu kembali. 24 00:01:08,267 --> 00:01:09,121 >> -Tunggu sebentar. 25 00:01:09,121 --> 00:01:11,300 Belok kanan. 26 00:01:11,300 --> 00:01:12,209 >> -Ada, Membekukan itu. 27 00:01:12,209 --> 00:01:12,750 -Layar penuh. 28 00:01:12,750 --> 00:01:13,558 -OK, Membekukan 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 Di atas yang pria dengan roda belakang. 31 00:01:16,530 --> 00:01:19,400 -Zoom Di sini di tempat ini. 32 00:01:19,400 --> 00:01:22,846 -Dengan Peralatan yang tepat, gambar bisa diperbesar dan dipertajam. 33 00:01:22,846 --> 00:01:24,065 -Apa itu? 34 00:01:24,065 --> 00:01:25,600 -Ini Merupakan program peningkatan. 35 00:01:25,600 --> 00:01:26,860 -Bisa Anda jelas bahwa apa pun? 36 00:01:26,860 --> 00:01:27,890 -Aku Tidak tahu. 37 00:01:27,890 --> 00:01:29,050 Mari kita meningkatkan itu. 38 00:01:29,050 --> 00:01:31,575 >> Bagian -Enhance A6. 39 00:01:31,575 --> 00:01:33,642 >> -I Ditingkatkan detail, dan-- Saya pikir ada 40 00:01:33,642 --> 00:01:35,433 cukup untuk meningkatkan, melepaskannya ke layar saya. 41 00:01:35,433 --> 00:01:37,080 -I Ditingkatkan refleksi di matanya. 42 00:01:37,080 --> 00:01:38,830 >> -Biarkan Dijalankan melalui peningkatan video. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Dapat menyempurnakan ini? 44 00:01:40,100 --> 00:01:41,875 >> -Tahan. 45 00:01:41,875 --> 00:01:44,010 >> -aku Telah bekerja pada refleksi ini. 46 00:01:44,010 --> 00:01:44,995 >> Refleksi -seseorang itu. 47 00:01:44,995 --> 00:01:45,495 -Reflection. 48 00:01:45,495 --> 00:01:47,399 -Ada Adalah refleksi dari wajah pria itu. 49 00:01:47,399 --> 00:01:48,065 Refleksi -The. 50 00:01:48,065 --> 00:01:48,981 -Ada Refleksi. 51 00:01:48,981 --> 00:01:50,600 -Zoom Di atas cermin. 52 00:01:50,600 --> 00:01:52,712 -Anda Bisa melihat refleksi. 53 00:01:52,712 --> 00:01:54,350 -Bisa Menyempurnakan gambar dari sini? 54 00:01:54,350 --> 00:01:55,370 -Bisa Menyempurnakan dia di sini? 55 00:01:55,370 --> 00:01:56,210 -Bisa Menyempurnakan itu? 56 00:01:56,210 --> 00:01:56,900 Dapat menyempurnakan itu? 57 00:01:56,900 --> 00:01:57,870 >> -Bisa Kita meningkatkan ini? 58 00:01:57,870 --> 00:01:58,717 >> -Bisa Menyempurnakan itu? 59 00:01:58,717 --> 00:02:00,050 -Hold Pada kedua, saya akan meningkatkan. 60 00:02:00,050 --> 00:02:00,924 -Zoom Di pintu. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -Zoom. 63 00:02:02,586 --> 00:02:03,490 -Pindah. 64 00:02:03,490 --> 00:02:03,990 -Lebih. 65 00:02:03,990 --> 00:02:04,690 -Tunggu, Berhenti. 66 00:02:04,690 --> 00:02:05,190 Stop. 67 00:02:05,190 --> 00:02:05,970 -Pause Itu. 68 00:02:05,970 --> 00:02:09,460 -Rotate Kita 75 derajat sekitar vertikal, silakan. 69 00:02:09,460 --> 00:02:10,962 Stop. 70 00:02:10,962 --> 00:02:14,040 Kembali ke bagian tersebut tentang pintu, lagi. 71 00:02:14,040 --> 00:02:15,860 >> -Got Penambah gambar yang dapat bitmap? 72 00:02:15,860 --> 00:02:18,776 >> Hei, mungkin kita bisa menggunakan Pradeep Metode Sen untuk melihat ke jendela. 73 00:02:18,776 --> 00:02:20,372 Software -Ini adalah keadaan seni. 74 00:02:20,372 --> 00:02:21,845 >> Eigenvalue -The dimatikan. 75 00:02:21,845 --> 00:02:24,300 >> -Dengan Kanan Kombinasi algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> -Dia Diambil eliminasi algoritma ke tingkat berikutnya, 77 00:02:26,755 --> 00:02:28,730 dan saya dapat menggunakannya untuk meningkatkan foto ini. 78 00:02:28,730 --> 00:02:31,286 >> -Lock Dan memperbesar z-axis. 79 00:02:31,286 --> 00:02:32,560 >> -Enhance. 80 00:02:32,560 --> 00:02:33,100 >> -Enhance. 81 00:02:33,100 --> 00:02:33,600 >> -Enhance. 82 00:02:33,600 --> 00:02:34,960 -Freeze Dan meningkatkan. 83 00:02:34,960 --> 00:02:37,180 >> [END PLAYBACK] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. Malan: Baiklah, jadi semua orang sebenarnya kata-kata. 85 00:02:41,160 --> 00:02:44,450 Mereka hanya dirangkai dalam cara yang tidak benar-benar masuk akal. 86 00:02:44,450 --> 00:02:48,400 Dan, pada kenyataannya, CS50 dan program seperti itu cenderung merusak banyak TV dan film 87 00:02:48,400 --> 00:02:48,900 untuk kamu. 88 00:02:48,900 --> 00:02:52,330 Karena ketika orang-orang ahli komputer yang berderak dari syarat dan mengatakan 89 00:02:52,330 --> 00:02:56,860 hal mewah seperti vektor eigen, dan sumbu z, 90 00:02:56,860 --> 00:02:59,572 dan sejumlah lainnya sebenarnya istilah yang lebih teknis, 91 00:02:59,572 --> 00:03:02,030 mereka benar-benar hanya merangkai kata bersama-sama terlalu sering. 92 00:03:02,030 --> 00:03:05,020 Apakah itu salah satu harapan kami adalah bahwa, sebagai efek samping dari mengambil kursus 93 00:03:05,020 --> 00:03:08,245 seperti ini, akan lebih banyak orang di dunia benar-benar dapat menimbang dalam 94 00:03:08,245 --> 00:03:12,040 dan hanya pernah jadi sedikit mempengaruhi kualitas dan ketepatan film-film? 95 00:03:12,040 --> 00:03:14,350 >> Bahkan, mari kita lihat kenyataan. 96 00:03:14,350 --> 00:03:18,070 Jadi di sini adalah staf foto Maria, salah satu rekan mengajar kami. 97 00:03:18,070 --> 00:03:20,050 Dan kira dia dicurigai sesuatu. 98 00:03:20,050 --> 00:03:23,730 Namun, ada secercah beberapa bagian dari bukti di matanya, 99 00:03:23,730 --> 00:03:25,480 atau dalam refleksi kacamatanya. 100 00:03:25,480 --> 00:03:30,760 Nah, jika kita melakukan persis seperti film mengusulkan, dimana kita tampilannya dan "meningkatkan", 101 00:03:30,760 --> 00:03:34,080 ini adalah berapa banyak informasi adalah wajah Maria 102 00:03:34,080 --> 00:03:36,795 ketika Anda mengambil foto dengan resolusi asli. 103 00:03:36,795 --> 00:03:39,120 >> Dan, pada kenyataannya, Anda dapat melihat titik-titik ini. 104 00:03:39,120 --> 00:03:41,900 Dan ini adalah apa yang disebut piksel, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 yang hanya persegi biasanya yang merupakan titik yang membentuk sebuah gambar. 106 00:03:45,740 --> 00:03:49,200 Dan kembali pada hari, dan benar-benar bahkan hari ini dengan beberapa TV LED hari ini 107 00:03:49,200 --> 00:03:51,950 atau TV LCD, jika Anda punya satu di kamar Anda atau di rumah, 108 00:03:51,950 --> 00:03:55,100 jika Anda pergi super dekat dengan itu, dan terutama jika itu adalah TV agak tua, 109 00:03:55,100 --> 00:03:58,760 Anda mungkin bahkan dapat melihat titik-titik ini dan itulah yang membentuk sebuah gambar. 110 00:03:58,760 --> 00:04:00,980 >> Dan tidak ada lagi informasi dari ini. 111 00:04:00,980 --> 00:04:05,400 Kita bisa "meningkatkan", dalam arti smoothing hal lebih dan semacam 112 00:04:05,400 --> 00:04:09,040 menyimpulkan jenis, jenis apa Warna harus sebelah mata Mary 113 00:04:09,040 --> 00:04:10,910 sehingga tidak benar-benar begitu pixelated. 114 00:04:10,910 --> 00:04:14,510 Tetapi jika saya terus zoom, ada adalah orang jahat di matanya. 115 00:04:14,510 --> 00:04:16,600 Seperti itu adalah semua informasi yang kami miliki. 116 00:04:16,600 --> 00:04:18,920 Anda tidak dapat membuat Informasi dari ketiadaan. 117 00:04:18,920 --> 00:04:20,790 Ada hanya terbatas jumlah bit ada. 118 00:04:20,790 --> 00:04:22,873 >> Jadi pada Soal Set 4, di mana Anda memiliki kesempatan 119 00:04:22,873 --> 00:04:24,580 bermain dengan semacam ini dunia. 120 00:04:24,580 --> 00:04:27,610 Pada Soal Set 4, Anda akan menjelajahi dunia grafis, dan forensik, 121 00:04:27,610 --> 00:04:30,870 dan benar-benar menulis kode yang hilang pulih gambar. 122 00:04:30,870 --> 00:04:33,510 Anda akan menulis kode yang memanipulasi gambar yang ada 123 00:04:33,510 --> 00:04:36,120 dan akhirnya memahami apa terjadi di bawah tenda. 124 00:04:36,120 --> 00:04:38,540 >> Dan, ternyata, itu sebenarnya tidak semua yang rumit. 125 00:04:38,540 --> 00:04:41,320 Misalnya, jika kita ingin mewakili wajah tersenyum di mana 126 00:04:41,320 --> 00:04:44,160 dengan ini piksel hitam, atau ini titik-titik hitam, 127 00:04:44,160 --> 00:04:47,230 baik, kita hanya bisa mewakili mereka sebagai benar-benar bitmap. 128 00:04:47,230 --> 00:04:50,040 Dan jika Anda pernah mendengar bahwa ekspresi bitmap, mungkin 129 00:04:50,040 --> 00:04:52,330 sekarang mulai membuat akal lagi hari ini. 130 00:04:52,330 --> 00:04:53,580 >> Kita sudah tahu apa yang sedikit ini. 131 00:04:53,580 --> 00:04:54,160 Ini 0 atau 1. 132 00:04:54,160 --> 00:04:56,201 Dan peta hanya sesuatu seperti sepotong kertas 133 00:04:56,201 --> 00:04:59,180 yang memberikan arah dan memiliki 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 Ini peta bit dimana 1 tampaknya 136 00:05:03,680 --> 00:05:07,857 akan mewakili piksel putih, dan 0 akan mewakili pixel hitam. 137 00:05:07,857 --> 00:05:09,440 Tapi kita pasti bisa flip itu sekitar. 138 00:05:09,440 --> 00:05:11,648 Itu tidak terlalu penting sehingga Selama kami konsisten. 139 00:05:11,648 --> 00:05:15,570 Dan di sini adalah bagaimana, di dalam binary-- memori komputer, atau bahkan di dalam 140 00:05:15,570 --> 00:05:18,160 dari sebuah file pada hard Anda drive-- bisa Anda menyimpan 141 00:05:18,160 --> 00:05:20,240 yang paling sederhana dari gambar wajah tersenyum. 142 00:05:20,240 --> 00:05:23,990 Tapi apa yang kita, tentu saja, kurang dalam gambar ini? 143 00:05:23,990 --> 00:05:24,610 Warna, kan? 144 00:05:24,610 --> 00:05:28,220 Ini adalah langkah berikutnya yang jelas atau perangkat tambahan untuk meningkatkan ini dengan warna. 145 00:05:28,220 --> 00:05:32,230 Jadi sayangnya dengan hanya satu bit, 0 atau 1, kita bisa mewakili warna. 146 00:05:32,230 --> 00:05:36,100 Itu bisa menjadi merah, atau biru, atau hitam, atau putih, atau hijau, atau pink, 147 00:05:36,100 --> 00:05:37,420 atau pasang warna. 148 00:05:37,420 --> 00:05:40,860 Tapi untuk mudahnya, kami akan hanya berasumsi hitam dan putih. 149 00:05:40,860 --> 00:05:45,930 >> Jadi apa yang logis kita perlu jika kita ingin menerapkan warna dalam gambar? 150 00:05:45,930 --> 00:05:49,080 Apa yang harus kita lakukan? 151 00:05:49,080 --> 00:05:51,900 Seperti jika faktor pembatas sini adalah bahwa dengan satu bit Anda hanya bisa 152 00:05:51,900 --> 00:05:55,977 mewakili dua negara, 0 atau 1, putih atau hitam, apa yang Anda ingin lakukan? 153 00:05:55,977 --> 00:05:56,810 AUDIENCE: Lebih data. 154 00:05:56,810 --> 00:05:58,813 DAVID J. Malan: Lebih bit, ya lebih banyak data, lebih banyak bit. 155 00:05:58,813 --> 00:06:01,440 Dan, memang, itulah bagaimana gambar berwarna diwakili. 156 00:06:01,440 --> 00:06:05,120 Daripada menggunakan sedikit tunggal, 0 atau 1 untuk setiap pixel, masing-masing titik, 157 00:06:05,120 --> 00:06:06,170 Anda hanya menggunakan beberapa. 158 00:06:06,170 --> 00:06:09,660 Mungkin menggunakan 8, mungkin, lebih sering menggunakan 24, dan memang, pada Soal Set 159 00:06:09,660 --> 00:06:13,300 4, akan Anda bermain dengan file Format yang menggunakan 24 bit biasanya. 160 00:06:13,300 --> 00:06:15,430 >> Tapi sebagian besar dari Anda mungkin akrab dengan JPEG. 161 00:06:15,430 --> 00:06:17,460 Jika Anda pernah diambil foto di ponsel Anda, 162 00:06:17,460 --> 00:06:20,360 atau upload atau melihat sesuatu di Facebook, Flickr atau, sejumlah 163 00:06:20,360 --> 00:06:24,882 website-foto berbasis, Anda sudah mungkin melihat gambar JPEG sebelumnya. 164 00:06:24,882 --> 00:06:27,840 Dan ternyata, ini adalah file Format kita akan gunakan dalam PSet 4, 165 00:06:27,840 --> 00:06:30,340 dimana Anda akan harus memulihkan gambar 166 00:06:30,340 --> 00:06:35,160 bahwa saya telah sengaja dihapus dari kartu memori rusak dalam kamera, 167 00:06:35,160 --> 00:06:35,800 jika Anda mau. 168 00:06:35,800 --> 00:06:38,490 >> Dan ternyata bahwa meskipun JPEG cukup sophisticated-- 169 00:06:38,490 --> 00:06:40,906 itu jauh lebih canggih dari titik-titik hitam dan putih 170 00:06:40,906 --> 00:06:44,480 kami melihat beberapa saat yang lalu, karena ada algoritma sebenarnya mewah yang 171 00:06:44,480 --> 00:06:47,410 digunakan untuk kompres JPEG, jadi Anda dapat memiliki benar-benar baik, 172 00:06:47,410 --> 00:06:49,832 kualitas gambar tetapi menggunakan relatif sedikit bit. 173 00:06:49,832 --> 00:06:51,790 Dan kami akan kembali ke kompresi sebelum lama. 174 00:06:51,790 --> 00:06:56,280 Ternyata bahwa yang pertama tiga byte dalam image-- JPEG 175 00:06:56,280 --> 00:07:02,750 tidak peduli apa yang telah Anda diambil sebuah foto of-- adalah nilai-nilai 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> Dengan kata lain, jika Anda hanya melihat bahwa pola bit, 177 00:07:05,990 --> 00:07:09,180 diwakili di sini tiga byte, atau 24 bit total, 178 00:07:09,180 --> 00:07:13,810 dengan probabilitas tinggi Anda dapat menyimpulkan bahwa Anda melihat itu ini pertama tiga 179 00:07:13,810 --> 00:07:15,230 byte dari JPEG. 180 00:07:15,230 --> 00:07:18,040 Dan ini adalah apa yang diketahui sebagai tanda tangan dari JPEG. 181 00:07:18,040 --> 00:07:20,540 Banyak format file di luar sana cenderung mulai 182 00:07:20,540 --> 00:07:23,735 dengan pola tertentu 0s dan 1s, sehingga Windows, dan Mac OS, dan iOS, 183 00:07:23,735 --> 00:07:28,272 dan Android tahu apa jenis file mereka adalah, selain yang disebut berkas 184 00:07:28,272 --> 00:07:29,730 ekstensi yang banyak file memiliki. 185 00:07:29,730 --> 00:07:32,590 Jika Anda telah .jpg, itu petunjuk lain ke komputer. 186 00:07:32,590 --> 00:07:35,310 >> Jadi mari kita sekarang melihat ini sedikit lebih teknis. 187 00:07:35,310 --> 00:07:37,390 Kita tahu desimal Sistem adalah 0 sampai 9. 188 00:07:37,390 --> 00:07:38,740 Kita tahu biner adalah 0 dan 1. 189 00:07:38,740 --> 00:07:41,842 Dan jika Anda berpikir kembali ke PSet 0, kami memiliki Anda bergulat dengan, 190 00:07:41,842 --> 00:07:43,800 untuk sedikit, sesuatu disebut heksadesimal, 191 00:07:43,800 --> 00:07:47,320 di mana Anda memiliki 16 digit, bukan 10 atau bukan 2. 192 00:07:47,320 --> 00:07:50,405 Dan orang-orang digit, dengan konvensi, adalah 0 sampai 9 dan kemudian 193 00:07:50,405 --> 00:07:55,040 melalui f, dimana f mewakili apa angka desimal, hanya sebagai kewarasan cepat 194 00:07:55,040 --> 00:07:56,640 memeriksa? 195 00:07:56,640 --> 00:07:57,610 Jadi, 15. 196 00:07:57,610 --> 00:08:01,390 Dan harus mewakili 10, hanya dengan sifat pemesanan yang saya berikan. 197 00:08:01,390 --> 00:08:04,350 Ini hanya sebuah konvensi sewenang-wenang, tapi itu cukup standar. 198 00:08:04,350 --> 00:08:06,870 >> Jadi jika kita melihat pola ini tiga bytes-- mari 199 00:08:06,870 --> 00:08:09,620 hanya mulai untuk melihat itu di secara konsisten dengan bagaimana 200 00:08:09,620 --> 00:08:12,450 ilmuwan komputer umumnya melihat dan berpikir tentang file. 201 00:08:12,450 --> 00:08:15,580 Anda pasti bisa berpikir tentang file dalam 0s, dan 1s, dan desimal, 202 00:08:15,580 --> 00:08:19,340 namun pada kenyataannya, kita cenderung menggunakan biner atau lebih biasanya hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 kembali dari PSet 0. 204 00:08:20,760 --> 00:08:25,857 Jadi biarkan aku mengusulkan bahwa 255, 216, dan 255 hanya pola-pola 0s dan 1s. 205 00:08:25,857 --> 00:08:28,440 Dan Anda dapat memeriksa ini jika Anda ingin melakukan matematika dari minggu 0. 206 00:08:28,440 --> 00:08:30,810 Tapi, untuk saat ini, hanya berasumsi bahwa ini memang benar. 207 00:08:30,810 --> 00:08:33,850 Saya baru saja ditulis ulang tiga desimal nomor tiga nilai biner. 208 00:08:33,850 --> 00:08:36,100 Sekarang apa yang akan saya lakukan adalah hanya menambahkan beberapa ruang putih, 209 00:08:36,100 --> 00:08:37,266 hanya demi dibaca itu. 210 00:08:37,266 --> 00:08:39,940 Dan pemberitahuan, aku hanya akan untuk memindahkan hal-hal terpisah. 211 00:08:39,940 --> 00:08:43,090 Jadi sebelum, sesudah, sebelum, sesudah. 212 00:08:43,090 --> 00:08:46,180 Saya melakukan apa-apa yang menarik lainnya dari sekedar menyebarkan hal-hal begitu 213 00:08:46,180 --> 00:08:50,380 bahwa pemberitahuan setiap set delapan bit sekarang dua set empat bit. 214 00:08:50,380 --> 00:08:54,920 Hal ini berguna karena heksadesimal sangat modis 215 00:08:54,920 --> 00:09:00,930 karena setiap heksadesimal digit 0 melalui f, atau lebih khusus 0 sampai 15, 216 00:09:00,930 --> 00:09:03,430 dapat direpresentasikan dengan tepat empat bit. 217 00:09:03,430 --> 00:09:07,960 Dengan kata lain, dalam heksadesimal jika Anda ingin mewakili 0, itu hanya 0000, 218 00:09:07,960 --> 00:09:08,780 empat angka nol. 219 00:09:08,780 --> 00:09:13,997 Dan jika Anda ingin mewakili 15, itu 1111, yang merupakan empat bit. 220 00:09:13,997 --> 00:09:16,080 Dan jika Anda melakukan matematika, jika ini adalah tempat yang, 221 00:09:16,080 --> 00:09:18,210 ini adalah tempat 16s, yang akan memberikan you-- 222 00:09:18,210 --> 00:09:19,960 bukan yang akan to-- maaf, dalam biner, 223 00:09:19,960 --> 00:09:23,660 yang akan memberi Anda 15, yang tempat, berpasangan tempat, merangkak dan delapan tempat. 224 00:09:23,660 --> 00:09:26,821 Jadi biarkan aku mengusulkan bahwa yang set empat bit di sebelah kiri 225 00:09:26,821 --> 00:09:28,070 adalah apa yang kita akan menelepon f. 226 00:09:28,070 --> 00:09:30,110 Ini jumlah terbesar Anda dapat mewakili dengan empat bit. 227 00:09:30,110 --> 00:09:33,300 Dan kita sudah tahu dari heksadesimal, f adalah digit terbesar di heksadesimal. 228 00:09:33,300 --> 00:09:36,020 Kami punya f lain di sana, dua lagi di sana. 229 00:09:36,020 --> 00:09:38,980 Dan untuk saat ini, hanya mengambil pada iman bahwa saya telah melakukan matematika yang tepat 230 00:09:38,980 --> 00:09:41,890 dan yang kiri setengah dari mereka bit, 1101, 231 00:09:41,890 --> 00:09:43,980 adalah hal yang sama seperti d dalam heksadesimal. 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 bahwa seseorang mudah untuk melihat, kan? 234 00:09:48,140 --> 00:09:51,670 8 represents-- tepat di bawah tempat delapan. 235 00:09:51,670 --> 00:09:56,040 Jadi kita memiliki satu di kolom delapan dan tidak ada di merangkak, berpasangan atau yang. 236 00:09:56,040 --> 00:09:59,830 Jadi sekarang lebih konvensional, manusia cenderung menulis digit heksadesimal 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 berarti apa-apa selain petunjuk visual untuk human-- sebuah 239 00:10:05,920 --> 00:10:10,350 di sini datang value-- heksadesimal karena mungkin tidak dinyatakan jelas. 240 00:10:10,350 --> 00:10:13,629 >> Yang mengatakan, pada akhirnya, yang pola nol dan satu, 241 00:10:13,629 --> 00:10:16,170 atau pola heksadesimal Angka ekuivalen bahwa Anda 242 00:10:16,170 --> 00:10:18,990 akan mulai mencari Soal Set 4 adalah this-- 243 00:10:18,990 --> 00:10:22,120 dan Masalah Set 4 spek akan berjalan Anda melalui ini lebih detail-- 244 00:10:22,120 --> 00:10:25,344 tapi menyadari sebagai semacam misterius sebagai ini mungkin terlihat pada pandangan pertama, 245 00:10:25,344 --> 00:10:27,010 Anda akan mulai melihat ini banyak. 246 00:10:27,010 --> 00:10:30,320 Dan pada kenyataannya, bahkan dalam GDB, yang debugger kami memperkenalkan Senin 247 00:10:30,320 --> 00:10:35,440 dan Dan memperkenalkan di PSet 3, akan sering menunjukkan nilai-nilai heksadesimal 248 00:10:35,440 --> 00:10:39,910 hanya karena mereka cenderung lebih konvensional dari desimal atau biner 249 00:10:39,910 --> 00:10:41,157 di dunia komputer. 250 00:10:41,157 --> 00:10:42,490 Sekarang mari kita menempatkan ini dalam konteks. 251 00:10:42,490 --> 00:10:48,040 Banyak dari Anda mungkin ingat ini gambar di sini, yang berasal dari apa? 252 00:10:48,040 --> 00:10:51,240 Vista, bahkan lebih awal dari itu, Windows XP melakukan debutnya ini. 253 00:10:51,240 --> 00:10:52,620 Jadi ini adalah pemandangan yang indah. 254 00:10:52,620 --> 00:10:55,940 Dan pada kenyataannya, jika Anda melihat-online-- Saya pikir itu sebuah artikel Wikipedia, 255 00:10:55,940 --> 00:11:00,110 dimana seseorang yang sangat luar biasa keluar menemukan lokasi ini di dunia diatur 256 00:11:00,110 --> 00:11:02,240 atau kameranya di justru place-- tepat 257 00:11:02,240 --> 00:11:06,510 dan hari ini ini terlihat like-- tapi itu persis pengaturan yang sama. 258 00:11:06,510 --> 00:11:10,060 Gambar ini, meskipun, adalah dalam file format yang disebut bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Dan kita akan mengambil super sekilas apa artinya. 260 00:11:12,910 --> 00:11:17,770 >> Tapi bitmap hanyalah sebuah cara yang berbeda gambar mewakili masih menggunakan piksel 261 00:11:17,770 --> 00:11:19,580 di 0s dan 1s, akhirnya. 262 00:11:19,580 --> 00:11:23,282 Tapi sekilas cepat, memiliki tanda tangan lebih menarik 263 00:11:23,282 --> 00:11:24,490 pada awal file. 264 00:11:24,490 --> 00:11:26,670 Ini bukan hanya tiga byte, bukan ada 265 00:11:26,670 --> 00:11:30,770 sejumlah besar pola byte yang telah ditentukan sebelumnya makna. 266 00:11:30,770 --> 00:11:34,490 Misalnya, di suatu tempat di beberapa byte pertama dari gambar bitmap 267 00:11:34,490 --> 00:11:37,440 akan menjadi ukuran gambar, lebar gambar, 268 00:11:37,440 --> 00:11:40,390 ketinggian gambar, sehingga metadata berguna, jika Anda mau. 269 00:11:40,390 --> 00:11:43,940 Informasi yang berguna yang Photoshop atau grafis memprogram Anda menggunakan 270 00:11:43,940 --> 00:11:45,180 mungkin benar-benar peduli. 271 00:11:45,180 --> 00:11:47,170 >> Jadi lebih lanjut tentang ini di Soal Set 4, tapi ini 272 00:11:47,170 --> 00:11:49,220 hanya untuk mengatakan bahwa pada akhir hari 273 00:11:49,220 --> 00:11:52,390 semua format file yang Anda telah menggunakan untuk years-- file Microsoft Word, 274 00:11:52,390 --> 00:11:55,820 File nomor, file Excel, sejumlah format file 275 00:11:55,820 --> 00:11:57,770 yang mungkin memiliki beberapa ekstensi file yang dikenal 276 00:11:57,770 --> 00:12:00,130 hanya 0 dan 1 di bawah tenda. 277 00:12:00,130 --> 00:12:02,970 Dan manusia telah memutuskan apa konvensi, 278 00:12:02,970 --> 00:12:08,340 apa pola 0s dan 1s mewakili Word mengajukan versus file Excel, 279 00:12:08,340 --> 00:12:10,322 dibandingkan sejumlah format file lainnya. 280 00:12:10,322 --> 00:12:12,780 Jadi di PSet 4, Anda akan memiliki kesempatan untuk bermain dengan itu. 281 00:12:12,780 --> 00:12:14,405 >> Tapi apa artinya memiliki struct. 282 00:12:14,405 --> 00:12:18,012 Ini sebenarnya adalah Shalawat bagus sekarang ke C, yang memiliki hanya beberapa 283 00:12:18,012 --> 00:12:20,220 fitur tambahan yang kami belum melihat belum. 284 00:12:20,220 --> 00:12:24,230 Ini adalah bahasa yang cukup kecil dan salah satu fitur bagus tentang C adalah struct. 285 00:12:24,230 --> 00:12:27,300 Misalnya, jika Anda ingin represent-- mari 286 00:12:27,300 --> 00:12:33,690 mengatakan Anda ingin memiliki variabel yang merupakan mahasiswa pada beberapa program. 287 00:12:33,690 --> 00:12:37,330 Mungkin Anda sedang menulis kursus Program pendaftaran, atau belanja inti 288 00:12:37,330 --> 00:12:38,870 alat, atau sesuatu seperti itu. 289 00:12:38,870 --> 00:12:42,922 Apa potongan data yang terkait untuk mahasiswa yang datang ke pikiran? 290 00:12:42,922 --> 00:12:44,880 Seperti mahasiswa adalah diwakili dengan nilai-nilai apa? 291 00:12:44,880 --> 00:12:45,732 Ya? 292 00:12:45,732 --> 00:12:46,940 Anda memiliki nama sebagai mahasiswa. 293 00:12:46,940 --> 00:12:48,900 Apa lagi yang seorang mahasiswa khas memiliki? 294 00:12:48,900 --> 00:12:49,320 >> AUDIENCE: [tidak terdengar] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. Malan: Jadi, maaf. 296 00:12:50,200 --> 00:12:50,660 >> AUDIENCE: Umur. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. Malan: Sebuah usia atau ulang tahun ekuivalen, ya. 298 00:12:52,980 --> 00:12:53,557 Apa lagi? 299 00:12:53,557 --> 00:12:54,390 AUDIENCE: nomor ID? 300 00:12:54,390 --> 00:12:57,460 DAVID J. Malan: Jadi nomor ID, mungkin nomor telepon, mungkin asrama, atau rumah, 301 00:12:57,460 --> 00:12:58,670 atau perguruan tinggi, atau sesuatu seperti itu. 302 00:12:58,670 --> 00:13:01,820 Sejumlah potongan data yang Anda mungkin memiliki dalam daftar kontak Anda 303 00:13:01,820 --> 00:13:03,890 adalah apa yang mungkin mendefinisikan mahasiswa. 304 00:13:03,890 --> 00:13:08,490 Jadi jika kita ingin melakukan hal ini, dalam kode, kita mungkin melakukan sesuatu yang sederhana seperti ini. 305 00:13:08,490 --> 00:13:15,670 Kita mungkin memiliki program sehingga memiliki katakanlah, int main (void). 306 00:13:15,670 --> 00:13:18,920 Dan jika saya ingin mewakili mahasiswa saya mungkin harus, misalnya, 307 00:13:18,920 --> 00:13:24,330 string disebut nama untuk mahasiswa itu, string disebut asrama untuk mahasiswa itu, 308 00:13:24,330 --> 00:13:26,900 mungkin int disebut ID bagi siswa itu. 309 00:13:26,900 --> 00:13:30,840 Dan karena aku menggunakan tali, saya harus kembali dan memasang CS50.h. 310 00:13:30,840 --> 00:13:33,300 Mungkin aku akan membutuhkan stdio.h. 311 00:13:33,300 --> 00:13:38,190 Jadi biarkan aku Terlebih Dahulu melakukan hal-dan aku akan memanggil student.c ini untuk saat ini 312 00:13:38,190 --> 00:13:40,080 dan menyimpan ini. 313 00:13:40,080 --> 00:13:44,206 >> Dan sekarang saya bisa melakukan sesuatu dengan variabel-variabel ini. 314 00:13:44,206 --> 00:13:46,830 Dan kami hanya akan menulis bahwa sebagai komentar dalam kode semu, 315 00:13:46,830 --> 00:13:48,829 karena itu tidak menarik apa yang kita lakukan untuk saat ini. 316 00:13:48,829 --> 00:13:51,242 OK, jadi ini adalah sebuah program yang entah bagaimana menyimpan mahasiswa. 317 00:13:51,242 --> 00:13:53,450 Apa yang ingin saya lakukan jika saya ingin menyimpan dua siswa? 318 00:13:53,450 --> 00:13:55,991 Jadi insting pertama saya akan baik-baik saja, tunggu sebentar, 319 00:13:55,991 --> 00:14:01,920 jika saya memiliki siswa lain mengapa tidak melakukan I hanya melakukan string name 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 kami sudah melakukan pergi jalan ini sebelum 322 00:14:06,540 --> 00:14:10,890 dan apa solusi kami untuk apa yang tampaknya menjadi semacam copy paste hackish 323 00:14:10,890 --> 00:14:11,555 pekerjaan di sini? 324 00:14:11,555 --> 00:14:12,346 AUDIENCE: Sebuah array. 325 00:14:12,346 --> 00:14:13,830 DAVID J. Malan: Ya, kita bisa menggunakan array. 326 00:14:13,830 --> 00:14:15,620 Hak ini sangat cepat menjadi berat. 327 00:14:15,620 --> 00:14:18,453 Anda harus memilah dari sewenang-wenang mulai penamaan semua variabel. 328 00:14:18,453 --> 00:14:22,190 Dan Anda, manusia, harus tetap melacak yang berkoresponden OK name2 329 00:14:22,190 --> 00:14:25,060 dengan dorm2 sesuai dengan ID2. 330 00:14:25,060 --> 00:14:26,200 Itu hanya menjadi berantakan. 331 00:14:26,200 --> 00:14:29,350 Jadi jauh lebih mudah, ingat dari beberapa minggu yang lalu, 332 00:14:29,350 --> 00:14:34,300 hanya harus disebut nama string dan mungkin memberi kita tiga dari mereka. 333 00:14:34,300 --> 00:14:36,940 Dan kemudian mungkin kita memiliki tali asrama dan memiliki 334 00:14:36,940 --> 00:14:41,900 tiga dari mereka, atau dengan konstan, int id dan memiliki tiga dari mereka. 335 00:14:41,900 --> 00:14:45,250 Tapi bahkan sekarang ini terasa sedikit ceroboh, benar. 336 00:14:45,250 --> 00:14:49,440 Kita bicara tentang siswa dan belum Aku benar-benar tinggal di tingkat rendah 337 00:14:49,440 --> 00:14:50,470 rincian implementasi. 338 00:14:50,470 --> 00:14:52,790 Mahasiswa adalah nama dan asrama dan ID. 339 00:14:52,790 --> 00:14:59,814 >> Mengapa saya tidak bisa hanya menyatakan variabel disebut mahasiswa dan menyebutnya s. 340 00:14:59,814 --> 00:15:02,230 Dan jika saya ingin siswa lain, kenapa tidak saya sebut saja t. 341 00:15:02,230 --> 00:15:05,260 Atau jika saya ingin seluruh sekelompok siswa, mengapa tidak melakukan saya hanya 342 00:15:05,260 --> 00:15:09,740 mengatakan bahwa saya memiliki seluruh kelas siswa, dan itu tiga dari mereka. 343 00:15:09,740 --> 00:15:12,470 Dengan kata lain, mengapa saya tidak bisa datang dengan tipe data saya sendiri, yang disebut 344 00:15:12,470 --> 00:15:15,641 Mahasiswa, dalam yang nama, adalah ID, adalah asrama, 345 00:15:15,641 --> 00:15:16,890 adalah sejumlah bidang lainnya. 346 00:15:16,890 --> 00:15:19,030 Dan ternyata Anda dapat melakukan hal itu. 347 00:15:19,030 --> 00:15:21,850 >> Jadi C memiliki fitur ini disebut struct. 348 00:15:21,850 --> 00:15:24,700 Itu fitur bahasa yang memungkinkan kita untuk melakukan hal ini. 349 00:15:24,700 --> 00:15:28,370 Aku akan pergi ke depan dan membuka structs.h 350 00:15:28,370 --> 00:15:32,299 di mana kita akan melihat Berikut definisi mahasiswa. 351 00:15:32,299 --> 00:15:35,215 Ternyata - dan yang satu ini bahkan sederhana daripada yang melibatkan ID 352 00:15:35,215 --> 00:15:36,080 beberapa saat. 353 00:15:36,080 --> 00:15:39,120 Jika Anda ingin datang dengan tipe data buatan sendiri, 354 00:15:39,120 --> 00:15:42,750 dan selain int, dan char dan mengapung dan semua orang lain ini yang ada, 355 00:15:42,750 --> 00:15:45,810 Anda dapat melakukannya dengan benar menulis typedef struct, 356 00:15:45,810 --> 00:15:47,880 kemudian beberapa kurung kurawal, dalam yang Anda 357 00:15:47,880 --> 00:15:51,460 daftar variabel yang ingin Anda kaitkan dengan data ini kustom baru 358 00:15:51,460 --> 00:15:55,670 ketik seperti nama dan asrama, dan kemudian setelah kurung kurawal 359 00:15:55,670 --> 00:15:57,860 Anda memberikan nama untuk tipe data baru. 360 00:15:57,860 --> 00:15:59,220 Jadi, misalnya, mahasiswa. 361 00:15:59,220 --> 00:16:03,247 >> Dan apa yang baik tentang ini sekarang adalah bahwa jika kita melihat kode yang sesuai, 362 00:16:03,247 --> 00:16:05,080 konvensi, pertama dari semua, adalah untuk menempatkan ini 363 00:16:05,080 --> 00:16:08,230 dalam sebuah file bernama sesuatu dot h, file header, yang kita belum 364 00:16:08,230 --> 00:16:09,780 mulai menggunakan diri kita terlalu banyak. 365 00:16:09,780 --> 00:16:12,120 Tapi kita akan memulai menggunakan sedikit sekarang. 366 00:16:12,120 --> 00:16:18,650 Dan apa yang bisa kita lakukan dengan ini, akhirnya, dalam beberapa baris kode 367 00:16:18,650 --> 00:16:22,130 adalah menyatakan hal itu tipe data, mahasiswa. 368 00:16:22,130 --> 00:16:23,230 Dan sekarang mari kita menggunakannya. 369 00:16:23,230 --> 00:16:27,274 >> Aku akan sekarang masuk ke file disebut structs1.c. 370 00:16:27,274 --> 00:16:29,440 Dan mari kita lihat sebuah beberapa karakteristik sini. 371 00:16:29,440 --> 00:16:32,250 Jadi hal-hal di sini adalah kebanyakan akrab, dan kami akan 372 00:16:32,250 --> 00:16:35,040 kembali ke apa yang tidak akrab hanya dalam beberapa saat. 373 00:16:35,040 --> 00:16:39,880 Hal ini tentu saja adalah termasuk saya sendiri file header, yang baru juga, 374 00:16:39,880 --> 00:16:42,580 kecuali untuk PSet 3 di mana, ingat, kita memiliki 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 >> Mengapa meskipun saya menggunakan tanda kutip bukannya kurung siku? 377 00:16:49,381 --> 00:16:50,630 Ketika saya memilih di antara mereka? 378 00:16:50,630 --> 00:16:52,310 Hampir selalu saya tampak menggunakan tanda kurung siku. 379 00:16:52,310 --> 00:16:55,040 Dan kemudian, tiba-tiba pada baris enam Saya menggunakan tanda kutip ganda. 380 00:16:55,040 --> 00:16:55,860 Mengapa itu? 381 00:16:55,860 --> 00:16:56,700 Ya? 382 00:16:56,700 --> 00:16:57,725 >> AUDIENCE: [tidak terdengar] 383 00:16:57,725 --> 00:16:59,350 DAVID J. Malan: Itu aktual, apa? 384 00:16:59,350 --> 00:17:00,559 AUDIENCE: Itu di IDE Anda. 385 00:17:00,559 --> 00:17:02,475 DAVID J. Malan: Ya, yang ada di IDE yang sebenarnya. 386 00:17:02,475 --> 00:17:05,690 Dan jangan berkutat pada IDE, karena itu hanya alat yang saya gunakan. 387 00:17:05,690 --> 00:17:08,119 Itu di saat saya direktori, secara khusus. 388 00:17:08,119 --> 00:17:11,647 Jadi structs.h adalah file saya sendiri tidak dipasang di IDE, 389 00:17:11,647 --> 00:17:14,480 dalam sistem operasi itu sendiri, bukan itu dalam direktori saya saat ini. 390 00:17:14,480 --> 00:17:16,910 Jadi konvensi adalah jika Anda ingin untuk menyertakan file header Anda sendiri, 391 00:17:16,910 --> 00:17:18,200 Anda hanya menggunakan tanda kutip ganda. 392 00:17:18,200 --> 00:17:23,290 >> Apa yang kita sebut hal ini di 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 sesuatu #define. 395 00:17:28,220 --> 00:17:31,040 Ini merupakan konstanta, kan? 396 00:17:31,040 --> 00:17:33,140 Jika Anda ingin memiliki nilai dalam program Anda 397 00:17:33,140 --> 00:17:35,110 Anda menggunakan seluruh beberapa kali, itu 398 00:17:35,110 --> 00:17:39,330 baik konvensi untuk faktor itu, mendeklarasikan, dengan simbol hash 399 00:17:39,330 --> 00:17:43,340 mendefinisikan, kemudian, dengan konvensi, dalam semua huruf besar word-- meskipun tidak 400 00:17:43,340 --> 00:17:45,320 benar-benar diperlukan, tetapi itu konvensi manusia 401 00:17:45,320 --> 00:17:47,210 untuk memanfaatkan konstanta sehingga mereka melompat keluar 402 00:17:47,210 --> 00:17:50,380 pada Anda visually-- ruang dan maka nilai Anda ingin menjadi 403 00:17:50,380 --> 00:17:52,250 setara dengan nama yang konstan itu. 404 00:17:52,250 --> 00:17:56,110 Tidak ada titik koma, tapi Anda hanya mengikuti pola yang ada. 405 00:17:56,110 --> 00:17:57,770 >> Jadi apa yang aku lakukan di kode aktual ini. 406 00:17:57,770 --> 00:18:00,660 Jadi mari kita lihat program utama di sini. 407 00:18:00,660 --> 00:18:04,080 Sejalan 12 karena saya telah memasukkan structs.h, 408 00:18:04,080 --> 00:18:06,492 Saya sekarang memiliki ajaib di saya pembuangan tipe data baru. 409 00:18:06,492 --> 00:18:09,200 Saya tidak hanya memiliki akses ke int, dan char, dan float, 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 sekarang memiliki akses ke tipe data siswa. 412 00:18:12,470 --> 00:18:17,740 Jadi sejalan 12, saya menggabungkan dua ideas-- satu tipe data kustom dan dua, 413 00:18:17,740 --> 00:18:18,940 menggunakan array. 414 00:18:18,940 --> 00:18:21,700 Dan dalam program ini jika Saya ingin benar-benar mendukung 415 00:18:21,700 --> 00:18:24,320 tiga siswa yang berbeda dalam program saya, saya 416 00:18:24,320 --> 00:18:30,480 hanya bisa mengatakan memberi saya sebuah variabel siswa disebut, yang masing-masing 417 00:18:30,480 --> 00:18:32,970 adalah mahasiswa jenis, yang adalah tipe data kebiasaan saya. 418 00:18:32,970 --> 00:18:35,890 Dan, khususnya, memberi saya tiga dari mereka dalam array 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 Berikut ini hanya untuk loop iterasi 0-3, karena itulah 421 00:18:40,670 --> 00:18:42,110 apa nilai siswa adalah. 422 00:18:42,110 --> 00:18:44,420 Aku hanya mendorong pengguna memberi saya nama siswa. 423 00:18:44,420 --> 00:18:48,090 Dan kemudian sejalan 17, kami memiliki garis besar yang akrab. 424 00:18:48,090 --> 00:18:50,370 Kami memiliki teman lama kami GetString di sebelah kanan. 425 00:18:50,370 --> 00:18:52,345 Dan sepotong apa sintaks tampaknya baru, 426 00:18:52,345 --> 00:18:55,130 jika Anda belum pernah diprogram dalam C sebelumnya, dan tidak pernah menggunakan struct? 427 00:18:55,130 --> 00:18:55,510 Ya? 428 00:18:55,510 --> 00:18:56,417 >> AUDIENCE: .name The. 429 00:18:56,417 --> 00:18:57,500 DAVID J. Malan: .name The. 430 00:18:57,500 --> 00:19:01,220 Tapi ini tidak terlalu banyak lompatan, karena sekarang siswa braket i 431 00:19:01,220 --> 00:19:02,590 memberi Anda-i mahasiswa. 432 00:19:02,590 --> 00:19:04,730 Dan jika Anda ingin menyelam dalam struktur itu, 433 00:19:04,730 --> 00:19:09,490 Anda hanya menggunakan satu periode dan maka nama variabel dalam, 434 00:19:09,490 --> 00:19:11,900 atau properti dalam yang Anda ingin mendapatkan akses ke. 435 00:19:11,900 --> 00:19:14,816 Demikian pula kemudian, jika saya kemudian meminta pengguna, memberikan asrama siswa, 436 00:19:14,816 --> 00:19:18,390 Anda sama dapat menyimpan bahwa string dalam variabel asrama di dalam 437 00:19:18,390 --> 00:19:19,940 dari struktur siswa. 438 00:19:19,940 --> 00:19:21,410 >> Dan sekarang hal mendapatkan sedikit mewah. 439 00:19:21,410 --> 00:19:24,420 Dan ini akan terlihat di mungkin banyak cukup segera. 440 00:19:24,420 --> 00:19:27,970 Tetapi Anda akan melihat ini jauh lebih dalam PSet 4, jadi mari kita melirik sekarang. 441 00:19:27,970 --> 00:19:33,364 Ternyata sejalan 23 melalui 38, apa yang Anda pikir saya mungkin lakukan? 442 00:19:33,364 --> 00:19:35,530 Aku telah menghapus komentar untuk hari ini, tapi versi 443 00:19:35,530 --> 00:19:38,660 kode online untuk referensi memiliki semua komentar. 444 00:19:38,660 --> 00:19:40,171 Apa yang harus saya tampaknya akan melakukan? 445 00:19:40,171 --> 00:19:42,530 >> AUDIENCE: Menyimpan file dengan semua informasi bahwa pengguna masuk. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. Malan: Ya, persis, ini adalah cara baru 447 00:19:44,530 --> 00:19:46,370 yang kita lihat dua, Fitur lain dari C, 448 00:19:46,370 --> 00:19:48,700 dimana saya bisa membuat file saya sendiri. 449 00:19:48,700 --> 00:19:51,580 Sejauh ini, hampir setiap program Anda telah menulis adalah stateless. 450 00:19:51,580 --> 00:19:53,334 Begitu hal itu dilakukan berjalan, itu saja. 451 00:19:53,334 --> 00:19:55,000 Tidak ada memori atau ingatan itu. 452 00:19:55,000 --> 00:19:56,110 Tidak ada file yang disimpan. 453 00:19:56,110 --> 00:19:58,120 Tapi jika Anda ingin menyimpan masukan yang memiliki 454 00:19:58,120 --> 00:20:02,100 terjadi, seperti pada permainan atau program seperti ini, ternyata kita bisa melakukannya. 455 00:20:02,100 --> 00:20:04,360 Dan Anda akan melihat ini lebih di PSet 4 dan Bagian. 456 00:20:04,360 --> 00:20:08,661 Tapi garis ini 23 pada dasarnya menciptakan sebuah file bernama students.csv. 457 00:20:08,661 --> 00:20:10,160 Dan Anda mungkin telah melihat ini sebelumnya. 458 00:20:10,160 --> 00:20:14,250 Bahkan jika Anda tidak pernah belajar CS sebelumnya, CSV adalah variabel dipisahkan dengan koma. 459 00:20:14,250 --> 00:20:19,000 Ini seperti orang yang sangat miskin versi dari file Excel, 460 00:20:19,000 --> 00:20:22,270 yang berarti bahwa itu bisa dibuka di Excel dan di Bilangan Apple, 461 00:20:22,270 --> 00:20:23,830 dan memiliki baris dan kolom. 462 00:20:23,830 --> 00:20:26,485 Tapi itu bukan milik Format seperti Microsoft atau Apple. 463 00:20:26,485 --> 00:20:29,840 Itu hanya koma memisahkan nilai-nilai yang akan kita lihat sebentar lagi. 464 00:20:29,840 --> 00:20:31,010 >> Dan hanya mengambil menebak. 465 00:20:31,010 --> 00:20:33,480 Sejalan 23, di bagian paling akhir, argumen kedua saya 466 00:20:33,480 --> 00:20:37,700 untuk fungsi baru ini disebut f terbuka untuk file yang terbuka adalah w. 467 00:20:37,700 --> 00:20:39,430 Apa yang mungkin w menunjukkan? 468 00:20:39,430 --> 00:20:40,022 Ya? 469 00:20:40,022 --> 00:20:41,260 >> AUDIENCE: Ini memungkinkan Anda menulis ke file? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. Malan: Ini memungkinkan Anda menulis ke file. 471 00:20:42,630 --> 00:20:44,810 Jadi ada beberapa varian bahwa kita bisa pasang di sini. 472 00:20:44,810 --> 00:20:47,184 Tetapi jika Anda hanya ingin membaca file, yang melihat itu 473 00:20:47,184 --> 00:20:50,010 dan membacanya ke dalam memori, Anda hanya menggunakan kutipan tanda kutip "r". 474 00:20:50,010 --> 00:20:53,110 Jika Anda ingin menulis ke File, Anda menggunakan kutipan tanda kutip "w". 475 00:20:53,110 --> 00:20:55,190 Ada juga menambahkan dan beberapa hal-hal lain 476 00:20:55,190 --> 00:20:57,356 jika Anda ingin memodifikasi file yang ada. 477 00:20:57,356 --> 00:21:00,480 Sekarang kita akan terus melihat ini hal, maka kita akan kembali ke garis 24. 478 00:21:00,480 --> 00:21:02,640 NULL, ternyata, adalah nilai khusus yang 479 00:21:02,640 --> 00:21:06,070 dapat dikembalikan oleh fungsi-fungsi tertentu jika ada sesuatu yang SALAH 480 00:21:06,070 --> 00:21:08,490 jika file tidak ada, jika Anda sudah kehabisan memori, 481 00:21:08,490 --> 00:21:09,620 atau sekelompok kesalahan lainnya. 482 00:21:09,620 --> 00:21:13,470 Tapi untuk saat ini, mari kita berasumsi bahwa ini adalah pengecekan error hanya konvensional. 483 00:21:13,470 --> 00:21:17,090 Berikut sejalan 26, aku iterasi 0-3 atas semua siswa saya. 484 00:21:17,090 --> 00:21:20,470 Dan ini adalah jenis semacam dari fungsi baru, fprintf, 485 00:21:20,470 --> 00:21:21,460 tapi hanya mengambil menebak. 486 00:21:21,460 --> 00:21:24,370 Jika printf hanya cetak string diformat, 487 00:21:24,370 --> 00:21:26,507 apa fprintf mungkin berarti? 488 00:21:26,507 --> 00:21:27,590 AUDIENCE: Cetak ke file. 489 00:21:27,590 --> 00:21:29,290 DAVID J. Malan: Cetak string yang diformat ke file. 490 00:21:29,290 --> 00:21:31,180 Itulah yang tambahan f berarti adalah file yang. 491 00:21:31,180 --> 00:21:36,420 Dan baru pertama argumen harus variabel yang mewakili file Anda. 492 00:21:36,420 --> 00:21:38,866 Maka kita hanya memiliki format string yang seperti printf. 493 00:21:38,866 --> 00:21:40,740 Dan meskipun ini sintaks baru, ini hanya 494 00:21:40,740 --> 00:21:44,610 berarti pasang di nama siswa, plug-dalam asrama mahasiswa, dan kemudian 495 00:21:44,610 --> 00:21:47,160 dengan fclose, menutup file. 496 00:21:47,160 --> 00:21:49,730 Dan kemudian lastly-- ini baru dan kami akan kembali ke ini 497 00:21:49,730 --> 00:21:53,240 sebelum long-- aku membebaskan siswa untuk alasan 498 00:21:53,240 --> 00:21:54,860 yang terjadi di atas sana. 499 00:21:54,860 --> 00:21:56,820 Tapi kami akan kembali untuk itu sebelum long-- 500 00:21:56,820 --> 00:21:59,820 itu karena cara GetString adalah benar-benar bekerja di bawah tenda. 501 00:21:59,820 --> 00:22:01,280 >> Jadi mari kita lihat di sini. 502 00:22:01,280 --> 00:22:04,380 Jika saya ketik ls di direktori saya, melihat bahwa saya tidak 503 00:22:04,380 --> 00:22:09,360 memiliki file bernama students.csv, hanya tidak ada, tidak ada. 504 00:22:09,360 --> 00:22:14,965 Jadi jika sekarang saya mengkompilasi program ini, membuat struct-1,. / struct-1, 505 00:22:14,965 --> 00:22:20,570 dan aku akan pergi ke depan dan ketik Andi, yang tinggal di Berkeley di Yale. 506 00:22:20,570 --> 00:22:26,350 Kita akan memiliki Rob yang tinggal di Thayer hari ini. 507 00:22:26,350 --> 00:22:33,760 Dan mari kita datang dengan mana adalah, saya pikir, Maria adalah di Mather, 508 00:22:33,760 --> 00:22:35,100 jika saya ingat dengan benar. 509 00:22:35,100 --> 00:22:36,460 >> Jadi sepertinya tidak ada yang terjadi. 510 00:22:36,460 --> 00:22:40,680 Tetapi jika saya ketik ls sekarang, ada students.csv. 511 00:22:40,680 --> 00:22:43,080 Mari kita pergi ke depan dan students.csv terbuka. 512 00:22:43,080 --> 00:22:46,050 Ini lagi sangat format file ringan. 513 00:22:46,050 --> 00:22:49,570 Tapi aku hanya mengadopsi konvensi bahwa saya memiliki dua baris dan kolom sini. 514 00:22:49,570 --> 00:22:52,020 Kolom pertama adalah nama pertama orang. 515 00:22:52,020 --> 00:22:55,740 Kolom kedua adalah siswa asrama, atau perguruan tinggi, atau rumah, atau entah apa lagi. 516 00:22:55,740 --> 00:22:57,900 Dan sekarang aku sudah disimpan ini permanen dalam file. 517 00:22:57,900 --> 00:22:59,280 >> Sehingga tidak semua yang menarik. 518 00:22:59,280 --> 00:23:02,980 Tapi ini hanya batu loncatan sekarang untuk dapat bertahan informasi 519 00:23:02,980 --> 00:23:04,040 permanen. 520 00:23:04,040 --> 00:23:08,340 Jadi mari kita lihat sekarang apa lagi yang kita bisa lakukan dengan fitur ini dan lainnya. 521 00:23:08,340 --> 00:23:10,729 Tapi pertama, pertanyaan? 522 00:23:10,729 --> 00:23:12,145 Itu banyak, dan itu cepat. 523 00:23:12,145 --> 00:23:16,131 Tetapi Anda akan melihat banyak lebih PSet 4, juga. 524 00:23:16,131 --> 00:23:16,630 Ya? 525 00:23:16,630 --> 00:23:19,360 >> AUDIENCE: Apakah ada cara untuk terus menambahkan nama ke file itu? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. Malan: Pertanyaan yang bagus. 527 00:23:19,880 --> 00:23:21,800 Apakah ada cara untuk melanjutkan menambahkan nama ke file itu? 528 00:23:21,800 --> 00:23:22,340 Iya nih. 529 00:23:22,340 --> 00:23:24,630 Dan, pada kenyataannya, jika Anda berakhir up re-membuka file, 530 00:23:24,630 --> 00:23:26,780 Anda akan menggunakan kutipan tanda kutip "a" untuk append, 531 00:23:26,780 --> 00:23:31,090 yang hanya akan menambah baris baru, baris baru lagi dan lagi, persis. 532 00:23:31,090 --> 00:23:32,010 Pertanyaan bagus. 533 00:23:32,010 --> 00:23:32,950 Pertanyaan lain? 534 00:23:32,950 --> 00:23:33,450 Ya? 535 00:23:33,450 --> 00:23:35,580 AUDIENCE: Jika Anda berlari Program lagi sekarang, 536 00:23:35,580 --> 00:23:38,000 akan hal itu terus menambahkan nama ke mengajukan atau akan membuka file baru? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. Malan: Ah, pertanyaan yang bagus. 538 00:23:38,740 --> 00:23:41,448 Jika Anda menjalankan program lagi yang tepat sekarang, mungkin mengetik nama baru, 539 00:23:41,448 --> 00:23:44,820 akan hal itu menambah file atau menimpa file? 540 00:23:44,820 --> 00:23:47,420 Yang terakhir, karena aku tidak menggunakan modus append. 541 00:23:47,420 --> 00:23:49,930 Dan karena aku hanya membabi buta membuka file untuk menulis, 542 00:23:49,930 --> 00:23:51,310 itu hanya akan menimpa file. 543 00:23:51,310 --> 00:23:54,570 Jadi saya memang akan perlu lakukan adalah menambahkan, jika saya ingin benar-benar memiliki jangka panjang 544 00:23:54,570 --> 00:23:55,350 Database. 545 00:23:55,350 --> 00:23:58,220 >> Sekarang CSV berguna, terang, bahkan untuk seperti jika Anda writing-- 546 00:23:58,220 --> 00:24:00,100 dan kami akhirnya akan melihat ini kemudian di semester ketika 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 orang yang telah terdaftar untuk beberapa acara, 549 00:24:04,920 --> 00:24:07,420 atau mendaftar untuk siswa Anda kelompok, atau sesuatu seperti itu, 550 00:24:07,420 --> 00:24:10,330 menyimpan data dalam jenis format super nyaman. 551 00:24:10,330 --> 00:24:12,580 Karena secara harfiah, jika saya adalah untuk men-download file ini. 552 00:24:12,580 --> 00:24:14,540 Aku bisa double-- dan mari kita benar-benar mencoba ini 553 00:24:14,540 --> 00:24:16,720 jika saya memiliki Excel atau Nomor di sini. 554 00:24:16,720 --> 00:24:19,130 >> Aku akan klik kanan atau kontrol-klik file saya. 555 00:24:19,130 --> 00:24:20,020 Whoops. 556 00:24:20,020 --> 00:24:21,830 Klik kanan atau kontrol-klik file saya. 557 00:24:21,830 --> 00:24:24,960 Ayo, mouse saya tidak bekerja sama. 558 00:24:24,960 --> 00:24:32,694 Download-- Aku akan download semua file di sini jadi 559 00:24:32,694 --> 00:24:33,860 hanya jadi saya bisa ambil satu ini. 560 00:24:33,860 --> 00:24:37,850 Dan mari kita lihat apakah ini bekerja students.csv-- pertama kalinya 561 00:24:37,850 --> 00:24:39,310 Aku sudah diaktifkan. 562 00:24:39,310 --> 00:24:41,360 Sekarang mereka ingin melihat kontak saya. 563 00:24:41,360 --> 00:24:44,310 Sekarang, saya harus mendaftar. 564 00:24:44,310 --> 00:24:47,620 Lihat betapa mudahnya adalah dengan menggunakan CSVs? 565 00:24:47,620 --> 00:24:50,840 Ya, tetap up to date. 566 00:24:50,840 --> 00:24:52,375 OK, sekarang kita siap 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, dekat. 570 00:25:02,920 --> 00:25:04,750 Itu ajaib. 571 00:25:04,750 --> 00:25:07,280 OK, sekarang kita harus memperbarui. 572 00:25:07,280 --> 00:25:10,890 Dan sekarang, lupa apa mengajukan Saya awalnya dibuka, 573 00:25:10,890 --> 00:25:13,090 tapi apa a-- ada kita pergi. 574 00:25:13,090 --> 00:25:16,341 OK, jadi sekarang kita memiliki sebuah file 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 bagian yang mudah. 577 00:25:20,764 --> 00:25:23,930 Tentu saja aku bisa pra-instal Program excel, atau Bilangan, atau apa pun. 578 00:25:23,930 --> 00:25:25,846 Tapi ini bagus, karena sekarang saya bisa memanipulasi 579 00:25:25,846 --> 00:25:28,090 data dalam format standar. 580 00:25:28,090 --> 00:25:30,294 >> Jadi sekarang mari konteks beralih ke tempat kami tinggalkan 581 00:25:30,294 --> 00:25:32,710 Terakhir kali, yang mulai untuk lepas landas roda pelatihan. 582 00:25:32,710 --> 00:25:34,543 Tapi pertama, Anda tidak lihat siang tadi ini 583 00:25:34,543 --> 00:25:38,150 sekali lagi terjadi di sini di Fire dan Es di Cambridge, Sitar di New Haven. 584 00:25:38,150 --> 00:25:43,150 Mendaftar di website CS50s secepatnya untuk bergabung siswa CS50 dan staf. 585 00:25:43,150 --> 00:25:46,090 >> Jadi kami mengambil roda pelatihan off pada Senin karena follows-- 586 00:25:46,090 --> 00:25:49,120 string yang telah dinyatakan di CS50s perpustakaan untuk beberapa waktu. 587 00:25:49,120 --> 00:25:52,650 Dan itu bagus, karena memungkinkan kita berbicara tentang variabel sebagai 588 00:25:52,650 --> 00:25:54,660 kata lengkap dan kalimat dan banyak lagi. 589 00:25:54,660 --> 00:25:56,710 Tapi ternyata string tidak ada. 590 00:25:56,710 --> 00:26:00,200 Itu hanya sinonim, atau alias, bahwa kita telah diciptakan untuk sesuatu yang 591 00:26:00,200 --> 00:26:03,780 sebenarnya sedikit lebih teknis disebut char *. 592 00:26:03,780 --> 00:26:07,900 >> Dan memang, kita melihat contoh program, Senin 593 00:26:07,900 --> 00:26:11,200 yang tidak berperilaku cukup seperti yang kami harapkan. 594 00:26:11,200 --> 00:26:13,630 Ini adalah file, membandingkan-0. 595 00:26:13,630 --> 00:26:17,910 Dan ingat bahwa membandingkan-0, jika Aku mengkompilasi ulang program yang Senin 596 00:26:17,910 --> 00:26:22,670 dan menjalankan membandingkan-0 dan ketik ibu di huruf kecil, dan ibu dalam huruf kecil lagi. 597 00:26:22,670 --> 00:26:25,320 Program ini bersikeras saya ketik hal yang berbeda, 598 00:26:25,320 --> 00:26:29,210 meskipun ibu, semua dalam huruf kecil, identik visual. 599 00:26:29,210 --> 00:26:31,990 Jadi apa jawaban singkat mengapa komputer berpikir 600 00:26:31,990 --> 00:26:34,500 dua string yang berbeda? 601 00:26:34,500 --> 00:26:35,250 Ya? 602 00:26:35,250 --> 00:26:36,534 >> AUDIENCE: [tidak terdengar] 603 00:26:36,534 --> 00:26:37,450 DAVID J. Malan: Benar. 604 00:26:37,450 --> 00:26:39,600 Jadi, ibu, pertama kalinya Saya ketik dalam, sedang 605 00:26:39,600 --> 00:26:42,710 disimpan di suatu tempat di komputer saya memori, tetapi di lokasi yang berbeda 606 00:26:42,710 --> 00:26:44,690 dari kedua kalinya saya ketik ibu. 607 00:26:44,690 --> 00:26:46,580 Sekarang tentu dapat dioptimalkan. 608 00:26:46,580 --> 00:26:49,205 Komputer bisa menjadi cerdas dan menyadari dua string ini, hey, 609 00:26:49,205 --> 00:26:49,954 mereka identik. 610 00:26:49,954 --> 00:26:51,520 Biar tidak berlebihan menyimpannya. 611 00:26:51,520 --> 00:26:54,229 Tetapi komputer tidak melakukan itu optimasi kecuali Anda memberitahu mereka untuk. 612 00:26:54,229 --> 00:26:56,061 Jadi, secara default, mereka hanya akan berakhir 613 00:26:56,061 --> 00:26:57,670 di dua tempat yang berbeda di memori. 614 00:26:57,670 --> 00:27:01,570 Dan untuk lebih jelas, ketika kami membandingkan dua string, 615 00:27:01,570 --> 00:27:03,950 pertama disebut s, kedua disebut 616 00:27:03,950 --> 00:27:08,530 t, apa yang secara khusus adalah saya membandingkan sini on line 13? 617 00:27:08,530 --> 00:27:09,494 Ya. 618 00:27:09,494 --> 00:27:12,390 >> AUDIENCE: Ini adalah tempat di memori bahwa variabel akan mengarah ke. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. Malan: Tepat, saya membandingkan tempat di memori 620 00:27:14,900 --> 00:27:16,300 bahwa variabel menunjuk. 621 00:27:16,300 --> 00:27:20,560 Jadi khusus, jika ibu berada di byte nomor 1, dan 2, dan 3, 622 00:27:20,560 --> 00:27:24,020 dan 4-- karena ingat backslash 0 perlu semua jalan di akhir. 623 00:27:24,020 --> 00:27:29,420 Dan contoh lain dari 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, bahwa lokasi dalam memori, 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 bagus dalam itu cukup sederhana. 628 00:27:39,620 --> 00:27:42,870 Tapi itu bermasalah sejauh kita tidak bisa membandingkan string. 629 00:27:42,870 --> 00:27:44,930 Jadi fundamentally-- dan pada tingkat rendah ini, 630 00:27:44,930 --> 00:27:47,300 jika Anda ingin menerapkan program untuk membandingkan 631 00:27:47,300 --> 00:27:50,270 dua kata yang terpisah bahwa pengguna telah diketik di untuk kualitas, 632 00:27:50,270 --> 00:27:53,944 apakah mereka berbaris arang untuk char, hanya secara umum, 633 00:27:53,944 --> 00:27:55,360 apa yang perlu kita lakukan, ternyata? 634 00:27:55,360 --> 00:27:57,940 Ini tidak cukup hanya untuk melihat 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 >> AUDIENCE: Iterate melalui string [tidak terdengar]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. Malan: Ya, mari kita iterate melalui string. 639 00:28:02,600 --> 00:28:05,808 Mari kita gunakan untuk loop, loop sementara, atau apa pun yang Anda paling nyaman dengan. 640 00:28:05,808 --> 00:28:08,840 Dan jika kita punya dua string di suatu tempat dalam memori, mari kita lihat masing-masing ini 641 00:28:08,840 --> 00:28:11,770 karakter pertama, kemudian masing-masing adalah kedua karakter, maka ketiga, dan keempat, 642 00:28:11,770 --> 00:28:15,206 dan kelima, sampai kita memukul apa nilai sentinel khusus? 643 00:28:15,206 --> 00:28:16,080 AUDIENCE: [tidak terdengar] 644 00:28:16,080 --> 00:28:18,800 DAVID J. Malan: Ya, backslash nol, di mana titik baik tali 645 00:28:18,800 --> 00:28:20,100 kita bisa memutuskan itu saja. 646 00:28:20,100 --> 00:28:21,970 Apakah kita cocok setiap karakter tunggal? 647 00:28:21,970 --> 00:28:22,990 Jika tidak, kembali palsu. 648 00:28:22,990 --> 00:28:24,770 Jika demikian, kembali benar. 649 00:28:24,770 --> 00:28:28,800 Dan itulah yang versi ini program bandingkan-1.c tidak. 650 00:28:28,800 --> 00:28:31,677 Hal ini identik dengan apa yang kita memandang Senin kecuali bahwa saya telah 651 00:28:31,677 --> 00:28:34,760 gotten menyingkirkan string-- kata meskipun yang tidak memiliki impact-- fungsional semua 652 00:28:34,760 --> 00:28:37,450 Saya lakukan sekarang adalah menghapus beberapa roda pelatihan visual, 653 00:28:37,450 --> 00:28:40,880 tapi untuk melihat dengan jelas bahwa s dan t adalah alamat. 654 00:28:40,880 --> 00:28:43,020 Dan itulah yang bintang, tanda bintang, merupakan 655 00:28:43,020 --> 00:28:46,690 adalah alamat, atau dikenal lebih teknis sebagai pointer. 656 00:28:46,690 --> 00:28:49,880 >> Jadi ketika saya menyatakan s pada baris 9 dan mengatakan char * s, 657 00:28:49,880 --> 00:28:52,160 itu tidak berarti memberikan string. 658 00:28:52,160 --> 00:28:56,360 Itu berarti memberi saya variabel yang tujuan dalam hidup adalah untuk menyimpan alamat. 659 00:28:56,360 --> 00:29:00,400 Karena Aku akan menempatkan alamat string ke dalamnya. 660 00:29:00,400 --> 00:29:03,500 Dan memang, GetString, menjadi jelas, tidak kembali string. 661 00:29:03,500 --> 00:29:06,110 Tidak kembali ibu backslash nol, per se. 662 00:29:06,110 --> 00:29:10,005 Apa GetString khusus dan tepat kembali? 663 00:29:10,005 --> 00:29:10,880 AUDIENCE: [tidak terdengar] 664 00:29:10,880 --> 00:29:14,080 DAVID J. Malan: Sebuah alamat, yang alamat karakter pertama 665 00:29:14,080 --> 00:29:16,070 di beberapa string itu telah mendapat. 666 00:29:16,070 --> 00:29:19,250 Dan sekarang kita melihat kata kunci khusus lagi. 667 00:29:19,250 --> 00:29:20,640 Dan, saya singgung ini sebelumnya. 668 00:29:20,640 --> 00:29:23,620 Ini akan menjadi konvensi yang baik bahwa kita akan melihat lagi dan lagi sekarang. 669 00:29:23,620 --> 00:29:27,540 Aku memeriksa untuk memastikan bahwa s tidak nol dan t tidak null. 670 00:29:27,540 --> 00:29:30,100 Karena berdasarkan saya benar-benar menyebutkan cepat sebelumnya, 671 00:29:30,100 --> 00:29:35,510 apa mungkin berarti jika GetString mengembalikan tidak alamat tapi N-U-L-L, yang lagi, 672 00:29:35,510 --> 00:29:36,990 beberapa nilai khusus? 673 00:29:36,990 --> 00:29:37,890 >> AUDIENCE: Kesalahan. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. Malan: Ini kesalahan. 675 00:29:38,600 --> 00:29:39,550 Ada yang salah. 676 00:29:39,550 --> 00:29:41,341 Dan apa yang biasanya mungkin terjadi, terutama 677 00:29:41,341 --> 00:29:45,162 dengan strings-- yang mungkin panjang tidak diketahui di advance-- 678 00:29:45,162 --> 00:29:46,870 mungkin komputer ' dari memori, mungkin 679 00:29:46,870 --> 00:29:49,280 Anda mengetik dalam seperti kata atau kalimat yang panjang 680 00:29:49,280 --> 00:29:51,880 atau disisipkan seperti esai besar ada hanya tidak cukup memori. 681 00:29:51,880 --> 00:29:55,340 Dan sehingga GetString tidak dapat kembali alamat seluruh hal, 682 00:29:55,340 --> 00:29:56,620 sehingga hanya mengembalikan apa-apa. 683 00:29:56,620 --> 00:30:00,580 Dan ia mengatakan kesalahan yang telah terjadi dengan kembali nilai NULL khusus. 684 00:30:00,580 --> 00:30:02,890 Ini alamat nol, sehingga untuk berbicara. 685 00:30:02,890 --> 00:30:06,157 >> Sekarang ternyata C dilengkapi dengan fungsi yang melakukan iterasi itu. 686 00:30:06,157 --> 00:30:09,240 Kami tidak harus melaksanakan ini dengan untuk loop atau while loop diri kita sendiri. 687 00:30:09,240 --> 00:30:11,150 Kita dapat menggunakan fungsi, disebut ringkas, 688 00:30:11,150 --> 00:30:15,400 aduk comp, atau tali membandingkan, yang tujuan dalam hidup adalah untuk melakukan hal itu. 689 00:30:15,400 --> 00:30:19,990 Anda memberikan dua pointer, dua alamat, dan itu akan pergi ke alamat tersebut 690 00:30:19,990 --> 00:30:23,130 dan kemudian membandingkan surat untuk surat untuk surat untuk kualitas, 691 00:30:23,130 --> 00:30:26,610 berhenti hanya ketika apa yang benar? 692 00:30:26,610 --> 00:30:31,540 Ketika intuitif harus aduk comp berhenti iterasi, hanya harus jelas? 693 00:30:31,540 --> 00:30:35,400 Ketika hits backslash 0 baik tali, di mana titik itu dapat memutuskan 694 00:30:35,400 --> 00:30:38,910 telah segalanya cocok, atau telah ada menjadi ketidaksesuaian? 695 00:30:38,910 --> 00:30:42,740 >> Jadi, jika kita menjalankan ini sekarang dan mencoba permainan kapitalisasi kecil kami, 696 00:30:42,740 --> 00:30:49,260 sehingga membuat membandingkan-1, ./compare-1, dan ketik ibu dalam huruf kecil kedua kali. 697 00:30:49,260 --> 00:30:50,560 Sekarang hal yang sama. 698 00:30:50,560 --> 00:30:54,080 Dan jika saya melakukannya lagi dengan huruf kecil dan kemudian mungkin huruf besar. 699 00:30:54,080 --> 00:30:56,720 Sekarang memang membedakan antara atas dan huruf kecil. 700 00:30:56,720 --> 00:31:00,440 Jadi tidak semua yang keras atau ajaib, tetapi sekarang menjelaskan 701 00:31:00,440 --> 00:31:03,140 apa yang terjadi di bawah tenda. 702 00:31:03,140 --> 00:31:07,640 >> Jadi apa lagi yang bisa kita ekstrak dari jenis pelajaran? 703 00:31:07,640 --> 00:31:08,980 Jadi mari kita lihat ini. 704 00:31:08,980 --> 00:31:15,380 Aku akan pergi ke depan dan menulis Program cepat di sini disebut copy-0. 705 00:31:15,380 --> 00:31:21,594 Dan sekarang mari kita pergi ke depan dan benar-benar mari kita lakukan this-- dengan copy-0, 706 00:31:21,594 --> 00:31:23,010 lihatlah apa yang aku punya di sini. 707 00:31:23,010 --> 00:31:24,712 Saya pertama kali memberitahu pengguna, mengatakan sesuatu. 708 00:31:24,712 --> 00:31:26,420 Kemudian saya mendapatkan sebuah string dan saya disimpan dalam s. 709 00:31:26,420 --> 00:31:29,810 Lalu aku memeriksa apakah s sama sama NULL, hanya kembali 1. 710 00:31:29,810 --> 00:31:31,590 Jadi ini hanya standar pengecekan error. 711 00:31:31,590 --> 00:31:33,112 Tidak ada yang menarik yang terjadi. 712 00:31:33,112 --> 00:31:36,320 Dan pada kenyataannya, jika kita menyingkirkan kesalahan memeriksa, ini tampak seperti minggu 1 kode 713 00:31:36,320 --> 00:31:36,985 saat ini. 714 00:31:36,985 --> 00:31:39,110 Tapi aku sudah mulai mendapatkan sedikit lebih baik tentang itu. 715 00:31:39,110 --> 00:31:43,340 >> Sekarang sejalan 16, seminggu yang lalu, mungkin bahkan beberapa hari atau menit yang lalu, 716 00:31:43,340 --> 00:31:46,720 Anda mungkin mengatakan garis 16 adalah menciptakan sebuah variabel yang disebut t 717 00:31:46,720 --> 00:31:48,219 dan menyalin s ke dalamnya. 718 00:31:48,219 --> 00:31:50,010 Dan itu sempurna takeaway wajar. 719 00:31:50,010 --> 00:31:51,560 Tapi lebih tepat sekarang. 720 00:31:51,560 --> 00:31:54,190 Apa yang terjadi di jalur 16? 721 00:31:54,190 --> 00:31:56,170 Apa yang mendapatkan disalin dari kanan ke kiri? 722 00:31:56,170 --> 00:31:56,669 Ya? 723 00:31:56,669 --> 00:31:58,490 AUDIENCE: Apakah t mendapatkan alamat s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. Malan: Tepat, t adalah mendapatkan alamat s. 725 00:32:01,220 --> 00:32:05,170 Jadi harus jelas sekarang, jika saya pergi kembali ke contoh sebelumnya 726 00:32:05,170 --> 00:32:08,520 dan aku menarik keluar hal yang saya mengetik di. 727 00:32:08,520 --> 00:32:11,640 Dan apa yang saya mengetik in-- inilah s, dan di sini 728 00:32:11,640 --> 00:32:15,830 adalah apa yang saya mengetik di suatu tempat di memori, ibu dan kemudian garis miring terbalik 729 00:32:15,830 --> 00:32:17,840 0 yang ditambahkan untuk saya. 730 00:32:17,840 --> 00:32:23,060 Apa yang saya disimpan dalam sini, mengingat, ini di lokasi 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 ini apa yang saat ini di s. 732 00:32:24,655 --> 00:32:29,220 Jadi jika pada baris 16, saya mengatakan memberi saya variabel disebut t dan toko lain 733 00:32:29,220 --> 00:32:33,590 in di nilai s, apa akan disimpan di sini tidak akan mom 734 00:32:33,590 --> 00:32:35,480 melainkan hanya nomor 1. 735 00:32:35,480 --> 00:32:38,520 >> Jadi jika kita melihat ke depan dalam program ini sekarang, apa yang akan terjadi? 736 00:32:38,520 --> 00:32:40,690 Jadi melihat bahwa ada fungsi ini Anda mungkin 737 00:32:40,690 --> 00:32:44,410 telah menggunakan ini beberapa waktu lalu untuk Caesar, atau Vigenere, atau mungkin tidak sama sekali. 738 00:32:44,410 --> 00:32:48,170 Saya mengklaim dengan printf saya, saya akan memanfaatkan t copy. 739 00:32:48,170 --> 00:32:51,616 Di baris pertama 19, kewarasan cepat periksa, pemeriksaan strlen panjang t. 740 00:32:51,616 --> 00:32:53,740 Karena saya tidak ingin mencoba untuk memanfaatkan sesuatu 741 00:32:53,740 --> 00:32:55,104 jika tidak ada tali ada. 742 00:32:55,104 --> 00:32:57,520 Jika pengguna hanya tekan Enter, tidak ada yang memanfaatkan. 743 00:32:57,520 --> 00:33:01,100 Jadi saya tidak ingin melakukan line 21. 744 00:33:01,100 --> 00:33:05,758 Jadi line 21 adalah memanfaatkan yang surat, tampaknya, di t? 745 00:33:05,758 --> 00:33:06,514 >> AUDIENCE: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. Malan: Kelihatannya seperti itu menyalin yang mana? 747 00:33:08,722 --> 00:33:09,486 AUDIENCE: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. Malan: Uh, m. 749 00:33:10,450 --> 00:33:12,685 OK, jadi m pertama, karena pemberitahuan bahwa aku 750 00:33:12,685 --> 00:33:14,935 lewat untuk toupper, yang jika Anda belum pernah melihatnya itu 751 00:33:14,935 --> 00:33:16,980 hanya fungsi untuk memanfaatkan sebagai input. 752 00:33:16,980 --> 00:33:20,240 t braket nol berarti memberikan saya nol karakter t. 753 00:33:20,240 --> 00:33:22,550 Dan bagaimana ini perubahan gambar, harus jelas? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Apa yang perlu mendapatkan ditulis ulang atau diubah sehubungan dengan s dan t dan ibu 756 00:33:29,160 --> 00:33:30,097 nol backslash. 757 00:33:30,097 --> 00:33:31,470 >> AUDIENCE: [tidak terdengar] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. Malan: Ya, jadi yang satu ini di sini hanya 759 00:33:34,030 --> 00:33:40,860 kebutuhan untuk bisa berubah to-- memperbaiki this-- perlu mendapatkan berubah ke m modal. 760 00:33:40,860 --> 00:33:44,330 Tapi sekarang, melihat nanti di Program, jika saya mencetak 761 00:33:44,330 --> 00:33:49,800 s dan t seperti yang saya membersihkan sini, menonton apa akan terjadi mencetak dan t. 762 00:33:49,800 --> 00:33:54,310 Jadi membuat copy-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Biarkan aku pergi ke depan dan ketik di ibu dalam semua huruf kecil. 764 00:33:57,140 --> 00:34:00,140 Perhatikan baik asli dan copy telah dikapitalisasi. 765 00:34:00,140 --> 00:34:00,850 Mengapa? 766 00:34:00,850 --> 00:34:04,431 Nah, s dan t keduanya menunjuk ke, jika Anda mau, potongan memori yang sama. 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 bahwa kita menggunakan alamat nol di sini. 769 00:34:09,150 --> 00:34:11,719 Maksudku, aku tidak benar-benar peduli di mana hal ini dalam memori. 770 00:34:11,719 --> 00:34:13,550 Maaf saya menghapus sedikit terlalu banyak. 771 00:34:13,550 --> 00:34:15,674 Tapi aku tidak benar-benar peduli di mana hal-hal yang di memori. 772 00:34:15,674 --> 00:34:18,510 Dan, memang apa programmer cenderung berpikir tentang 773 00:34:18,510 --> 00:34:21,080 adalah bahwa ketika Anda berbicara tentang alamat, atau pointer, 774 00:34:21,080 --> 00:34:22,679 siapa yang peduli di mana itu dalam memori. 775 00:34:22,679 --> 00:34:24,989 Saya tidak peduli apakah itu di byte satu atau satu miliar. 776 00:34:24,989 --> 00:34:27,920 Aku hanya peduli bahwa ini variabel secara efektif 777 00:34:27,920 --> 00:34:29,620 menunjuk bahwa sepotong memori. 778 00:34:29,620 --> 00:34:33,350 Dan, selanjutnya, daripada berdalih lebih alamat memori yang sewenang-wenang, mari kita 779 00:34:33,350 --> 00:34:36,710 hanya mulai menggambar pointer sebagai pointer, seperti panah. 780 00:34:36,710 --> 00:34:39,340 Jadi apa s dan t benar-benar, sesuai dengan program ini, 781 00:34:39,340 --> 00:34:42,130 karena bagaimana saya membuat t, itu hanya dua variabel yang terpisah 782 00:34:42,130 --> 00:34:43,840 menunjuk pada sepotong memori yang sama. 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 Jadi kita bisa abstrak pergi detail yang. 785 00:34:47,130 --> 00:34:48,780 >> Jadi bagaimana cara mengatasinya? 786 00:34:48,780 --> 00:34:54,120 Jika saya ingin menulis versi salinan program yang benar-benar salinan string 787 00:34:54,120 --> 00:34:56,840 dan mengkapitalisasi hanya copy, hanya intuitif, 788 00:34:56,840 --> 00:34:59,766 apa yang harus menjadi bahan untuk solusi kami? 789 00:34:59,766 --> 00:35:00,640 AUDIENCE: [tidak terdengar] 790 00:35:00,640 --> 00:35:01,420 DAVID J. Malan: Kami membutuhkan apa? 791 00:35:01,420 --> 00:35:01,820 AUDIENCE: Chunk memori. 792 00:35:01,820 --> 00:35:03,280 DAVID J. Malan: Kita perlu potongan lain dari memori, kan? 793 00:35:03,280 --> 00:35:05,360 Kita tidak tahu bagaimana melakukannya belum, tentu. 794 00:35:05,360 --> 00:35:11,330 Tapi aku agak mau ini terjadi begitu bahwa ibu asli dalam huruf kecil 795 00:35:11,330 --> 00:35:14,170 berakhir dalam potongan tambahan memori. 796 00:35:14,170 --> 00:35:19,770 Dan kemudian ketika saya mengubah salin, saya tidak ingin mengubah salinan ini di sini. 797 00:35:19,770 --> 00:35:26,020 Saya bukannya ingin mengubah hanya ini copy sehingga aslinya tidak berubah. 798 00:35:26,020 --> 00:35:27,980 >> Jadi, mari kita lihat bagaimana kita bisa melakukan ini. 799 00:35:27,980 --> 00:35:31,800 Dalam copy-1, yang telah dilucuti dari komentar, 800 00:35:31,800 --> 00:35:33,250 tetapi berkomentar online. 801 00:35:33,250 --> 00:35:36,710 Kami bukannya melakukan following-- ini baris identik, mendapatkan saya string 802 00:35:36,710 --> 00:35:38,340 dan menyebutnya s. 803 00:35:38,340 --> 00:35:43,500 Tapi sekarang mari kita lihat di salah satu yang paling kami kompleks tetapi yang terakhir dari kompleksitas 804 00:35:43,500 --> 00:35:47,340 untuk sementara, garis 16 tidak tepat ini. 805 00:35:47,340 --> 00:35:49,400 Jadi jika Anda nyaman dengan gambar kita hanya drew-- 806 00:35:49,400 --> 00:35:51,790 memberi saya sepotong baru memori, menyalin semua ke dalamnya, 807 00:35:51,790 --> 00:35:53,730 mari kita lihat bagaimana kita menerjemahkan bahwa untuk kode. 808 00:35:53,730 --> 00:35:59,400 >> Jadi baris 16, di sisi kiri, char * t memberi saya kotak ini di sini. 809 00:35:59,400 --> 00:36:00,230 Itu semua hal ini. 810 00:36:00,230 --> 00:36:03,240 Di sisi kanan, m alloc, atau malloc, 811 00:36:03,240 --> 00:36:06,480 adalah alokasi memori, super mewah, cara samar hanya mengatakan 812 00:36:06,480 --> 00:36:07,640 memberi saya sepotong memori. 813 00:36:07,640 --> 00:36:09,290 Berapa banyak memori yang kita butuhkan? 814 00:36:09,290 --> 00:36:10,910 Nah, adalah jenis ekspresi besar. 815 00:36:10,910 --> 00:36:12,570 Tapi mari kita lihat apa yang dikatakan di sini. 816 00:36:12,570 --> 00:36:15,940 Jadi ini, tentu saja, adalah memberikan saya panjang string s. 817 00:36:15,940 --> 00:36:19,094 Jadi, ibu harus apa? 818 00:36:19,094 --> 00:36:21,010 Jadi hanya tiga, kan? Ibu tiga karakter. 819 00:36:21,010 --> 00:36:22,830 Anda tidak menghitung backslash nol ketika Anda 820 00:36:22,830 --> 00:36:25,960 berbicara tentang panjang string itu sebenarnya huruf terlihat manusia. 821 00:36:25,960 --> 00:36:28,020 Jadi ibu, jadi ini memberi saya 3. 822 00:36:28,020 --> 00:36:31,170 Tapi tunggu dulu, saya sekarang menambahkan 1. 823 00:36:31,170 --> 00:36:34,861 Mengapa saya benar-benar ingin mengalokasikan 4 byte dan bukan hanya 3? 824 00:36:34,861 --> 00:36:35,360 Ya? 825 00:36:35,360 --> 00:36:36,910 >> AUDIENCE: Untuk nilai sentinel? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. Malan: Tepat, untuk itu nilai sentinel. 827 00:36:38,951 --> 00:36:40,840 Untuk backslash nol, Aku butuh 4 total byte. 828 00:36:40,840 --> 00:36:42,870 Jadi saya perlu panjang dari string ditambah 1. 829 00:36:42,870 --> 00:36:45,400 Dan kemudian hanya untuk measure-- baik meskipun pada sistem ini, 830 00:36:45,400 --> 00:36:49,390 itu selalu akan menjadi 1-- saya katakan kalikan ini dengan ukuran char. 831 00:36:49,390 --> 00:36:51,552 Ternyata sizeof adalah operator di C yang 832 00:36:51,552 --> 00:36:53,260 hanya memberitahu Anda jumlah byte yang 833 00:36:53,260 --> 00:36:54,700 diperlukan untuk tipe data tertentu. 834 00:36:54,700 --> 00:36:57,740 Ini tidak bekerja untuk array, biasanya, kadang-kadang tidak. 835 00:36:57,740 --> 00:36:59,210 Tapi dalam kasus umum, tidak ada. 836 00:36:59,210 --> 00:37:02,330 Tapi itu akan memberitahu saya berapa banyak byte yang char, yang ternyata selalu 1. 837 00:37:02,330 --> 00:37:04,080 Jadi ini seperti mengalikan dengan 1. 838 00:37:04,080 --> 00:37:05,900 >> Jadi super samar mencari baris kode. 839 00:37:05,900 --> 00:37:09,320 Tapi semua hal ini adalah memberi saya sepotong memori. 840 00:37:09,320 --> 00:37:13,590 Tapi apakah itu tampaknya akan menyalin sesuatu ke memori itu? 841 00:37:13,590 --> 00:37:14,560 Belum. 842 00:37:14,560 --> 00:37:22,040 Dan jadi apa yang saya on line 22, dan 23, 24, 25, juga, saya hanya melakukan ini. 843 00:37:22,040 --> 00:37:23,760 Dan ini adalah semacam hal sekolah tua sekarang. 844 00:37:23,760 --> 00:37:26,010 Ini seperti PSet 2, di mana Anda hanya memindahkan barang 845 00:37:26,010 --> 00:37:28,620 di dalam memori, atau lebih tepatnya di string. 846 00:37:28,620 --> 00:37:31,920 >> Jadi aku iterasi dari 0 ke panjang string s. 847 00:37:31,920 --> 00:37:37,820 Dan aku menyalin ke-i karakter di s ke-i karakter di t. 848 00:37:37,820 --> 00:37:41,820 Dan karena saya, programmer, membuat Pastikan untuk mengalokasikan persis seperti banyak byte 849 00:37:41,820 --> 00:37:44,600 seperti yang saya butuhkan, itu sempurna satu-ke-satu hubungan. 850 00:37:44,600 --> 00:37:47,060 Dan saya copy ibu di huruf kecil ke yang baru. 851 00:37:47,060 --> 00:37:50,170 Dan kemudian terakhir, saya lakukan baris ini. 852 00:37:50,170 --> 00:37:54,637 Dan efeknya hanya untuk memanfaatkan t ini di sini. 853 00:37:54,637 --> 00:37:56,470 Jadi banyak untuk menyerap, tapi jika Anda hanya mempertimbangkan 854 00:37:56,470 --> 00:37:58,220 apa yang sebenarnya terjadi di bawah tenda 855 00:37:58,220 --> 00:38:00,880 hanya bergerak ini byte sekitar, semua yang 856 00:38:00,880 --> 00:38:06,617 diperlukan untuk memecahkan masalah ini adalah hanya untuk memberi kita potongan ini memori. 857 00:38:06,617 --> 00:38:08,450 Sekarang di risiko luar biasa, saya menunjukkan 858 00:38:08,450 --> 00:38:13,200 salah satu contoh lain yang hampir identik, kecuali untuk yang satu ini 859 00:38:13,200 --> 00:38:14,350 baris kode. 860 00:38:14,350 --> 00:38:18,870 Jadi ini adalah versi hacker program ini, jika Anda mau. 861 00:38:18,870 --> 00:38:21,050 Tapi mari kita menyaring menjadi apa yang terjadi. 862 00:38:21,050 --> 00:38:28,920 Baris 24 digunakan untuk menjadi t ini braket saya mendapat s braket i. 863 00:38:28,920 --> 00:38:33,370 Sekarang, aku mengubah ini untuk t star jauh lebih samar 864 00:38:33,370 --> 00:38:36,280 ditambah 1 sama dengan star s ditambah 1. 865 00:38:36,280 --> 00:38:38,702 >> Jadi apa yang terjadi dan mengapa kita memiliki karakter bintang? 866 00:38:38,702 --> 00:38:41,410 Kami telah melihat bintang sebelumnya, dan itu digunakan berbeda di sini. 867 00:38:41,410 --> 00:38:45,490 Sebelumnya kita melihat char *, sekarang aku melihat sebuah bintang di awal, dan itu OK. 868 00:38:45,490 --> 00:38:48,190 Karena ternyata kami jenis dapat menyimpulkan hanya dari 869 00:38:48,190 --> 00:38:50,280 dari orang-orang pertama prinsip apa yang terjadi. 870 00:38:50,280 --> 00:38:53,860 Jadi hanya harus jelas, apa yang s? 871 00:38:53,860 --> 00:38:55,052 Pekan lalu, itu string. 872 00:38:55,052 --> 00:38:56,260 Itu tidak cukup lagi. 873 00:38:56,260 --> 00:38:57,690 Apa s, khususnya? 874 00:38:57,690 --> 00:38:58,590 >> AUDIENCE: [tidak terdengar] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. Malan: Ini pointer. 876 00:38:59,881 --> 00:39:02,610 Ini alamat karakter pertama kita mengetik di. 877 00:39:02,610 --> 00:39:04,780 OK, apa yang t? 878 00:39:04,780 --> 00:39:05,660 >> AUDIENCE: [tidak terdengar] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. Malan: The alamat byte pertama 880 00:39:07,950 --> 00:39:10,490 di t, bahwa sepotong memori dialokasikan kembali. 881 00:39:10,490 --> 00:39:14,720 Jadi ternyata bahwa ketika kita iterate dari 0 pada hingga string 882 00:39:14,720 --> 00:39:17,424 length-- pertama-tama, saya dimulai pada 0, karena 883 00:39:17,424 --> 00:39:18,840 sekolah tua ini untuk loop hal. 884 00:39:18,840 --> 00:39:22,400 Jadi hanya untuk kesederhanaan, mari kita berasumsi bahwa baris pertama kode 885 00:39:22,400 --> 00:39:23,760 benar-benar hanya ini, benar. 886 00:39:23,760 --> 00:39:26,080 Jika saya adalah nol, menambahkan nol untuk sesuatu yang mungkin 887 00:39:26,080 --> 00:39:27,540 tidak akan memiliki efek. 888 00:39:27,540 --> 00:39:28,560 >> Jadi apa kata ini? 889 00:39:28,560 --> 00:39:31,600 Ternyata bahwa bintang operator dalam konteks ini 890 00:39:31,600 --> 00:39:33,700 adalah dereference operator, yang hanya 891 00:39:33,700 --> 00:39:37,530 cara mewah mengatakan pergi ke alamat berikut. 892 00:39:37,530 --> 00:39:42,080 Jadi jika s adalah alamat pertama karakter dalam potongan ini 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 karena kita sudah ditarik gambar dengan cara ini, 895 00:39:45,630 --> 00:39:47,430 Anda dapat mengadopsi berikut model mental. 896 00:39:47,430 --> 00:39:51,030 Jika ini adalah s, dan Anda katakan * s, * s jenis seperti peluncuran dan tangga, 897 00:39:51,030 --> 00:39:54,540 jika Anda ingat permainan dari masa kanak-kanak, seperti mengikuti 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 hal yang sama. 900 00:39:57,080 --> 00:39:59,855 Jadi mulai di sini, pergi ke potongan nya. 901 00:39:59,855 --> 00:40:03,350 Aku tidak bisa hanya menarik layar ini dengan cara itu. 902 00:40:03,350 --> 00:40:05,560 * t berarti untuk pergi di sini. 903 00:40:05,560 --> 00:40:08,830 Dan kemudian, untuk loop hanya mengatakan memindahkan karakter ini di sini, 904 00:40:08,830 --> 00:40:11,330 memindahkan karakter ini di sini, memindahkan karakter ini di sini. 905 00:40:11,330 --> 00:40:12,890 Tapi bagaimana saya melakukannya incrementation itu? 906 00:40:12,890 --> 00:40:15,430 Aku harus membatalkan apa yang aku hanya dihapus. 907 00:40:15,430 --> 00:40:18,140 Ini adalah apa yang umumnya disebut pointer aritmatika, yang 908 00:40:18,140 --> 00:40:20,040 berarti matematika dengan alamat. 909 00:40:20,040 --> 00:40:22,460 >> Jika, dalam hal ini untuk loop, Aku terus incrementing i, 910 00:40:22,460 --> 00:40:26,880 dan s adalah alamat dan t adalah alamat, jika saya hanya terus menambahkan 1, 911 00:40:26,880 --> 00:40:31,406 itu hanya berarti terus bergerak maju, dan maju, dan maju dalam memori. 912 00:40:31,406 --> 00:40:34,030 Ini seperti Oxford Street, yang jalan bahwa bangunan CS aktif. 913 00:40:34,030 --> 00:40:36,490 Bangunan CS di 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Jadi jika anda melakukannya 33 Oxford Street ditambah 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 pun mereka bangunan sebenarnya - jika mereka ada. 917 00:40:46,380 --> 00:40:50,540 Dan, itu semua kita lakukan di sini dengan pointer aritmetika. 918 00:40:50,540 --> 00:40:53,820 >> Jadi itu adalah cara super misterius mengekspresikan diri kita sendiri. 919 00:40:53,820 --> 00:40:56,160 Tapi semua itu terjadi di bawah tenda 920 00:40:56,160 --> 00:40:59,330 hanya mengikuti alamat ini, seperti berikut peta, jika Anda mau, 921 00:40:59,330 --> 00:41:02,692 atau mengikuti panah seperti kami telah ditarik pada layar. 922 00:41:02,692 --> 00:41:04,910 OK, banyak untuk dicerna. 923 00:41:04,910 --> 00:41:10,410 Setiap pertanyaan tentang sintaks, konsep, pointer, malloc, atau sejenisnya. 924 00:41:10,410 --> 00:41:11,480 Ya, di sini pertama. 925 00:41:11,480 --> 00:41:13,755 >> AUDIENCE: Jadi mana yang kata * t * t sama toupper, 926 00:41:13,755 --> 00:41:15,575 adalah bahwa akan memanfaatkan semua surat atau hanya-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. Malan: Ah, Pertanyaan benar-benar baik. 928 00:41:17,283 --> 00:41:19,805 Jadi di baris ini di sini, 31, apakah ini akan memanfaatkan 929 00:41:19,805 --> 00:41:21,430 huruf pertama atau semua huruf. 930 00:41:21,430 --> 00:41:23,460 Jadi mari kita menjawab bahwa dengan pergi kembali ke prinsip-prinsip pertama. 931 00:41:23,460 --> 00:41:26,168 Dan prinsip-prinsip pertama di sini saya maksud hanya pergi ke definisi dasar 932 00:41:26,168 --> 00:41:27,000 dari apa yang terlibat. 933 00:41:27,000 --> 00:41:29,770 Jadi toupper ini fungsi yang mengkapitalisasi char. 934 00:41:29,770 --> 00:41:30,530 Itu saja. 935 00:41:30,530 --> 00:41:36,740 * t berarti pergi ke first-- pergi ke alamat di t. 936 00:41:36,740 --> 00:41:40,350 Jadi, dalam gambar, jika ini adalah potongan yang memori kita dialokasikan dengan malloc, 937 00:41:40,350 --> 00:41:43,310 dan ini adalah t, * t berarti pergi di sini. 938 00:41:43,310 --> 00:41:46,710 >> Sementara itu, Anda melewati bahwa nilai, huruf kecil m 939 00:41:46,710 --> 00:41:50,040 untuk toupper, Anda mendapatkan kembali Modal M, di mana Anda meletakkan? 940 00:41:50,040 --> 00:41:52,410 Anda memasukkannya dalam lokasi yang sama. 941 00:41:52,410 --> 00:41:55,540 Dan dengan itu logika mereka definisi dasar itu hanya 942 00:41:55,540 --> 00:41:58,792 memanfaatkan huruf pertama kecuali jika Anda iterate dengan saya atau 943 00:41:58,792 --> 00:42:02,000 untuk loop atau saat loop, itu tidak akan untuk melakukan sesuatu yang lebih dari yang Anda minta itu. 944 00:42:02,000 --> 00:42:02,583 Pertanyaan bagus. 945 00:42:02,583 --> 00:42:03,237 Ya? 946 00:42:03,237 --> 00:42:05,369 >> AUDIENCE: Mengapa Anda menggunakan dereference metode daripada 947 00:42:05,369 --> 00:42:05,979 array? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. Malan: Ah, pertanyaan yang bagus. 949 00:42:07,395 --> 00:42:10,672 Mengapa Anda menggunakan dereference Metode bukan metode array yang? 950 00:42:10,672 --> 00:42:12,130 Tidak ada alasan khusus, jujur. 951 00:42:12,130 --> 00:42:15,290 Dan, pada kenyataannya, untuk ini jenis contoh, tepat, 952 00:42:15,290 --> 00:42:17,556 Aku hanya berdebat membuat program yang lebih rumit, 953 00:42:17,556 --> 00:42:19,680 lebih mata kaca lebih, orang memeriksa 954 00:42:19,680 --> 00:42:22,830 karena ini terlihat super misterius, tapi meskipun itu melakukan hal yang sama. 955 00:42:22,830 --> 00:42:26,695 Dan, terus terang, ini adalah solusi tidak perlu visual yang kompleks 956 00:42:26,695 --> 00:42:27,320 untuk masalah ini. 957 00:42:27,320 --> 00:42:29,580 >> Ini masih desain yang baik, lima dari lima untuk desain, 958 00:42:29,580 --> 00:42:33,140 apakah itu di braket notasi atau notasi pointer. 959 00:42:33,140 --> 00:42:36,299 Tapi-- terutama ketika kita mendapatkan kemudian di kursus di PSet 5 960 00:42:36,299 --> 00:42:39,340 ketika kita menerapkan kamus bahwa Saya telah menyebutkan beberapa times-- 961 00:42:39,340 --> 00:42:42,300 kita akan benar-benar peduli tentang alamat memori tingkat rendah 962 00:42:42,300 --> 00:42:44,140 bahwa kita benar-benar memahami apa yang sedang terjadi. 963 00:42:44,140 --> 00:42:48,300 >> Tapi, untuk saat ini, ternyata ini baris kode kurung sini persegi 964 00:42:48,300 --> 00:42:49,900 tidak benar-benar ada. 965 00:42:49,900 --> 00:42:52,230 Mereka adalah apa yang disebut sintaksis gula, yang 966 00:42:52,230 --> 00:42:58,390 adalah cara ganjil dingin mengatakan compiler mengubah kurung menjadi 967 00:42:58,390 --> 00:43:00,420 ekspresi matematika. 968 00:43:00,420 --> 00:43:02,660 Jadi itu adalah konvensi manusia untuk dapat hanya menulis 969 00:43:02,660 --> 00:43:04,220 kurung sangat user-friendly ini. 970 00:43:04,220 --> 00:43:06,850 Tapi apa compiler, dentang, benar-benar melakukan setiap saat 971 00:43:06,850 --> 00:43:10,970 Anda menulis apa yang disorot sejalan 24, di bawah tenda itu benar-benar 972 00:43:10,970 --> 00:43:12,330 mengubahnya menjadi ini. 973 00:43:12,330 --> 00:43:16,200 Itu hanya lebih menyenangkan sebagai manusia membaca dan menulis kode seperti garis 24. 974 00:43:16,200 --> 00:43:18,530 Tapi akhirnya mereka roda pelatihan juga datang dari 975 00:43:18,530 --> 00:43:21,780 ketika kenyamanan sendiri semakin kuat. 976 00:43:21,780 --> 00:43:27,240 >> Baiklah, jadi ingat kemudian bahwa ini adalah semacam masalah terbesar 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 memicu seluruh ini sialan percakapan tentang pointer, 979 00:43:30,640 --> 00:43:32,340 dan alamat, dan hal menyalin. 980 00:43:32,340 --> 00:43:35,410 Itu karena kita tersandung bodoh, masalah ini bodoh, dimana 981 00:43:35,410 --> 00:43:38,830 Saya menerapkan logically-- dengan Lauren di sini di demo dan jus jeruk 982 00:43:38,830 --> 00:43:43,770 di milk-- sempurna Fungsi algorithmically benar 983 00:43:43,770 --> 00:43:47,010 untuk swapping dua variabel ' nilai-nilai, tapi sialan 984 00:43:47,010 --> 00:43:50,550 tidak memiliki persisten, atau permanen, efek pada kode saya. 985 00:43:50,550 --> 00:43:51,820 >> Dan mengapa itu? 986 00:43:51,820 --> 00:43:54,650 Singkatnya, mengapa ini implementasi swap 987 00:43:54,650 --> 00:43:58,740 logis benar, tetapi tidak memiliki dampak pada variabel yang dilewati, 988 00:43:58,740 --> 00:44:01,119 seperti x dan y untuk utama? 989 00:44:01,119 --> 00:44:02,410 Apa inti dari masalah ini? 990 00:44:02,410 --> 00:44:02,909 Ya? 991 00:44:02,909 --> 00:44:05,532 AUDIENCE: Karena variabel dibuat salinan variabel di pass 992 00:44:05,532 --> 00:44:06,240 melalui fungsi. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. Malan: Tepat, ketika Anda melewati variabel ke dalam fungsi, atau argumen 994 00:44:09,060 --> 00:44:11,030 ke fungsi, mereka melewati copy, yang 995 00:44:11,030 --> 00:44:14,770 berarti Anda mendapatkan identik mencari Pola bit untuk kedua x dan y, 996 00:44:14,770 --> 00:44:15,955 disebut di sini a dan b. 997 00:44:15,955 --> 00:44:18,080 Dan Anda dapat melakukan apapun Anda ingin dengan mereka salinan, 998 00:44:18,080 --> 00:44:20,657 tapi mereka akan memiliki efek pada fungsi panggilan. 999 00:44:20,657 --> 00:44:22,990 Dan, pada kenyataannya, kita menarik bahwa gambar pada layar, ingat 1000 00:44:22,990 --> 00:44:25,520 terakhir kali, dimana jika Anda benar-benar berpikir tentang apa yang 1001 00:44:25,520 --> 00:44:28,570 terjadi di bawah hood-- jika ini adalah memori komputer Anda, 1002 00:44:28,570 --> 00:44:31,650 dan di sini adalah sepotong memori yang digunakan untuk utama, 1003 00:44:31,650 --> 00:44:34,020 ini adalah sepotong memori yang digunakan untuk swap, 1004 00:44:34,020 --> 00:44:37,090 dan bahkan jika utama memiliki dua variabel, x dan y, 1005 00:44:37,090 --> 00:44:41,840 Swap mungkin identik mencari nilai-nilai, yang keduanya 1 dan 2, 1006 00:44:41,840 --> 00:44:44,520 tapi mereka benar-benar potongan yang berbeda dari memori. 1007 00:44:44,520 --> 00:44:46,130 >> Jadi kita perlu solusi untuk ini. 1008 00:44:46,130 --> 00:44:51,580 Dan terus terang, akan terlihat bahwa kita sekarang memiliki solusi untuk masalah ini, benar. 1009 00:44:51,580 --> 00:44:55,760 Jika kita sekarang memiliki kemampuan untuk memanipulasi hal dengan cara alamat 1010 00:44:55,760 --> 00:44:59,310 dan, semacam peluncuran dan tangga gaya, ikuti panah ini 1011 00:44:59,310 --> 00:45:02,820 dan pergi ke mana pun kita ingin dalam memori, tidak bisa kita 1012 00:45:02,820 --> 00:45:06,220 memecahkan masalah ini dengan lewat dari utama untuk swap 1013 00:45:06,220 --> 00:45:09,650 bukan nilai-nilai yang ingin kita swap, tetapi hanya secara intuitif 1014 00:45:09,650 --> 00:45:11,630 apa yang bisa kita lulus untuk swap 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, kan? 1017 00:45:15,244 --> 00:45:17,470 Mengapa kita tidak memberikan swap peta harta karun, jika Anda mau, 1018 00:45:17,470 --> 00:45:20,950 yang mengarah ke nilai yang sebenarnya x dan y. 1019 00:45:20,950 --> 00:45:24,340 Mari kita swap, benar-benar mengubah mereka bit asli, bukan 1020 00:45:24,340 --> 00:45:26,797 hanya lewat salinan bit. 1021 00:45:26,797 --> 00:45:29,130 Dan, pada kenyataannya, itulah yang akan menjadi solusi. 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 Dan sekarang, pada pandangan pertama, itu hanya tampak seperti kita menambahkan sekelompok bintang secara acak 1024 00:45:35,190 --> 00:45:37,106 dan menyeberangi jari-jari kita bahwa itu akan mengkompilasi. 1025 00:45:37,106 --> 00:45:38,460 Tapi, sekarang akan mengkompilasi. 1026 00:45:38,460 --> 00:45:40,090 >> Tapi mari kita lihat apa hal ini berarti. 1027 00:45:40,090 --> 00:45:43,990 Dan, sayangnya, penulis C bisa memilih simbol lain 1028 00:45:43,990 --> 00:45:46,380 untuk membuat ini sedikit jelas, namun operator Bintang 1029 00:45:46,380 --> 00:45:48,610 memiliki arti yang berbeda dalam dua konteks yang berbeda. 1030 00:45:48,610 --> 00:45:50,890 Dan kami telah melihat keduanya, tapi mari kita membedakan. 1031 00:45:50,890 --> 00:45:55,310 >> Jadi di atas sana, ketika saya telah berubah dan b 1032 00:45:55,310 --> 00:46:00,470 dari yang int dalam buruk Versi ke int bintang, a dan b, 1033 00:46:00,470 --> 00:46:01,740 sebelumnya, yang bilangan bulat. 1034 00:46:01,740 --> 00:46:05,752 Apa a dan b sekarang di 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, menjadi jelas? 1037 00:46:09,610 --> 00:46:10,770 Alamat bilangan bulat. 1038 00:46:10,770 --> 00:46:12,520 Jadi fakta bahwa aku mengatakan int bintang sarana 1039 00:46:12,520 --> 00:46:15,440 ini adalah alamat integer, khusus. 1040 00:46:15,440 --> 00:46:19,120 >> Jadi sekarang melihat di baris kode, sesuatu yang lain telah berubah juga. 1041 00:46:19,120 --> 00:46:22,770 tmp tetap sama, karena itu hanya integer sementara, 1042 00:46:22,770 --> 00:46:24,110 ada memori sihir di sana. 1043 00:46:24,110 --> 00:46:26,370 Tapi sekarang membutuhkan sebuah bintang. 1044 00:46:26,370 --> 00:46:28,560 Dan, pada kenyataannya, setiap menyebutkan lainnya dari a dan b, 1045 00:46:28,560 --> 00:46:31,780 melihat bahwa semua itu berubah dari merah ke hijau 1046 00:46:31,780 --> 00:46:34,209 adalah bahwa aku awalan variabel dengan bintang-bintang. 1047 00:46:34,209 --> 00:46:35,750 Karena saya tidak ingin menyalin dan b. 1048 00:46:35,750 --> 00:46:40,350 Karena jika saya hanya menyalin a dan b dan pertukaran a dan b, apa yang saya benar-benar swapping? 1049 00:46:40,350 --> 00:46:43,760 Hanya alamat, saya ingin menukar apa yang di alamat tersebut. 1050 00:46:43,760 --> 00:46:44,860 Aku ingin pergi ke sana. 1051 00:46:44,860 --> 00:46:48,000 Dan operator Bintang dalam fungsi saya, 1052 00:46:48,000 --> 00:46:51,700 tidak dalam daftar parameter, berarti 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, apa gambar sekarang terlihat seperti bukan. 1055 00:46:56,500 --> 00:47:03,250 Nah, jika bukan aku melewati dalam untuk dan b tidak 1 dan 2-- 1056 00:47:03,250 --> 00:47:05,790 Aku benar-benar perlu menambahkan satu definisi lain di sini. 1057 00:47:05,790 --> 00:47:09,030 Jadi misalkan potongan ini memori di lokasi 10. 1058 00:47:09,030 --> 00:47:12,960 >> Ini adalah di lokasi 11, tapi ini adalah sedikit penyederhanaan, 1059 00:47:12,960 --> 00:47:18,900 Saya sekarang memiliki dua pilihan apakah saya lulus x dan y atau apakah 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 sekarang perlu untuk mengimplementasikan Swap per kode hijau 1062 00:47:25,390 --> 00:47:29,080 sehingga ketika melihat dan ketika dilihatnya b, itu tidak hanya menyalin dan b 1063 00:47:29,080 --> 00:47:30,540 dan memindahkan susu dan jus jeruk. 1064 00:47:30,540 --> 00:47:32,664 Susu dan jus jeruk metafora sekarang rusak, 1065 00:47:32,664 --> 00:47:35,060 karena mereka adalah cangkir peta cair dan tidak. 1066 00:47:35,060 --> 00:47:37,750 Kami bukannya harus pergi untuk mengatasi 10 dan kami 1067 00:47:37,750 --> 00:47:42,420 harus pergi untuk mengatasi 11, dan kemudian melakukan bahwa logika swapping. 1068 00:47:42,420 --> 00:47:45,580 >> Jadi logika adalah sama, tetapi kita perlu cara yang sedikit berbeda 1069 00:47:45,580 --> 00:47:47,160 mengakses variabel tersebut. 1070 00:47:47,160 --> 00:47:52,400 Dan pada akhirnya, apa yang Program harus terlihat seperti ini ini. 1071 00:47:52,400 --> 00:47:56,610 Dalam swap.c harfiah disalin dan disisipkan versi hijau. 1072 00:47:56,610 --> 00:47:58,450 Tapi saya perlu membuat satu perubahan. 1073 00:47:58,450 --> 00:48:00,180 Ini tidak cukup hanya untuk mengubah swap. 1074 00:48:00,180 --> 00:48:03,830 Apa baris lain dari kode apakah saya perlu mengubah? 1075 00:48:03,830 --> 00:48:04,330 Ya? 1076 00:48:04,330 --> 00:48:05,770 >> AUDIENCE: Dimana dibutuhkan argumen. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. Malan: Dimana dibutuhkan argumen. 1078 00:48:07,603 --> 00:48:09,985 Jadi jika saya gulir ke utama, saya tidak bisa hanya lulus dalam x dan y, 1079 00:48:09,985 --> 00:48:12,820 dan, aku janji, yang terakhir sepotong sintaks baru hari ini. 1080 00:48:12,820 --> 00:48:17,200 Saya harus lulus dalam tidak x dan y tapi alamat x dan y. 1081 00:48:17,200 --> 00:48:20,400 Dan ternyata, simbol bahwa penulis C memilih 1082 00:48:20,400 --> 00:48:23,860 adalah jika Anda menggunakan ampersand sini, tidak bingung dengan ampersand bitwise, 1083 00:48:23,860 --> 00:48:27,130 jika Anda menggunakan ampersand di sini dan ampersand sini, 1084 00:48:27,130 --> 00:48:29,570 ini angka keluar untuk Anda, apa alamat x, 1085 00:48:29,570 --> 00:48:31,740 mungkin itu 10, apa alamat y, mungkin itu 1086 00:48:31,740 --> 00:48:35,400 11, dan melewati mereka di sebaliknya. 1087 00:48:35,400 --> 00:48:37,210 >> Jadi banyak untuk menyerap sekaligus. 1088 00:48:37,210 --> 00:48:40,190 Tapi mari kita lihat sekarang cepat di kami sisa empat menit 1089 00:48:40,190 --> 00:48:42,150 di mana hal bisa salah. 1090 00:48:42,150 --> 00:48:45,120 Dan sebagai samping, 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 dari Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Pointer mungkin adalah yang paling sulit topik yang kita bahas di CS50. 1094 00:48:52,310 --> 00:48:54,810 Jadi jika Anda khawatir semacam itu lereng seperti mungkin itu 1095 00:48:54,810 --> 00:48:56,770 lebih dari tongkat hoki seperti ini, menyadari 1096 00:48:56,770 --> 00:49:00,160 kita jenis mendekati puncaknya pada hal kompleksitas konseptual. 1097 00:49:00,160 --> 00:49:02,300 >> Dan aku membawa ini foto, karena aku bersumpah 1098 00:49:02,300 --> 00:49:05,920 untuk tuhan, pada musim gugur tahun 1996, ketika saya mengambil CS50 dengan mengajar sesama, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, dia menyuruhku duduk di sudut Eliot D. Hall makan siang, 1100 00:49:09,620 --> 00:49:12,330 atau makan malam, atau sesuatu untuk mencoba untuk membantu saya memahami pointer. 1101 00:49:12,330 --> 00:49:16,520 Dan ini adalah di mana saya minggu setelah diperkenalkan di kuliah saat 1102 00:49:16,520 --> 00:49:18,170 Saya akhirnya mengerti pointer. 1103 00:49:18,170 --> 00:49:20,590 Dan aku berharap bahwa ini akan klik jauh lebih cepat untuk Anda. 1104 00:49:20,590 --> 00:49:23,540 Tapi menyadari hal ini benar-benar di antara 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 Tapi itu salah satu yang paling kuat. 1107 00:49:25,819 --> 00:49:28,860 Dan ketika Anda mendapatkannya, itu benar-benar semua hanya akan akhirnya datang bersama-sama. 1108 00:49:28,860 --> 00:49:31,460 Jadi yakinlah itu tidak perlu semua tenggelam di hari ini. 1109 00:49:31,460 --> 00:49:32,980 >> Jadi, inilah program terakhir kita akan melihat. 1110 00:49:32,980 --> 00:49:35,605 Dan kita akan berakhir dengan cepat tiga menit claymation 1111 00:49:35,605 --> 00:49:37,030 dibuat oleh teman kita, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Berikut program, yang pada dua atas garis menyatakan sebuah variabel x dan y. 1113 00:49:41,440 --> 00:49:44,780 Keduanya merupakan alamat bilangan bulat, AKA pointer. 1114 00:49:44,780 --> 00:49:48,125 Kami kemudian mengalokasikan cukup memori untuk menyimpan sebuah int 1115 00:49:48,125 --> 00:49:51,344 dan menyimpan alamat itu memori di x. 1116 00:49:51,344 --> 00:49:53,260 Jadi, itu bahkan lebih sederhana dari contoh sebelumnya. 1117 00:49:53,260 --> 00:49:56,100 Beri aku empat byte memori, itu ukuran sebuah int, 1118 00:49:56,100 --> 00:49:58,000 dan memasukkan alamat yang di x. 1119 00:49:58,000 --> 00:50:01,070 Baris ini di sini berarti pergi ke alamat di x 1120 00:50:01,070 --> 00:50:05,270 dan menempatkan arti hidup, jumlah 42 ada. 1121 00:50:05,270 --> 00:50:07,710 Tapi garis ini membuatku khawatir. 1122 00:50:07,710 --> 00:50:12,620 Membintangi y berarti pergi ke alamat di y, dan menempatkan beruntung nomor 13 ada. 1123 00:50:12,620 --> 00:50:15,780 Mengapa berbahaya, pada saat ini di story-- meskipun cepat mengatakan 1124 00:50:15,780 --> 00:50:17,980 di menit memudarnya kami sini-mengapa itu buruk 1125 00:50:17,980 --> 00:50:19,660 bagi saya untuk mengatakan, pergi ke alamat di y? 1126 00:50:19,660 --> 00:50:21,077 >> AUDIENCE: Anda belum [tidak terdengar]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. Malan: Saya belum memasukkan apa pun di y. 1128 00:50:22,910 --> 00:50:25,520 Jadi apa adalah nilai y, pada saat ini dalam cerita? 1129 00:50:25,520 --> 00:50:26,570 Kami tidak tahu. 1130 00:50:26,570 --> 00:50:29,190 Ini beberapa nilai sampah dan juga tidak Binky tahu. 1131 00:50:29,190 --> 00:50:32,532 Jika kita bisa berakhir pada catatan ini. 1132 00:50:32,532 --> 00:50:34,832 >> [VIDEO PLAYBACK] 1133 00:50:34,832 --> 00:50:36,500 >> Hei, Binky, bangun. 1134 00:50:36,500 --> 00:50:39,140 Sudah waktunya untuk pointer menyenangkan. 1135 00:50:39,140 --> 00:50:40,210 >> -Apa itu? 1136 00:50:40,210 --> 00:50:41,690 Belajar tentang pointer? 1137 00:50:41,690 --> 00:50:43,570 Oh, goody. 1138 00:50:43,570 --> 00:50:46,600 >> -Nah, Untuk memulai, saya kira kami akan membutuhkan beberapa petunjuk. 1139 00:50:46,600 --> 00:50:47,380 >> -OKE. 1140 00:50:47,380 --> 00:50:51,120 Kode ini mengalokasikan dua pointer yang dapat menunjukkan bilangan bulat. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Baik saya melihat dua pointer, tetapi mereka 1142 00:50:53,557 --> 00:50:55,140 tampaknya tidak menjadi menunjuk ke sesuatu. 1143 00:50:55,140 --> 00:50:55,970 >> -Betul. 1144 00:50:55,970 --> 00:50:58,100 Awalnya pointer tidak menunjuk ke apapun. 1145 00:50:58,100 --> 00:51:00,950 Hal-hal yang mereka menunjuk ke yang disebut pointees dan pengaturan mereka 1146 00:51:00,950 --> 00:51:02,330 adalah langkah yang terpisah. 1147 00:51:02,330 --> 00:51:03,210 >> Oh, benar, benar. 1148 00:51:03,210 --> 00:51:03,940 Aku tahu itu. 1149 00:51:03,940 --> 00:51:05,730 The pointees terpisah. 1150 00:51:05,730 --> 00:51:08,310 Jadi bagaimana Anda mengalokasikan pointee sebuah? 1151 00:51:08,310 --> 00:51:11,960 >> -OK, Baik ini kode mengalokasikan sebuah pointee bilangan bulat baru, 1152 00:51:11,960 --> 00:51:15,050 dan ini bagian set x untuk menunjuk ke itu. 1153 00:51:15,050 --> 00:51:16,240 >> Hei, yang terlihat lebih baik. 1154 00:51:16,240 --> 00:51:17,743 Jadi membuatnya melakukan sesuatu. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Aku akan dereference pointer x untuk menyimpan nomor 42 ke pointee nya. 1156 00:51:23,580 --> 00:51:27,130 Untuk trik ini, saya harus saya tongkat ajaib dari dereferencing. 1157 00:51:27,130 --> 00:51:30,200 >> -Anda Tongkat sihir dari 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 kode terlihat seperti. 1160 00:51:34,270 --> 00:51:35,970 Aku hanya akan mengatur nomor dan-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SUARA] 1162 00:51:37,070 --> 00:51:39,140 >> Hei, lihat ada kelanjutannya. 1163 00:51:39,140 --> 00:51:43,980 Jadi, melakukan dereference pada x berikut panah untuk mengakses pointee nya. 1164 00:51:43,980 --> 00:51:46,150 Dalam hal ini, untuk menyimpan 42 di sana. 1165 00:51:46,150 --> 00:51:50,700 Hei, coba gunakan untuk menyimpan nomor 13 melalui pointer lain, y. 1166 00:51:50,700 --> 00:51:51,840 >> -OKE. 1167 00:51:51,840 --> 00:51:56,270 Aku akan pergi ke sini untuk y, dan mendapatkan nomor 13 set up. 1168 00:51:56,270 --> 00:52:00,380 Dan kemudian mengambil tongkat dereferencing dan hanya-- 1169 00:52:00,380 --> 00:52:01,646 >> [BUZZER SUARA] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hey itu tidak berhasil. 1171 00:52:04,080 --> 00:52:06,470 Mengatakan, uh, Binky, saya tidak berpikir dereferencing 1172 00:52:06,470 --> 00:52:10,850 y adalah ide yang baik, karena pengaturan up pointee merupakan langkah terpisah. 1173 00:52:10,850 --> 00:52:12,480 Dan saya tidak berpikir 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, kami mengalokasikan pointer, y, tapi kita tidak pernah mengaturnya untuk menunjuk ke sebuah pointee. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Sangat jeli. 1177 00:52:21,590 --> 00:52:23,215 Hei, Anda sedang mencari yang baik di sana, Binky. 1178 00:52:23,215 --> 00:52:26,390 Anda dapat memperbaikinya sehingga y poin ke pointee sama x. 1179 00:52:26,390 --> 00:52:29,290 >> -Tentu, Saya menggunakan tongkat sihir saya pointer tugas. 1180 00:52:29,290 --> 00:52:31,970 >> -adalah Yang akan menjadi masalah, seperti sebelumnya? 1181 00:52:31,970 --> 00:52:33,790 >> -Tidak, Ini tidak menyentuh pointees. 1182 00:52:33,790 --> 00:52:35,840 Hanya mengubah satu pointer untuk menunjuk ke sama thing-- 1183 00:52:35,840 --> 00:52:36,465 >> [Popping SUARA] 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 poin ke tempat yang sama seperti x. 1187 00:52:41,200 --> 00:52:42,950 Jadi, tunggu, sekarang y adalah tetap. 1188 00:52:42,950 --> 00:52:44,110 Memiliki pointee a. 1189 00:52:44,110 --> 00:52:47,779 Jadi Anda dapat mencoba tongkat dereferencing lagi untuk mengirim 13 lebih. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, OK, here goes. 1191 00:52:51,110 --> 00:52:52,330 >> Hei, lihat itu. 1192 00:52:52,330 --> 00:52:53,570 Sekarang dereferencing bekerja pada y. 1193 00:52:53,570 --> 00:52:57,900 Dan karena pointer berbagi bahwa salah satu pointee, mereka berdua melihat 13. 1194 00:52:57,900 --> 00:52:59,952 >> Yeah, berbagi, eh, apa pun. 1195 00:52:59,952 --> 00:53:01,535 Jadi, kita akan beralih tempat sekarang? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, melihat kami dari waktu ke waktu. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Hanya Ingat tiga aturan pointer. 1199 00:53:06,520 --> 00:53:09,550 Nomor 1, struktur dasar adalah bahwa Anda memiliki pointer, 1200 00:53:09,550 --> 00:53:11,630 dan menunjuk ke sebuah pointee. 1201 00:53:11,630 --> 00:53:13,740 Tapi pointer dan pointee terpisah. 1202 00:53:13,740 --> 00:53:15,620 Dan kesalahan umum adalah untuk mengatur pointer 1203 00:53:15,620 --> 00:53:18,000 tapi lupa untuk memberikan pointee a. 1204 00:53:18,000 --> 00:53:21,170 >> Nomor 2, pointer dereferencing dimulai pada pointer 1205 00:53:21,170 --> 00:53:24,020 dan mengikuti panah yang lebih untuk mengakses pointee nya. 1206 00:53:24,020 --> 00:53:27,815 Seperti kita semua tahu, ini hanya bekerja jika ada adalah pointee, yang jenis akan kembali 1207 00:53:27,815 --> 00:53:29,260 untuk memerintah nomor 1. 1208 00:53:29,260 --> 00:53:31,990 >> Nomor 3, pointer tugas mengambil satu pointer 1209 00:53:31,990 --> 00:53:35,330 dan perubahan itu untuk menunjuk ke pointee sama seperti pointer lain. 1210 00:53:35,330 --> 00:53:37,150 Jadi setelah penugasan, dua pointer 1211 00:53:37,150 --> 00:53:40,927 akan menunjuk ke pointee yang sama, kadang-kadang disebut berbagi. 1212 00:53:40,927 --> 00:53:42,510 Dan itu semua ada untuk itu, benar-benar. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye sekarang. 1214 00:53:43,130 --> 00:53:43,475 >> [END PLAYBACK] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. Malan: Itu saja untuk CS50. 1216 00:53:44,830 --> 00:53:46,246 Berkat Profesor Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Kita akan melihat Anda minggu depan. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [MUSIK ELEKTRONIK PLAYING] 1220 00:53:56,435 --> 00:57:22,775