1 00:00:00,000 --> 00:00:03,381 >> [MUSIC PLAYING] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO PLAYBACK] 4 00:00:11,610 --> 00:00:13,640 >> -Dia berbohong. 5 00:00:13,640 --> 00:00:14,380 >> -Mengenai apa? 6 00:00:14,380 --> 00:00:17,182 >> -Aku Tidak tahu. 7 00:00:17,182 --> 00:00:19,990 >> -Jadi Apa yang kita ketahui? 8 00:00:19,990 --> 00:00:23,145 >> -yaitu Di 09:15, Ray Santoya berada di ATM. 9 00:00:23,145 --> 00:00:23,644 Yeah. 10 00:00:23,644 --> 00:00:27,030 Jadi pertanyaannya adalah, apa yang yang dia lakukan di 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting 9 milimeter sesuatu. 12 00:00:29,720 --> 00:00:31,540 Mungkin dia melihat penembak jitu. 13 00:00:31,540 --> 00:00:33,412 >> -atau Bekerja dengan dia. 14 00:00:33,412 --> 00:00:34,340 >> -Tunggu. 15 00:00:34,340 --> 00:00:36,200 Kembali satu. 16 00:00:36,200 --> 00:00:36,975 >> -Apa yang kamu lihat? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bawa Wajahnya hingga layar penuh. 19 00:00:47,805 --> 00:00:48,680 >> Gelas -Tinjauan. 20 00:00:48,680 --> 00:00:50,060 >> -Ada Refleksi. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Ini Tim bisbol Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Itu logo mereka. 24 00:01:03,110 --> 00:01:05,820 >> -dan Dia berbicara dengan siapa pun yang mengenakan jaket itu. 25 00:01:05,820 --> 00:01:06,670 >> [END PLAYBACK] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Baiklah. 27 00:01:07,628 --> 00:01:11,210 Ini adalah CS50 dan ini sedikit lebih dari [tak terdengar] dengan yang Anda 28 00:01:11,210 --> 00:01:12,890 berkecimpung dengan masalah menetapkan empat. 29 00:01:12,890 --> 00:01:16,606 Hari ini kita mulai melihat sedikit lebih mendalam hal-hal ini disebut pointer, 30 00:01:16,606 --> 00:01:18,480 yang meskipun itu topik yang cukup misterius, 31 00:01:18,480 --> 00:01:20,813 ternyata bahwa itu akan menjadi sarana yang kita 32 00:01:20,813 --> 00:01:24,320 bisa mulai membangun dan perakitan program jauh lebih canggih. 33 00:01:24,320 --> 00:01:28,150 Tapi kami melakukannya pada hari Rabu terakhir dengan cara beberapa claymation pertama. 34 00:01:28,150 --> 00:01:30,190 Jadi ini, ingat, adalah Binky dan kami menggunakan dia 35 00:01:30,190 --> 00:01:33,148 untuk melihat pada program yang tidak benar-benar melakukan sesuatu yang menarik, 36 00:01:33,148 --> 00:01:34,950 tapi itu mengungkapkan beberapa masalah. 37 00:01:34,950 --> 00:01:38,570 Jadi untuk memulai hari, mengapa kita tidak berjalan cepat melalui beberapa langkah-langkah ini, 38 00:01:38,570 --> 00:01:41,920 mencoba untuk menyaring ke dalam istilah manusia persis apa yang terjadi di sini 39 00:01:41,920 --> 00:01:45,410 dan mengapa ini buruk, dan kemudian beralih dan benar-benar mulai membangun sesuatu 40 00:01:45,410 --> 00:01:46,309 dengan teknik ini? 41 00:01:46,309 --> 00:01:48,350 Jadi ini adalah yang pertama dua baris dalam program ini 42 00:01:48,350 --> 00:01:51,340 dan dalam istilah awam, apa adalah dua baris ini lakukan? 43 00:01:51,340 --> 00:01:55,600 Seseorang yang cukup nyaman dengan apa yang dinyatakan di layar? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Apa dua baris lakukan? 46 00:02:00,120 --> 00:02:02,070 Ini tidak semua yang berbeda dari satu minggu, 47 00:02:02,070 --> 00:02:03,611 tapi ada beberapa simbol khusus baru. 48 00:02:03,611 --> 00:02:04,152 Ya? 49 00:02:04,152 --> 00:02:05,628 Kembali ke sana. 50 00:02:05,628 --> 00:02:07,092 >> AUDIENCE: Mendeklarasikan pointer? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Katakanlah lagi? 52 00:02:08,050 --> 00:02:08,860 AUDIENCE: Mendeklarasikan pointer? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Mendeklarasikan pointer dan mari kita memperbaikinya sedikit lebih. 54 00:02:11,776 --> 00:02:14,050 AUDIENCE: [tidak terdengar] alamat x dan kemudian y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: Dan kemudian mengatasi. 56 00:02:15,300 --> 00:02:18,550 Jadi secara spesifik apa yang kita lakukan adalah kita mendeklarasikan dua variabel. 57 00:02:18,550 --> 00:02:21,252 Variabel ini, meskipun, akan menjadi tipe bintang int, yang 58 00:02:21,252 --> 00:02:23,210 lebih khusus berarti mereka akan menyimpan 59 00:02:23,210 --> 00:02:26,450 alamat int, masing-masing, x dan y. 60 00:02:26,450 --> 00:02:27,660 Sekarang apakah ada nilai-nilai? 61 00:02:27,660 --> 00:02:32,621 Apakah ada alamat yang sebenarnya di ini dua variabel pada saat ini dalam waktu? 62 00:02:32,621 --> 00:02:33,120 Tidak. 63 00:02:33,120 --> 00:02:35,030 Ini disebut hanya nilai-nilai sampah. 64 00:02:35,030 --> 00:02:38,120 Jika Anda tidak benar-benar menetapkan variabel, apa pun yang di RAM 65 00:02:38,120 --> 00:02:42,224 sebelumnya akan mengisi dengan nol dan yang kedua variabel tersebut. 66 00:02:42,224 --> 00:02:44,140 Tapi kita belum tahu apa yang mereka dan itulah 67 00:02:44,140 --> 00:02:47,060 akan menjadi kunci untuk mengapa Binky kehilangan kepalanya pekan lalu. 68 00:02:47,060 --> 00:02:49,980 >> Jadi ini adalah claymation yang inkarnasi ini 69 00:02:49,980 --> 00:02:53,580 dimana Anda hanya memiliki dua variabel, sedikit potongan melingkar dari tanah liat, 70 00:02:53,580 --> 00:02:57,330 yang dapat menyimpan variabel, tetapi sebagai panah dibungkus menyarankan, 71 00:02:57,330 --> 00:03:00,640 mereka tidak benar-benar menunjuk ke mana saja dikenal. 72 00:03:00,640 --> 00:03:03,670 Jadi kami harus baris ini, dan ini baru minggu lalu, malloc untuk memori 73 00:03:03,670 --> 00:03:07,130 alokasi, yang hanya cara mewah memberitahu sistem operasi, Linux 74 00:03:07,130 --> 00:03:09,750 atau Mac OS atau Windows, hey, memberi saya beberapa memori, 75 00:03:09,750 --> 00:03:11,780 dan semua Anda harus memberitahu sistem operasi 76 00:03:11,780 --> 00:03:14,699 adalah apa ketika meminta untuk memori. 77 00:03:14,699 --> 00:03:16,990 Ini tidak akan peduli apa Anda akan lakukan dengan itu, 78 00:03:16,990 --> 00:03:19,786 tetapi Anda perlu memberitahu operasi sistem apa dengan cara malloc. 79 00:03:19,786 --> 00:03:20,286 Ya? 80 00:03:20,286 --> 00:03:21,078 >> AUDIENCE: Berapa banyak? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Berapa banyak? 82 00:03:21,994 --> 00:03:25,280 Berapa banyak dalam byte, dan sebagainya, ini, lagi, contoh buat, hanya mengatakan, 83 00:03:25,280 --> 00:03:27,360 memberikan ukuran sebuah int. 84 00:03:27,360 --> 00:03:30,550 Sekarang, ukuran sebuah int adalah empat byte atau 32 bit. 85 00:03:30,550 --> 00:03:32,850 Jadi ini hanyalah sebuah cara mengatakan, hei, sistem operasi, 86 00:03:32,850 --> 00:03:37,290 memberi saya empat byte memori yang dapat saya gunakan di pembuangan saya, 87 00:03:37,290 --> 00:03:40,560 dan secara khusus, apa kembali malloc dengan hormat 88 00:03:40,560 --> 00:03:41,795 itu sepotong empat byte? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 AUDIENCE: Alamat? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: Alamat. 92 00:03:45,901 --> 00:03:47,580 Alamat yang sepotong empat byte. 93 00:03:47,580 --> 00:03:48,190 Tepat. 94 00:03:48,190 --> 00:03:51,430 Dan itulah yang disimpan pada akhirnya di x dan itulah mengapa kita tidak benar-benar 95 00:03:51,430 --> 00:03:55,240 peduli apa jumlah yang alamat adalah, apakah itu OX1 atau OX2 96 00:03:55,240 --> 00:03:57,110 atau beberapa alamat heksadesimal samar. 97 00:03:57,110 --> 00:03:59,850 Kami hanya peduli pictorially bahwa variabel x sekarang 98 00:03:59,850 --> 00:04:01,630 menunjuk ke sepotong memori. 99 00:04:01,630 --> 00:04:05,570 Jadi panah merupakan pointer, atau lebih khusus, alamat memori. 100 00:04:05,570 --> 00:04:09,120 Tapi sekali lagi, kita tidak biasanya peduli apa alamat tersebut sebenarnya. 101 00:04:09,120 --> 00:04:11,780 Sekarang, baris ini mengatakan apa yang dalam istilah awam? 102 00:04:11,780 --> 00:04:14,330 Bintang x mendapat 42 titik koma. 103 00:04:14,330 --> 00:04:17,390 Apa artinya ini? 104 00:04:17,390 --> 00:04:18,200 Anda ingin pergi? 105 00:04:18,200 --> 00:04:20,102 Jangan menggaruk leher Anda. 106 00:04:20,102 --> 00:04:22,360 >> AUDIENCE: Alamat x adalah pada 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Alamat x di 42. 108 00:04:24,300 --> 00:04:25,190 Tidak terlalu. 109 00:04:25,190 --> 00:04:28,485 Begitu dekat, tapi tidak cukup, karena ada bintang yang awalan x ini. 110 00:04:28,485 --> 00:04:29,860 Jadi kita perlu tweak sedikit. 111 00:04:29,860 --> 00:04:31,032 Ya? 112 00:04:31,032 --> 00:04:36,044 >> AUDIENCE: Nilai bahwa pointer x menunjuk ke adalah 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Nilai bahwa pointer x adalah menunjuk ke, katakanlah, harus 42, 115 00:04:40,840 --> 00:04:44,165 atau dengan kata lain, bintang x mengatakan, pergi ke alamat apapun 116 00:04:44,165 --> 00:04:48,340 adalah x, apakah itu 1 Oxford Jalan atau 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 atau OX1 atau OX33, apa pun alamat numerik adalah, 118 00:04:51,850 --> 00:04:54,380 Bintang x adalah dereferencing x. 119 00:04:54,380 --> 00:04:57,297 Jadi pergi ke alamat itu dan kemudian memasukkan nomor 42 ada. 120 00:04:57,297 --> 00:04:59,380 Sehingga akan menjadi Cara setara mengatakan bahwa. 121 00:04:59,380 --> 00:05:01,860 Jadi itu semua baik-baik saja dan kemudian kita akan mewakili gambar 122 00:05:01,860 --> 00:05:05,370 sebagai berikut di mana kami telah menambahkan 42 untuk yang sepotong empat 123 00:05:05,370 --> 00:05:09,370 byte di sisi kanan, tetapi baris ini adalah di mana hal-hal berjalan kacau 124 00:05:09,370 --> 00:05:11,120 dan kepala Binky ini muncul off pada saat ini, 125 00:05:11,120 --> 00:05:15,290 karena hal-hal buruk terjadi ketika Anda dereference nilai sampah 126 00:05:15,290 --> 00:05:18,210 atau Anda dereference valid pointer, dan saya mengatakan tidak valid 127 00:05:18,210 --> 00:05:21,020 karena pada titik ini dalam cerita, apa yang ada dalam y? 128 00:05:21,020 --> 00:05:24,440 Apa nilai y berdasarkan pada beberapa langkah terakhir? 129 00:05:24,440 --> 00:05:25,360 Ya? 130 00:05:25,360 --> 00:05:26,115 Apa itu? 131 00:05:26,115 --> 00:05:26,990 >> AUDIENCE: Sebuah alamat. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: Sebuah alamat. 133 00:05:28,460 --> 00:05:31,910 Ini harus alamat tetapi saya diinisialisasi itu? 134 00:05:31,910 --> 00:05:32,800 Jadi saya belum. 135 00:05:32,800 --> 00:05:35,430 Jadi apa yang dikenal berada di sana? 136 00:05:35,430 --> 00:05:37,590 Ini hanya beberapa nilai sampah. 137 00:05:37,590 --> 00:05:41,500 Ini bisa menjadi alamat dari nol sampai 2 miliar jika Anda memiliki dua gigs RAM, 138 00:05:41,500 --> 00:05:44,289 atau nol sampai 4 miliar jika Anda sudah punya empat gigabyte RAM. 139 00:05:44,289 --> 00:05:46,080 Ini beberapa nilai sampah, tapi masalahnya adalah 140 00:05:46,080 --> 00:05:48,200 bahwa sistem operasi, jika tidak memberi kamu 141 00:05:48,200 --> 00:05:51,140 yang sepotong memori khusus bahwa Anda sedang berusaha untuk pergi ke, 142 00:05:51,140 --> 00:05:54,650 itu umumnya akan menyebabkan apa kita lihat sebagai kesalahan segmentasi. 143 00:05:54,650 --> 00:05:57,810 Jadi sebenarnya, ada di antara kalian yang memiliki berjuang di masalah di jam kantor 144 00:05:57,810 --> 00:06:00,393 atau dalam masalah yang lebih umumnya dengan mencoba untuk mencari tahu 145 00:06:00,393 --> 00:06:02,150 kesalahan segmentasi, yang umumnya berarti 146 00:06:02,150 --> 00:06:05,017 Anda menyentuh segmen memori yang Anda tidak seharusnya. 147 00:06:05,017 --> 00:06:07,350 Anda menyentuh memori yang sistem operasi belum 148 00:06:07,350 --> 00:06:10,450 memungkinkan Anda untuk menyentuh, apakah itu dengan pergi terlalu jauh dalam array 149 00:06:10,450 --> 00:06:12,870 atau mulai sekarang, apakah itu karena Anda menyentuh 150 00:06:12,870 --> 00:06:14,780 memori yang hanya beberapa nilai sampah. 151 00:06:14,780 --> 00:06:18,230 >> Jadi melakukan star x sini semacam perilaku undefined. 152 00:06:18,230 --> 00:06:22,030 Anda tidak harus melakukannya karena peluang yang, program hanya akan crash, 153 00:06:22,030 --> 00:06:24,050 karena kau mengatakan, pergi ke alamat ini 154 00:06:24,050 --> 00:06:27,000 dan Anda tidak tahu di mana alamat yang benar-benar adalah. 155 00:06:27,000 --> 00:06:30,300 Jadi sistem operasi kemungkinan akan crash program Anda 156 00:06:30,300 --> 00:06:33,840 sebagai hasil dan memang, itu apa yang terjadi di sana untuk Binky. 157 00:06:33,840 --> 00:06:37,210 Jadi pada akhirnya, Binky tetap masalah ini dengan ini. 158 00:06:37,210 --> 00:06:38,909 Sehingga program itu sendiri itu cacat. 159 00:06:38,909 --> 00:06:41,450 Tapi jika Anda semacam maju dan mengeksekusi baris ini sebaliknya, 160 00:06:41,450 --> 00:06:45,580 y sama dengan x hanya berarti apapun Alamat adalah x, juga memasukkannya ke dalam y. 161 00:06:45,580 --> 00:06:48,740 >> Dan pictorially, kami telah diwakili dengan dua panah 162 00:06:48,740 --> 00:06:51,570 dari x dan y dari menunjuk ke tempat yang sama. 163 00:06:51,570 --> 00:06:55,760 Jadi semantik, x sama untuk y karena kedua orang 164 00:06:55,760 --> 00:07:00,300 menyimpan sama alamat, ergo menunjuk 42, 165 00:07:00,300 --> 00:07:04,910 dan sekarang, ketika Anda mengatakan star y, pergi ke alamat di y, 166 00:07:04,910 --> 00:07:06,790 ini memiliki efek samping yang menarik. 167 00:07:06,790 --> 00:07:10,320 Jadi alamat di y adalah hal yang sama seperti alamat di x. 168 00:07:10,320 --> 00:07:15,060 Jadi jika Anda mengatakan pergi ke alamat di y dan ubah nilainya menjadi 13, 169 00:07:15,060 --> 00:07:17,140 siapa lagi yang terpengaruh? 170 00:07:17,140 --> 00:07:21,100 X, titik D, sehingga untuk berbicara, harus terpengaruh juga. 171 00:07:21,100 --> 00:07:24,340 >> Dan memang, bagaimana Nick menggambar gambar ini di claymation adalah persis seperti itu. 172 00:07:24,340 --> 00:07:28,665 Meskipun kita mengikuti pointer y, kami berakhir di tempat yang sama, 173 00:07:28,665 --> 00:07:32,780 dan jadi jika kami mencetak keluar x atau y yang pointee, 174 00:07:32,780 --> 00:07:35,720 maka kita akan melihat nilai 13. 175 00:07:35,720 --> 00:07:37,927 Sekarang, saya katakan pointee menjadi konsisten dengan video. 176 00:07:37,927 --> 00:07:39,760 Programmer, untuk saya pengetahuan, pernah benar-benar 177 00:07:39,760 --> 00:07:42,460 mengatakan pointee kata, bahwa yang runcing 178 00:07:42,460 --> 00:07:44,650 di, tapi untuk konsistensi dengan video, menyadari 179 00:07:44,650 --> 00:07:47,520 itu semua yang berarti dalam situasi itu. 180 00:07:47,520 --> 00:07:54,190 Jadi pertanyaan pada claymation atau pointer atau malloc dulu? 181 00:07:54,190 --> 00:07:54,850 Tidak? 182 00:07:54,850 --> 00:07:55,470 Baiklah. 183 00:07:55,470 --> 00:07:58,560 >> Jadi tanpa lebih lanjut ado, mari kita lihat 184 00:07:58,560 --> 00:08:00,700 di mana ini sebenarnya telah telah digunakan untuk beberapa waktu. 185 00:08:00,700 --> 00:08:03,580 Jadi kami sudah perpustakaan CS50 ini yang punya semua fungsi ini. 186 00:08:03,580 --> 00:08:06,810 Kami telah menggunakan getInt banyak, GetString, mungkin GetLongLong sebelumnya 187 00:08:06,810 --> 00:08:09,840 di PSet saya satu atau lebih, tetapi apa yang sebenarnya terjadi? 188 00:08:09,840 --> 00:08:12,920 Nah, mari kita lihat bawah kap di program yang 189 00:08:12,920 --> 00:08:17,017 mengilhami mengapa kami memberikan Anda CS50 perpustakaan, dan memang pada pekan lalu, 190 00:08:17,017 --> 00:08:18,850 kami mulai mengambil mereka roda pelatihan off. 191 00:08:18,850 --> 00:08:21,080 Jadi ini sekarang diurutkan dari postmortem dari apa 192 00:08:21,080 --> 00:08:23,690 memiliki sudah berlangsung dalam perpustakaan CS50, 193 00:08:23,690 --> 00:08:27,250 meskipun kita sekarang akan mulai bergerak jauh dari itu untuk sebagian besar program. 194 00:08:27,250 --> 00:08:29,460 >> Jadi ini adalah sebuah program yang disebut scanf 0. 195 00:08:29,460 --> 00:08:30,510 Ini super pendek. 196 00:08:30,510 --> 00:08:33,909 Itu hanya memiliki garis-garis ini, tetapi memperkenalkan fungsi yang disebut scanf 197 00:08:33,909 --> 00:08:36,909 bahwa kita benar-benar akan melihat di saat di dalam perpustakaan CS50, 198 00:08:36,909 --> 00:08:38,600 meskipun dalam bentuk yang sedikit berbeda. 199 00:08:38,600 --> 00:08:41,330 Jadi program ini pada baris 16 adalah mendeklarasikan variabel x. 200 00:08:41,330 --> 00:08:43,150 Jadi memberi saya empat byte untuk int. 201 00:08:43,150 --> 00:08:45,750 Sudah pengguna mengatakan, nomor silakan, dan kemudian 202 00:08:45,750 --> 00:08:49,010 ini adalah garis yang menarik yang sebenarnya mengikat bersama-sama minggu lalu 203 00:08:49,010 --> 00:08:49,790 dan ini. 204 00:08:49,790 --> 00:08:53,230 Scanf, dan kemudian melihat dibutuhkan format string, seperti printf, 205 00:08:53,230 --> 00:08:57,480 % i berarti int, dan kemudian dibutuhkan Argumen kedua yang terlihat sedikit 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Ini ampersand x, dan untuk mengingat, kita hanya melihat minggu sekali lalu ini. 208 00:09:01,880 --> 00:09:03,465 Apa ampersand x mewakili? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Apa ampersand lakukan di C? 211 00:09:08,450 --> 00:09:08,950 Ya? 212 00:09:08,950 --> 00:09:10,024 >> AUDIENCE: Alamat. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Alamat. 214 00:09:11,190 --> 00:09:13,190 Jadi sebaliknya operator bintang, 215 00:09:13,190 --> 00:09:17,270 sedangkan operator bintang mengatakan, pergi ke alamat ini, operator ampersand 216 00:09:17,270 --> 00:09:20,280 mengatakan, mengetahui alamat variabel ini, 217 00:09:20,280 --> 00:09:23,530 dan jadi ini adalah kunci, karena Tujuan scanf dalam kehidupan 218 00:09:23,530 --> 00:09:26,320 adalah untuk memindai pengguna input dari keyboard, 219 00:09:26,320 --> 00:09:29,970 tergantung pada apa pun yang dia jenis, dan kemudian membaca masukan yang pengguna 220 00:09:29,970 --> 00:09:32,970 menjadi variabel, tapi kami melihat dalam dua minggu terakhir 221 00:09:32,970 --> 00:09:36,080 bahwa fungsi swap kami mencoba mudah untuk menerapkan 222 00:09:36,080 --> 00:09:37,110 hanya rusak. 223 00:09:37,110 --> 00:09:42,470 Ingat bahwa dengan fungsi swap, jika kita hanya menyatakan A dan B sebagai int, 224 00:09:42,470 --> 00:09:47,040 kami berhasil menukar dua variabel dalam swap 225 00:09:47,040 --> 00:09:50,080 hanya ingin dengan susu dan OJ, tetapi segera sebagai swap kembali, 226 00:09:50,080 --> 00:09:55,200 apa hasil dengan hormat untuk x dan y, nilai-nilai asli? 227 00:09:55,200 --> 00:09:55,700 Tidak ada. 228 00:09:55,700 --> 00:09:56,200 Ya. 229 00:09:56,200 --> 00:09:59,754 Tidak ada yang terjadi saat itu, karena swap mengubah hanya salinan lokal, 230 00:09:59,754 --> 00:10:01,670 yang mengatakan, semua kali ini, setiap kali kita sudah 231 00:10:01,670 --> 00:10:04,010 telah melewati dalam argumen fungsi, kami 232 00:10:04,010 --> 00:10:05,939 hanya lewat salinan argumen-argumen. 233 00:10:05,939 --> 00:10:07,980 Anda dapat melakukan dengan itu apapun yang Anda inginkan dengan mereka, 234 00:10:07,980 --> 00:10:10,890 tapi mereka akan memiliki efek pada nilai-nilai asli. 235 00:10:10,890 --> 00:10:13,650 Jadi ini bermasalah jika Anda ingin memiliki fungsi seperti scanf 236 00:10:13,650 --> 00:10:17,170 dalam kehidupan, yang tujuannya adalah untuk memindai masukan pengguna dari keyboard 237 00:10:17,170 --> 00:10:22,010 dan kemudian mengisi kekosongan, sehingga untuk berbicara, yaitu, memberikan variabel seperti x 238 00:10:22,010 --> 00:10:25,410 nilai, karena jika saya hanya lulus x untuk scanf, 239 00:10:25,410 --> 00:10:28,790 jika Anda mempertimbangkan logika terakhir Minggu, scanf dapat melakukan apapun yang diinginkan 240 00:10:28,790 --> 00:10:33,100 dengan salinan x, tetapi tidak bisa permanen mengubah x kecuali kita memberi 241 00:10:33,100 --> 00:10:37,120 scanf peta harta karun, sehingga untuk berbicara, di mana x menandai tempat, dimana 242 00:10:37,120 --> 00:10:41,860 kita lulus dalam alamat x sehingga scanf dapat pergi ke sana dan benar-benar perubahan 243 00:10:41,860 --> 00:10:42,920 nilai x. 244 00:10:42,920 --> 00:10:45,080 Dan memang, semua bahwa program ini tidak 245 00:10:45,080 --> 00:10:53,180 jika saya membuat scanf 0, di sumber saya Direktori 5m, membuat scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot slash scanf, jumlah silahkan 50, terima kasih atas 50. 247 00:10:57,730 --> 00:11:01,020 >> Sehingga tidak semua yang menarik, tapi apa memang terjadi 248 00:11:01,020 --> 00:11:04,820 adalah bahwa segera setelah saya sebut scanf sini, nilai x 249 00:11:04,820 --> 00:11:06,410 sedang secara permanen berubah. 250 00:11:06,410 --> 00:11:08,335 Sekarang, ini tampaknya bagus dan baik, dan pada kenyataannya, itu 251 00:11:08,335 --> 00:11:11,200 Sepertinya kita tidak benar-benar membutuhkan perpustakaan CS50 sekali lagi. 252 00:11:11,200 --> 00:11:13,960 Misalnya, mari kita jalankan ini sekali lagi di sini. 253 00:11:13,960 --> 00:11:15,750 Biarkan saya buka kembali untuk kedua. 254 00:11:15,750 --> 00:11:20,600 Mari kita coba nomor silakan dan bukannya mengatakan 50 seperti sebelumnya, 255 00:11:20,600 --> 00:11:22,810 mari kita hanya mengatakan tidak. 256 00:11:22,810 --> 00:11:24,000 OK, itu sedikit aneh. 257 00:11:24,000 --> 00:11:25,270 OKE. 258 00:11:25,270 --> 00:11:28,680 Dan hanya omong kosong di sini. 259 00:11:28,680 --> 00:11:31,170 Sehingga tampaknya tidak menangani situasi yang salah. 260 00:11:31,170 --> 00:11:33,620 Jadi kita perlu minimal awal menambahkan beberapa pengecekan error 261 00:11:33,620 --> 00:11:37,460 memastikan bahwa pengguna memiliki diketik dalam jumlah sebenarnya seperti 50, 262 00:11:37,460 --> 00:11:40,720 karena rupanya mengetik kata-kata tidak terdeteksi sebagai bermasalah, 263 00:11:40,720 --> 00:11:42,020 tapi mungkin seharusnya. 264 00:11:42,020 --> 00:11:46,450 >> Mari kita lihat versi ini sekarang itu upaya saya untuk reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Jika scanf memiliki semua ini fungsi built in, 266 00:11:48,437 --> 00:11:51,270 mengapa kita telah berkecimpung dengan ini roda pelatihan seperti GetString? 267 00:11:51,270 --> 00:11:55,450 Nah, di sini adalah mungkin saya sendiri versi sederhana dari GetString 268 00:11:55,450 --> 00:12:00,766 dimana seminggu yang lalu, saya mungkin telah mengatakan, memberi saya string dan menyebutnya penyangga. 269 00:12:00,766 --> 00:12:03,390 Hari ini, aku akan mulai hanya mengatakan bintang char, yang, ingat, 270 00:12:03,390 --> 00:12:04,400 itu hanya identik. 271 00:12:04,400 --> 00:12:06,629 Ini terlihat menakutkan tapi itu hal yang sama persis. 272 00:12:06,629 --> 00:12:09,420 Jadi memberi saya sebuah variabel disebut buffer itu akan menyimpan string, 273 00:12:09,420 --> 00:12:12,780 memberitahu string pengguna tolong, dan kemudian, seperti sebelumnya, 274 00:12:12,780 --> 00:12:17,760 mari kita coba untuk meminjam pelajaran ini scanf % s saat ini dan kemudian lulus dalam buffer. 275 00:12:17,760 --> 00:12:19,310 Sekarang, sebuah pemeriksaan cepat. 276 00:12:19,310 --> 00:12:22,120 Mengapa aku tidak mengatakan ampersand penyangga saat ini? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Menyimpulkan dari contoh sebelumnya. 279 00:12:26,625 --> 00:12:28,000 AUDIENCE: Bintang Char adalah pointer. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Tepat, karena saat ini, char 281 00:12:29,920 --> 00:12:34,080 Bintang sudah pointer, alamat, oleh definisi bahwa bintang berada di sana. 282 00:12:34,080 --> 00:12:37,530 Dan jika scanf mengharapkan alamat, itu sudah cukup hanya untuk lulus dalam buffer. 283 00:12:37,530 --> 00:12:39,260 Saya tidak perlu mengatakan ampersand penyangga. 284 00:12:39,260 --> 00:12:42,177 Bagi yang penasaran, Anda bisa melakukan sesuatu seperti ini. 285 00:12:42,177 --> 00:12:43,510 Ini akan memiliki arti yang berbeda. 286 00:12:43,510 --> 00:12:47,240 Ini akan memberi Anda pointer untuk pointer, yang sebenarnya 287 00:12:47,240 --> 00:12:50,050 hal yang valid di C, tapi untuk sekarang, mari kita tetap sederhana 288 00:12:50,050 --> 00:12:51,750 dan menjaga cerita konsisten. 289 00:12:51,750 --> 00:12:54,100 Aku hanya akan lulus dalam buffer dan itu benar. 290 00:12:54,100 --> 00:12:56,487 Masalahnya meskipun adalah ini. 291 00:12:56,487 --> 00:12:58,820 Biarkan aku pergi ke depan dan menjalankan ini Program setelah mengkompilasinya. 292 00:12:58,820 --> 00:13:00,902 Membuat scanf 1. 293 00:13:00,902 --> 00:13:02,610 Sialan, compiler saya menangkap kesalahan saya. 294 00:13:02,610 --> 00:13:04,090 Beri aku satu detik. 295 00:13:04,090 --> 00:13:05,460 Dentang. 296 00:13:05,460 --> 00:13:06,990 Katakanlah scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 OKE. 299 00:13:11,380 --> 00:13:12,720 Di sana kami pergi. 300 00:13:12,720 --> 00:13:14,280 Aku membutuhkannya. 301 00:13:14,280 --> 00:13:16,750 CS50 ID memiliki berbagai pengaturan konfigurasi 302 00:13:16,750 --> 00:13:18,280 yang melindungi Anda terhadap diri Anda sendiri. 303 00:13:18,280 --> 00:13:21,300 Saya perlu menonaktifkan mereka dengan menjalankan dentang manual saat ini. 304 00:13:21,300 --> 00:13:22,140 Jadi tali silakan. 305 00:13:22,140 --> 00:13:25,560 Aku akan pergi ke depan dan ketik di dunia halo favorit saya. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 Itu bukan apa yang saya ketik. 308 00:13:27,700 --> 00:13:29,690 Jadi indikasi sesuatu yang salah. 309 00:13:29,690 --> 00:13:33,920 Biarkan aku pergi ke depan dan ketik dalam serangkaian sangat panjang. 310 00:13:33,920 --> 00:13:37,210 Terima kasih untuk nol dan saya tidak tahu apakah aku akan mampu untuk kecelakaan itu. 311 00:13:37,210 --> 00:13:40,240 Mari kita coba salinan sedikit menyisipkan dan melihat apakah ini membantu. 312 00:13:40,240 --> 00:13:43,290 Hanya menyisipkan banyak ini. 313 00:13:43,290 --> 00:13:47,310 Ini jelas lebih besar tali dari biasanya. 314 00:13:47,310 --> 00:13:51,450 Mari kita hanya benar-benar menulis itu. 315 00:13:51,450 --> 00:13:51,950 Tidak. 316 00:13:51,950 --> 00:13:52,650 Kurang ajar. 317 00:13:52,650 --> 00:13:53,480 Perintah tidak ditemukan. 318 00:13:53,480 --> 00:13:54,550 Jadi itu tidak berhubungan. 319 00:13:54,550 --> 00:13:56,440 Itu karena aku disisipkan beberapa karakter yang buruk, 320 00:13:56,440 --> 00:13:59,780 tapi ini ternyata tidak akan bekerja. 321 00:13:59,780 --> 00:14:03,510 >> Mari kita coba ini sekali lagi, karena itu lebih menyenangkan jika kita benar-benar kecelakaan itu. 322 00:14:03,510 --> 00:14:09,116 Mari kita ketik ini dan sekarang, aku akan menyalin string yang sangat panjang 323 00:14:09,116 --> 00:14:10,990 dan sekarang mari kita lihat apakah kita dapat crash hal ini. 324 00:14:10,990 --> 00:14:14,235 Perhatikan saya dihilangkan spasi dan baris baru dan titik koma 325 00:14:14,235 --> 00:14:16,035 dan semua karakter yang funky. 326 00:14:16,035 --> 00:14:16,535 Masukkan. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 Dan sekarang jaringan hanya menjadi lambat. 329 00:14:22,880 --> 00:14:27,460 Saya ditekan Command-V terlalu lama, jelas. 330 00:14:27,460 --> 00:14:28,190 Kurang ajar! 331 00:14:28,190 --> 00:14:29,260 Perintah tidak ditemukan. 332 00:14:29,260 --> 00:14:29,780 >> OKE. 333 00:14:29,780 --> 00:14:32,240 Nah, intinya adalah tetap berikut. 334 00:14:32,240 --> 00:14:36,910 Jadi apa yang sebenarnya terjadi pada dengan deklarasi ini 335 00:14:36,910 --> 00:14:39,240 dari bintang char buffer on line 16? 336 00:14:39,240 --> 00:14:41,820 Jadi apa yang aku mendapatkan ketika saya menyatakan pointer? 337 00:14:41,820 --> 00:14:47,440 Semua aku mendapatkan adalah nilai empat byte disebut buffer, tapi apa di dalamnya 338 00:14:47,440 --> 00:14:49,540 saat ini? 339 00:14:49,540 --> 00:14:50,930 Ini hanya beberapa nilai sampah. 340 00:14:50,930 --> 00:14:54,170 Karena setiap kali Anda mendeklarasikan variabel di C, itu hanya beberapa nilai sampah, 341 00:14:54,170 --> 00:14:56,220 dan kita mulai perjalanan atas realitas ini. 342 00:14:56,220 --> 00:14:59,720 Sekarang, ketika saya memberitahu scanf, pergi ke alamat ini 343 00:14:59,720 --> 00:15:01,520 dan menempatkan apapun jenis pengguna di. 344 00:15:01,520 --> 00:15:06,400 Jika jenis pengguna di halo dunia, baik, di mana saya menaruhnya? 345 00:15:06,400 --> 00:15:07,750 Buffer adalah nilai sampah. 346 00:15:07,750 --> 00:15:11,510 >> Jadi itu jenis seperti panah yang menunjuk siapa yang tahu di mana. 347 00:15:11,510 --> 00:15:13,880 Mungkin itu menunjuk di sini dalam ingatanku. 348 00:15:13,880 --> 00:15:16,560 Dan jadi ketika pengguna jenis di dunia halo, 349 00:15:16,560 --> 00:15:22,380 program mencoba untuk menempatkan String hello world backslash 0 350 00:15:22,380 --> 00:15:23,910 dalam sepotong memori. 351 00:15:23,910 --> 00:15:27,070 Tapi dengan probabilitas tinggi, tapi jelas tidak probabilitas 100%, 352 00:15:27,070 --> 00:15:30,440 komputer akan kemudian crash program karena ini bukan 353 00:15:30,440 --> 00:15:32,490 memori saya harus diizinkan untuk menyentuh. 354 00:15:32,490 --> 00:15:36,330 Jadi singkatnya, program ini adalah cacat untuk persis alasan itu. 355 00:15:36,330 --> 00:15:38,070 Aku dasarnya tidak melakukan apa? 356 00:15:38,070 --> 00:15:42,366 Langkah-langkah apa yang harus saya dihilangkan, seperti kita dihilangkan dengan contoh pertama Binky ini? 357 00:15:42,366 --> 00:15:42,866 Ya? 358 00:15:42,866 --> 00:15:43,710 >> AUDIENCE: alokasi memori? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: alokasi memori. 360 00:15:45,001 --> 00:15:48,400 Saya belum benar-benar dialokasikan setiap memori untuk string. 361 00:15:48,400 --> 00:15:50,270 Jadi kita bisa memperbaiki ini dalam beberapa cara. 362 00:15:50,270 --> 00:15:52,700 Satu, kita bisa tetap sederhana dan pada kenyataannya, sekarang kau 363 00:15:52,700 --> 00:15:55,116 akan mulai melihat kabur sebuah garis antara apa 364 00:15:55,116 --> 00:15:58,520 array adalah, apa string adalah, sebuah apa Bintang arang adalah, apa array karakter 365 00:15:58,520 --> 00:15:59,020 aku s. 366 00:15:59,020 --> 00:16:02,450 Berikut adalah contoh kedua melibatkan string dan pemberitahuan 367 00:16:02,450 --> 00:16:05,690 semua yang telah saya lakukan pada baris 16 adalah, bukannya mengatakan 368 00:16:05,690 --> 00:16:09,530 buffer yang akan menjadi char bintang, pointer ke sepotong memori, 369 00:16:09,530 --> 00:16:14,057 Aku akan sangat proaktif memberikan diriku buffer untuk 16 karakter, 370 00:16:14,057 --> 00:16:16,390 dan pada kenyataannya, jika Anda terbiasa dengan penyangga istilah, 371 00:16:16,390 --> 00:16:20,570 mungkin dari dunia video, mana video buffering, buffering, 372 00:16:20,570 --> 00:16:21,175 buffering. 373 00:16:21,175 --> 00:16:22,550 Nah, apa koneksi di sini? 374 00:16:22,550 --> 00:16:24,960 Nah, dalam YouTube dan dalam video player 375 00:16:24,960 --> 00:16:27,200 umumnya adalah array yang lebih besar dari 16. 376 00:16:27,200 --> 00:16:30,340 Mungkin array ukuran satu megabyte, mungkin 10 megabyte, 377 00:16:30,340 --> 00:16:34,330 dan ke dalam array yang melakukan browser Anda men-download sejumlah byte, 378 00:16:34,330 --> 00:16:37,500 sejumlah megabyte video, dan pemutar video, 379 00:16:37,500 --> 00:16:40,930 YouTube atau siapa pun yang, dimulai membaca byte dari array, 380 00:16:40,930 --> 00:16:43,530 dan setiap kali Anda melihat kata buffering, buffering, 381 00:16:43,530 --> 00:16:46,350 yang berarti pemain memiliki sampai pada akhir array itu. 382 00:16:46,350 --> 00:16:50,430 Jaringan ini begitu lambat bahwa ia memiliki tidak diisi ulang array dengan lebih byte 383 00:16:50,430 --> 00:16:55,610 dan begitu Anda keluar dari bit untuk menampilkan kepada pengguna. 384 00:16:55,610 --> 00:16:59,430 >> Jadi penyangga adalah istilah yang tepat di sini di yang itu hanya sebuah array, sepotong memori. 385 00:16:59,430 --> 00:17:02,530 Dan ini akan memperbaikinya karena ternyata 386 00:17:02,530 --> 00:17:07,410 Anda dapat mengobati array seakan mereka alamat, meskipun penyangga 387 00:17:07,410 --> 00:17:10,710 hanya simbol, itu adalah urutan karakter, penyangga, 388 00:17:10,710 --> 00:17:14,760 itu berguna bagi saya, programmer, Anda dapat melewati nama sekitar 389 00:17:14,760 --> 00:17:17,079 seolah-olah itu adalah pointer, seolah-olah itu 390 00:17:17,079 --> 00:17:21,000 adalah alamat sepotong memori untuk 16 karakter. 391 00:17:21,000 --> 00:17:24,530 Jadi itu mengatakan, saya bisa lulus scanf kata yang tepat 392 00:17:24,530 --> 00:17:30,670 dan jadi sekarang, jika saya membuat program ini, membuat scanf 2, dot slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 dan ketik halo dunia, Masukkan, time-- yang 394 00:17:35,386 --> 00:17:37,590 >> Hmm, apa yang terjadi? 395 00:17:37,590 --> 00:17:39,340 String silakan. 396 00:17:39,340 --> 00:17:41,430 Apa kesalahan yang telah aku perbuat? 397 00:17:41,430 --> 00:17:43,800 Halo dunia, penyangga. 398 00:17:43,800 --> 00:17:44,705 Halo Dunia. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, aku tahu apa yang dilakukannya. 401 00:17:49,420 --> 00:17:49,920 OKE. 402 00:17:49,920 --> 00:17:51,628 Jadi itu membaca sampai ruang pertama. 403 00:17:51,628 --> 00:17:55,680 Jadi mari kita menipu untuk sesaat dan mengatakan saya hanya ingin mengetik sesuatu 404 00:17:55,680 --> 00:18:01,408 sangat panjang seperti ini adalah kalimat yang panjang itu salah satu, dua, tiga, empat, lima, 405 00:18:01,408 --> 00:18:04,420 enam, tujuh, delapan, sembilan, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 OKE. 407 00:18:05,300 --> 00:18:07,600 Sungguh suatu kalimat panjang. 408 00:18:07,600 --> 00:18:10,710 Jadi kalimat ini lebih panjang dari 16 karakter 409 00:18:10,710 --> 00:18:13,670 dan jadi ketika saya tekan Enter, apa yang akan terjadi? 410 00:18:13,670 --> 00:18:16,940 Nah, dalam hal ini dari cerita, saya telah menyatakan penyangga 411 00:18:16,940 --> 00:18:22,190 untuk benar-benar menjadi sebuah array dengan 16 karakter siap untuk pergi. 412 00:18:22,190 --> 00:18:27,426 Jadi satu, dua, tiga, empat, lima, enam, tujuh, delapan, sembilan, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Jadi 16 karakter, dan sekarang, ketika saya membaca sesuatu seperti ini adalah panjang 415 00:18:34,410 --> 00:18:43,950 kalimat, apa yang akan terjadi adalah bahwa aku akan membaca dalam hal ini adalah panjang 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, kalimat. 417 00:18:49,660 --> 00:18:52,270 >> Jadi ini sengaja hal yang buruk yang saya 418 00:18:52,270 --> 00:18:55,060 terus menulis di luar batas-batas array saya, 419 00:18:55,060 --> 00:18:56,660 melampaui batas-batas buffer saya. 420 00:18:56,660 --> 00:19:00,100 Aku bisa beruntung dan program akan terus berjalan dan tidak peduli, 421 00:19:00,100 --> 00:19:03,450 tapi secara umum, ini memang akan crash program saya, 422 00:19:03,450 --> 00:19:06,440 dan itu adalah bug di saya kode saat aku melangkah 423 00:19:06,440 --> 00:19:08,576 melampaui batas-batas array itu, karena saya 424 00:19:08,576 --> 00:19:10,450 tidak tahu apakah itu tentu akan crash 425 00:19:10,450 --> 00:19:12,120 atau jika aku hanya akan beruntung. 426 00:19:12,120 --> 00:19:15,750 Jadi ini bermasalah karena dalam kasus ini, itu tampaknya untuk bekerja 427 00:19:15,750 --> 00:19:20,931 dan mari kita mencobai nasib di sini, meskipun IDE tampaknya mentolerir sedikit 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Di sana kami pergi. 430 00:19:22,040 --> 00:19:23,240 Akhirnya. 431 00:19:23,240 --> 00:19:26,470 Jadi aku satu-satunya yang dapat melihat ini. 432 00:19:26,470 --> 00:19:29,630 Jadi aku hanya memiliki banyak menyenangkan mengetik sebuah frase yang sebenarnya sangat panjang 433 00:19:29,630 --> 00:19:32,800 bahwa itu pasti melebihi 16 byte, karena saya 434 00:19:32,800 --> 00:19:38,050 mengetik panjang multi-line ini gila frase, dan kemudian melihat apa yang terjadi. 435 00:19:38,050 --> 00:19:41,110 Program ini mencoba mencetaknya dan kemudian mendapat kesalahan segmentasi 436 00:19:41,110 --> 00:19:44,430 dan kesalahan segmentasi adalah ketika sesuatu seperti ini terjadi 437 00:19:44,430 --> 00:19:47,650 dan sistem operasi mengatakan tidak ada, tidak bisa menyentuh memori itu. 438 00:19:47,650 --> 00:19:49,570 Kita akan membunuh program sama sekali. 439 00:19:49,570 --> 00:19:51,180 >> Jadi ini tampaknya bermasalah. 440 00:19:51,180 --> 00:19:54,540 Aku telah menyempurnakan program dimana setidaknya memiliki beberapa memori, 441 00:19:54,540 --> 00:19:58,000 tapi ini tampaknya akan membatasi fungsi GetString untuk mendapatkan 442 00:19:58,000 --> 00:20:00,780 string dari beberapa panjang hingga 16. 443 00:20:00,780 --> 00:20:04,200 Jadi jika Anda ingin mendukung lagi kalimat dari 16 karakter, 444 00:20:04,200 --> 00:20:04,880 Apa yang kamu kerjakan? 445 00:20:04,880 --> 00:20:07,970 Nah, Anda dapat meningkatkan ukuran buffer ini untuk 32 446 00:20:07,970 --> 00:20:09,190 atau yang tampaknya agak pendek. 447 00:20:09,190 --> 00:20:12,260 Mengapa kita tidak hanya membuat itu 1.000 tetapi mendorong kembali. 448 00:20:12,260 --> 00:20:17,100 Apa respon intuitif dari hanya menghindari masalah ini dengan membuat 449 00:20:17,100 --> 00:20:20,660 penyangga saya lebih besar, seperti 1.000 karakter? 450 00:20:20,660 --> 00:20:23,470 Dengan menerapkan GetString cara ini. 451 00:20:23,470 --> 00:20:27,130 Apa yang baik atau buruk di sini? 452 00:20:27,130 --> 00:20:28,033 Ya? 453 00:20:28,033 --> 00:20:30,574 AUDIENCE: Jika Anda mengikat banyak ruang dan Anda tidak menggunakannya, 454 00:20:30,574 --> 00:20:33,500 maka Anda tidak dapat mengalokasikan ruang itu. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Absolutely. 456 00:20:34,500 --> 00:20:38,480 Ini boros sepanjang jika Anda tidak benar-benar membutuhkan 900 orang byte 457 00:20:38,480 --> 00:20:41,057 namun Anda meminta 1000 total pula, 458 00:20:41,057 --> 00:20:44,140 Anda hanya mengkonsumsi lebih banyak memori pada komputer pengguna dari yang Anda butuhkan untuk, 459 00:20:44,140 --> 00:20:45,740 dan setelah semua, beberapa Anda sudah ditemui 460 00:20:45,740 --> 00:20:47,620 dalam hidup ketika Anda menjalankan banyak program 461 00:20:47,620 --> 00:20:50,470 dan mereka makan sampai banyak memori, ini benar-benar dapat mempengaruhi kinerja 462 00:20:50,470 --> 00:20:52,220 dan pengalaman pengguna di komputer. 463 00:20:52,220 --> 00:20:56,090 Jadi itu semacam solusi malas, pasti, dan sebaliknya, 464 00:20:56,090 --> 00:21:00,140 itu tidak hanya boros, masalah apa masih tetap, bahkan jika saya membuat penyangga saya 465 00:21:00,140 --> 00:21:02,100 1.000? 466 00:21:02,100 --> 00:21:02,600 Ya? 467 00:21:02,600 --> 00:21:04,475 >> AUDIENCE: string adalah panjang 1.001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Tepat. 469 00:21:05,350 --> 00:21:08,280 Jika string Anda adalah panjang 1001, Anda memiliki masalah yang sama, 470 00:21:08,280 --> 00:21:10,705 dan oleh argumen saya, saya akan hanya kemudian membuatnya tahun 2000, 471 00:21:10,705 --> 00:21:12,830 tetapi Anda tidak tahu di memajukan seberapa besar itu harus, 472 00:21:12,830 --> 00:21:16,890 namun, saya harus mengkompilasi program saya sebelum membiarkan orang menggunakan dan men-download 473 00:21:16,890 --> 00:21:17,390 saya t. 474 00:21:17,390 --> 00:21:21,490 Jadi ini adalah persis jenis hal-hal yang perpustakaan mencoba CS50 475 00:21:21,490 --> 00:21:24,750 untuk membantu kami dengan dan kami akan hanya sekilas di beberapa implementasi yang mendasari 476 00:21:24,750 --> 00:21:29,790 di sini, tapi ini adalah CS50 dot C. Ini adalah file yang sudah di CS50 IDE 477 00:21:29,790 --> 00:21:31,420 semua minggu ini bahwa Anda telah menggunakan. 478 00:21:31,420 --> 00:21:34,280 Ini pra-disusun dan Anda sudah telah menggunakan secara otomatis 479 00:21:34,280 --> 00:21:38,780 oleh sifat memiliki lari L CS50 bendera dengan dentang, 480 00:21:38,780 --> 00:21:42,300 tapi jika saya gulir ke bawah melalui semua fungsi-fungsi ini, inilah GetString, 481 00:21:42,300 --> 00:21:44,636 dan hanya untuk memberi Anda rasa apa yang terjadi, 482 00:21:44,636 --> 00:21:46,760 mari kita cepat melihat kompleksitas relatif. 483 00:21:46,760 --> 00:21:48,870 Ini bukan super panjang fungsi, tapi kami tidak 484 00:21:48,870 --> 00:21:52,530 harus berpikir keras tentang semua bagaimana cara mendapatkan string. 485 00:21:52,530 --> 00:21:55,660 >> Jadi, inilah penyangga saya dan saya rupanya menginisialisasi ke null. 486 00:21:55,660 --> 00:21:57,990 Ini, tentu saja, adalah hal yang sama seperti bintang char, 487 00:21:57,990 --> 00:22:00,585 tapi aku memutuskan di menerapkan perpustakaan CS50 488 00:22:00,585 --> 00:22:02,460 bahwa jika kita akan benar-benar dinamis, 489 00:22:02,460 --> 00:22:05,770 Saya tidak tahu sebelumnya seberapa besar dari pengguna string yang akan ingin mendapatkan. 490 00:22:05,770 --> 00:22:08,140 Jadi aku akan mulai hanya dengan string kosong 491 00:22:08,140 --> 00:22:11,507 dan aku akan membangun sebanyak memori yang saya butuhkan untuk menyesuaikan string pengguna 492 00:22:11,507 --> 00:22:13,340 dan jika saya tidak memiliki cukup, aku akan meminta 493 00:22:13,340 --> 00:22:15,010 sistem operasi untuk lebih banyak memori. 494 00:22:15,010 --> 00:22:17,510 Aku akan memindahkan tali mereka ke dalam bongkahan besar memori 495 00:22:17,510 --> 00:22:21,847 dan aku akan melepaskan atau membebaskan potongan kurang besar memori 496 00:22:21,847 --> 00:22:23,680 dan kami hanya akan untuk melakukan hal ini iteratif. 497 00:22:23,680 --> 00:22:25,570 >> Jadi sekilas, di sini hanya variabel 498 00:22:25,570 --> 00:22:28,780 dengan yang aku akan melacak dari kapasitas buffer saya. 499 00:22:28,780 --> 00:22:30,071 Berapa banyak byte saya bisa cocok? 500 00:22:30,071 --> 00:22:32,070 Berikut adalah n variabel dengan yang aku akan terus 501 00:22:32,070 --> 00:22:36,200 melacak berapa banyak byte yang sebenarnya di buffer atau bahwa pengguna telah diketik. 502 00:22:36,200 --> 00:22:39,900 Jika Anda sudah tidak melihat ini sebelumnya, Anda dapat menentukan bahwa variabel seperti int 503 00:22:39,900 --> 00:22:46,370 adalah unsigned, yang seperti namanya, berarti itu non-negatif, dan mengapa 504 00:22:46,370 --> 00:22:50,590 Saya pernah ingin mengganggu menspesifikasikan yang int bukan hanya int, 505 00:22:50,590 --> 00:22:52,540 tapi itu unsigned int? 506 00:22:52,540 --> 00:22:55,064 Ini adalah int non-negatif. 507 00:22:55,064 --> 00:22:56,355 Apa [tidak terdengar] berarti? 508 00:22:56,355 --> 00:22:58,910 >> AUDIENCE: Ini menggambarkan jumlah memori yang dapat [tidak terdengar]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Ya. 510 00:22:59,660 --> 00:23:03,710 Jadi jika saya mengatakan unsigned, ini sebenarnya memberikan Anda satu bit memori tambahan 511 00:23:03,710 --> 00:23:07,440 dan tampaknya konyol, tetapi jika Anda memiliki satu bit memori tambahan, yang 512 00:23:07,440 --> 00:23:09,940 berarti Anda memiliki dua kali lebih banyak nilai yang Anda dapat mewakili, 513 00:23:09,940 --> 00:23:11,570 karena bisa menjadi 0 atau 1. 514 00:23:11,570 --> 00:23:14,660 Jadi secara default, int secara kasar dapat 2 miliar negatif sepanjang jalan 515 00:23:14,660 --> 00:23:16,030 hingga positif 2 miliar. 516 00:23:16,030 --> 00:23:18,540 Mereka adalah rentang besar, tetapi itu masih semacam boros 517 00:23:18,540 --> 00:23:21,280 jika Anda hanya peduli tentang ukuran, yang hanya secara intuitif 518 00:23:21,280 --> 00:23:24,620 harus non-negatif atau positif atau 0, baik maka, 519 00:23:24,620 --> 00:23:28,884 mengapa kau buang 2 miliar nilai yang mungkin untuk angka negatif 520 00:23:28,884 --> 00:23:30,300 jika Anda tidak akan menggunakannya? 521 00:23:30,300 --> 00:23:35,350 Jadi dengan mengatakan unsigned, sekarang saya bisa int antara 0 dan kira-kira 4 miliar. 522 00:23:35,350 --> 00:23:39,280 >> Jadi di sini hanya sebuah int C untuk alasan kita tidak akan masuk ke dalam sekarang sebagai 523 00:23:39,280 --> 00:23:42,280 mengapa itu int bukan char, tapi di sini adalah 524 00:23:42,280 --> 00:23:44,630 intisari dari apa yang terjadi pada, dan beberapa dari Anda 525 00:23:44,630 --> 00:23:48,340 mungkin menggunakan, misalnya, Fungsi fgetc bahkan di PSet empat 526 00:23:48,340 --> 00:23:51,580 atau setelahnya, kita akan melihatnya lagi di masalah set lima, 527 00:23:51,580 --> 00:23:55,410 fgetc bagus karena sebagai nama jenis, semacam arcanely menunjukkan, 528 00:23:55,410 --> 00:23:57,940 itu fungsi yang mendapat karakter dan sebagainya, 529 00:23:57,940 --> 00:24:00,690 apa fundamental berbeda tentang apa yang kita lakukan di GetString 530 00:24:00,690 --> 00:24:03,110 adalah kita tidak menggunakan scanf dengan cara yang sama. 531 00:24:03,110 --> 00:24:07,550 Kami hanya merayap di sepanjang langkah-demi-langkah lebih apa pun pengguna telah diketik di, 532 00:24:07,550 --> 00:24:10,970 karena kita selalu dapat mengalokasikan satu char, dan jadi kita bisa selalu aman 533 00:24:10,970 --> 00:24:15,599 melihat satu char pada satu waktu, dan keajaiban mulai terjadi di sini. 534 00:24:15,599 --> 00:24:17,890 Aku akan gulir ke bawah untuk tengah fungsi ini 535 00:24:17,890 --> 00:24:20,360 hanya untuk memperkenalkan fungsi ini secara singkat. 536 00:24:20,360 --> 00:24:22,670 Seperti ada Fungsi malloc, ada 537 00:24:22,670 --> 00:24:27,740 fungsi realloc mana realloc memungkinkan Anda mengalokasikan sepotong memori 538 00:24:27,740 --> 00:24:29,570 dan membuatnya lebih besar atau lebih kecil. 539 00:24:29,570 --> 00:24:33,060 Cerita begitu panjang pendek dan dengan gelombang tangan saya untuk hari ini, 540 00:24:33,060 --> 00:24:35,620 tahu bahwa apa yang GetString melakukan itu semacam 541 00:24:35,620 --> 00:24:39,720 dari ajaib tumbuh atau menyusut buffer sebagai pengguna 542 00:24:39,720 --> 00:24:41,440 jenis dalam nya tali. 543 00:24:41,440 --> 00:24:43,962 >> Jadi jika pengguna jenis tali pendek, kode ini 544 00:24:43,962 --> 00:24:45,920 hanya mengalokasikan cukup memori untuk menyesuaikan string. 545 00:24:45,920 --> 00:24:48,086 Jika pengguna terus mengetik seperti yang saya lakukan itu lagi dan lagi 546 00:24:48,086 --> 00:24:50,330 dan lagi, baik, jika buffer awalnya ini besar 547 00:24:50,330 --> 00:24:53,310 dan program menyadari, untuk tunggu sebentar, aku keluar dari ruang, 548 00:24:53,310 --> 00:24:55,410 itu akan dua kali lipat ukuran buffer 549 00:24:55,410 --> 00:24:59,110 dan kemudian dua kali lipat ukuran buffer dan kode yang melakukan penggandaan tersebut, 550 00:24:59,110 --> 00:25:03,170 jika kita melihat di sini, itu hanya ini pintar satu-kapal. 551 00:25:03,170 --> 00:25:06,830 Anda tidak mungkin telah melihat sintaks ini sebelumnya, tapi jika Anda mengatakan star sama, 552 00:25:06,830 --> 00:25:10,470 ini adalah hal yang sama seperti mengatakan kapasitas kali 2. 553 00:25:10,470 --> 00:25:13,390 Jadi itu hanya terus menggandakan kapasitas buffer 554 00:25:13,390 --> 00:25:17,480 dan kemudian memberitahu realloc untuk memberikan itu sendiri yang jauh lebih banyak memori. 555 00:25:17,480 --> 00:25:19,720 >> Sekarang, sebagai samping, ada fungsi lain di sini 556 00:25:19,720 --> 00:25:23,680 bahwa kita tidak akan melihat ke dalam setiap detail selain untuk menunjukkan di getInt, 557 00:25:23,680 --> 00:25:26,150 kita menggunakan GetString di getInt. 558 00:25:26,150 --> 00:25:28,192 Kami memeriksa bahwa itu bukan null, yang, ingat, 559 00:25:28,192 --> 00:25:30,400 adalah nilai khusus yang berarti ada yang tidak beres. 560 00:25:30,400 --> 00:25:31,233 Kami keluar dari memori. 561 00:25:31,233 --> 00:25:32,310 Lebih baik periksa untuk itu. 562 00:25:32,310 --> 00:25:33,710 Dan kita kembali nilai sentinel. 563 00:25:33,710 --> 00:25:37,850 Tapi aku akan tunduk kepada komentar untuk mengapa dan kemudian kita menggunakan saudara sepupu ini scanf 564 00:25:37,850 --> 00:25:42,100 disebut sscanf dan ternyata yang sscanf, atau tali scanf, 565 00:25:42,100 --> 00:25:45,310 memungkinkan Anda melihat pada garis yang pengguna telah diketik dalam dan membiarkan Anda 566 00:25:45,310 --> 00:25:49,610 menganalisis dasarnya dan apa yang saya lakukan di sini adalah saya memberitahu sscanf, 567 00:25:49,610 --> 00:25:54,440 menganalisis apa pengguna memiliki diketik dan pastikan% i, 568 00:25:54,440 --> 00:25:59,250 ada bilangan bulat di dalamnya, dan kami tidak akan masuk ke hari ini persis mengapa ada juga 569 00:25:59,250 --> 00:26:03,760 a% c sini, tapi itu singkatnya memungkinkan kita untuk mendeteksi jika pengguna telah diketik 570 00:26:03,760 --> 00:26:06,050 dalam sesuatu palsu setelah nomor. 571 00:26:06,050 --> 00:26:11,766 Jadi alasan bahwa getInt dan GetString memberitahu Anda untuk mencoba lagi, coba lagi, coba lagi 572 00:26:11,766 --> 00:26:13,640 adalah karena semua bahwa kode kita sudah ditulis, 573 00:26:13,640 --> 00:26:17,900 itu semacam melihat masukan pengguna dalam memastikan itu sepenuhnya numerik 574 00:26:17,900 --> 00:26:21,700 atau ini merupakan floating aktual nilai titik atau sejenisnya, 575 00:26:21,700 --> 00:26:24,233 tergantung pada apa nilai berfungsi Anda gunakan. 576 00:26:24,233 --> 00:26:25,060 >> Whew. 577 00:26:25,060 --> 00:26:25,710 OKE. 578 00:26:25,710 --> 00:26:27,592 Itu adalah seteguk tapi intinya di sini adalah 579 00:26:27,592 --> 00:26:29,550 bahwa alasan kami memiliki mereka roda pelatihan 580 00:26:29,550 --> 00:26:32,880 karena pada tingkat terendah, ada begitu banyak hal yang 581 00:26:32,880 --> 00:26:35,674 bisa salah bahwa kami ingin untuk menangani preemptively 582 00:26:35,674 --> 00:26:38,090 hal-hal pasti dalam minggu awal kelas, 583 00:26:38,090 --> 00:26:42,230 tapi sekarang dengan PSet empat dan lima PSet dan luar akan Anda melihat bahwa itu lebih kepada 584 00:26:42,230 --> 00:26:45,570 Anda tetapi juga Anda lebih mampu pemecahan yang macam masalah 585 00:26:45,570 --> 00:26:47,180 sendiri. 586 00:26:47,180 --> 00:26:51,770 Pertanyaan GetString atau getInt? 587 00:26:51,770 --> 00:26:52,630 Ya? 588 00:26:52,630 --> 00:26:55,130 >> AUDIENCE: Mengapa Anda akan berlipat ganda kapasitas buffer 589 00:26:55,130 --> 00:26:57,630 bukan hanya meningkatkan dengan jumlah yang tepat? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Pertanyaan yang bagus. 591 00:26:58,100 --> 00:27:00,474 Mengapa kita akan menggandakan kapasitas buffer yang bertentangan 592 00:27:00,474 --> 00:27:02,800 hanya meningkatkan itu oleh beberapa nilai konstan? 593 00:27:02,800 --> 00:27:03,900 Itu adalah keputusan desain. 594 00:27:03,900 --> 00:27:08,590 Kami hanya memutuskan bahwa karena cenderung sedikit mahal waktu-bijaksana untuk meminta 595 00:27:08,590 --> 00:27:10,440 sistem operasi untuk memori, kami tidak 596 00:27:10,440 --> 00:27:13,210 ingin berakhir masuk ke situasi untuk string besar 597 00:27:13,210 --> 00:27:14,960 bahwa kami meminta OS lagi dan lagi 598 00:27:14,960 --> 00:27:17,500 dan lagi dan lagi di suksesi cepat untuk memori. 599 00:27:17,500 --> 00:27:20,387 Jadi kami hanya memutuskan, agak sewenang-wenang tapi kami berharap cukup, 600 00:27:20,387 --> 00:27:22,720 bahwa, Anda tahu apa, mari kita mencoba untuk maju dari diri kita sendiri 601 00:27:22,720 --> 00:27:25,520 dan terus menggandakan sehingga kami meminimalkan jumlah kali 602 00:27:25,520 --> 00:27:29,010 kita harus memanggil malloc atau realloc, tapi penilaian Total 603 00:27:29,010 --> 00:27:31,820 sebut dalam ketiadaan mengetahui apa yang pengguna mungkin ingin ketik. 604 00:27:31,820 --> 00:27:33,600 Kedua cara bisa diperdebatkan. 605 00:27:33,600 --> 00:27:35,430 Bisa dibilang baik. 606 00:27:35,430 --> 00:27:39,240 >> Jadi mari kita lihat beberapa efek samping lain dari memori, 607 00:27:39,240 --> 00:27:41,610 hal-hal yang bisa salah dan alat-alat yang dapat Anda 608 00:27:41,610 --> 00:27:43,880 gunakan untuk menangkap jenis-jenis kesalahan. 609 00:27:43,880 --> 00:27:47,800 Ternyata kalian semua, meskipun check50 tidak bilang banyak, 610 00:27:47,800 --> 00:27:50,050 telah menulis kereta Kode sejak pekan satu, 611 00:27:50,050 --> 00:27:53,630 bahkan jika semua tes yang check50 berlalu, dan bahkan jika Anda dan TF Anda 612 00:27:53,630 --> 00:27:56,010 super yakin bahwa kode Anda bekerja sebagaimana dimaksud. 613 00:27:56,010 --> 00:27:59,190 Kode Anda telah kereta atau cacat dalam bahwa semua Anda, 614 00:27:59,190 --> 00:28:02,540 dalam menggunakan perpustakaan CS50, telah bocor memori. 615 00:28:02,540 --> 00:28:06,040 Anda telah meminta sistem operasi untuk memori di sebagian besar program 616 00:28:06,040 --> 00:28:08,850 Anda sudah menulis, tapi kau pernah benar-benar diberikan kembali. 617 00:28:08,850 --> 00:28:12,110 Anda sudah disebut GetString dan getInt dan GetFloat, 618 00:28:12,110 --> 00:28:15,270 tetapi dengan GetString, Anda sudah tidak pernah disebut unGetString atau Berikan 619 00:28:15,270 --> 00:28:19,890 String Kembali atau sejenisnya, tapi kami telah melihat yang GetString tidak mengalokasikan memori 620 00:28:19,890 --> 00:28:22,810 dengan cara malloc atau ini fungsi realloc, yang hanya 621 00:28:22,810 --> 00:28:25,670 sangat mirip dalam roh, namun, kami sudah 622 00:28:25,670 --> 00:28:28,629 meminta sistem operasi untuk memori dan memori lagi dan lagi 623 00:28:28,629 --> 00:28:29,670 tetapi tidak pernah memberikan kembali. 624 00:28:29,670 --> 00:28:33,550 >> Sekarang, sebagai samping, ternyata ketika sebuah program berhenti, semua memori 625 00:28:33,550 --> 00:28:34,870 secara otomatis dibebaskan. 626 00:28:34,870 --> 00:28:36,150 Jadi itu tidak menjadi masalah besar. 627 00:28:36,150 --> 00:28:38,590 Itu tidak akan memecahkan IDE atau hal-hal memperlambat, 628 00:28:38,590 --> 00:28:40,670 tapi ketika program melakukan umumnya kebocoran memori 629 00:28:40,670 --> 00:28:42,170 dan mereka menjalankan untuk waktu yang lama. 630 00:28:42,170 --> 00:28:45,640 Jika Anda pernah melihat sedikit bodoh bola pantai di Mac OS atau jam pasir 631 00:28:45,640 --> 00:28:51,160 pada Windows mana itu jenis memperlambat atau berpikir atau berpikir 632 00:28:51,160 --> 00:28:53,770 atau hanya benar-benar dimulai untuk memperlambat merangkak, 633 00:28:53,770 --> 00:28:56,960 sangat mungkin bisa hasil dari kebocoran memori. 634 00:28:56,960 --> 00:28:59,970 Programmer yang menulis perangkat lunak yang Anda gunakan 635 00:28:59,970 --> 00:29:03,570 meminta sistem operasi untuk memori setiap beberapa menit, setiap jam. 636 00:29:03,570 --> 00:29:05,570 Tetapi jika Anda menjalankan software, bahkan jika itu 637 00:29:05,570 --> 00:29:08,680 diminimalkan di komputer Anda selama berjam-jam atau berhari-hari, 638 00:29:08,680 --> 00:29:11,980 Anda mungkin bertanya untuk lebih dan lebih memori dan tidak pernah benar-benar menggunakannya 639 00:29:11,980 --> 00:29:15,180 dan kode Anda mungkin, atau program mungkin bocor memori, 640 00:29:15,180 --> 00:29:18,350 dan jika Anda mulai bocor memori, ada sedikit memori untuk program lain, 641 00:29:18,350 --> 00:29:21,220 dan efeknya adalah untuk memperlambat semuanya. 642 00:29:21,220 --> 00:29:23,600 >> Sekarang, ini adalah jauh salah satu program yang paling mengerikan 643 00:29:23,600 --> 00:29:26,350 Anda akan memiliki kesempatan berjalan di sepanjang CS50 644 00:29:26,350 --> 00:29:31,650 sebagai output bahkan lebih esoteris dari dentang atau membuat atau apapun perintah 645 00:29:31,650 --> 00:29:35,930 program baris kami sudah dijalankan sebelum tapi untungnya, tertanam dalam output 646 00:29:35,930 --> 00:29:39,810 adalah beberapa tips yang super membantu akan berguna baik untuk PSet empat 647 00:29:39,810 --> 00:29:41,510 atau pasti PSet lima. 648 00:29:41,510 --> 00:29:44,250 Jadi valgrind adalah alat yang dapat digunakan untuk melihat 649 00:29:44,250 --> 00:29:46,930 kebocoran memori dalam program Anda. 650 00:29:46,930 --> 00:29:48,570 Ini relatif sederhana untuk menjalankan. 651 00:29:48,570 --> 00:29:51,420 Anda menjalankan valgrind dan kemudian, bahkan meskipun itu adalah verbose sedikit, 652 00:29:51,420 --> 00:29:54,440 dasbor dasbor kebocoran cek sama penuh, dan kemudian dot 653 00:29:54,440 --> 00:29:56,320 tebang dan nama program Anda. 654 00:29:56,320 --> 00:30:00,010 Jadi valgrind kemudian akan menjalankan program Anda dan di akhir program Anda 655 00:30:00,010 --> 00:30:02,240 berjalan sebelum berhenti dan memberi Anda cepat lain, 656 00:30:02,240 --> 00:30:04,980 itu akan menganalisis Anda Program sementara itu sudah berjalan 657 00:30:04,980 --> 00:30:07,740 dan memberitahu Anda apakah Anda bocor setiap memori dan lebih baik lagi, 658 00:30:07,740 --> 00:30:10,610 apakah Anda menyentuh memori yang bukan milik Anda? 659 00:30:10,610 --> 00:30:13,700 Hal ini tidak bisa menangkap semuanya, tapi itu cukup baik menangkap banyak hal. 660 00:30:13,700 --> 00:30:19,700 >> Jadi, inilah contoh saya memiliki run program ini, memiliki jangka valgrind, 661 00:30:19,700 --> 00:30:21,470 pada program yang disebut memori, dan aku akan 662 00:30:21,470 --> 00:30:24,730 untuk menyoroti garis yang akhirnya menarik bagi kami. 663 00:30:24,730 --> 00:30:27,690 Jadi ada bahkan lebih gangguan bahwa saya telah dihapus dari slide. 664 00:30:27,690 --> 00:30:30,930 Tapi mari kita lihat apa ini Program ini mampu memberitahu kita. 665 00:30:30,930 --> 00:30:34,800 Ini mampu menceritakan hal-hal seperti menulis valid ukuran 4. 666 00:30:34,800 --> 00:30:38,020 Dengan kata lain, jika Anda menyentuh memori, khusus 4 byte memori 667 00:30:38,020 --> 00:30:40,350 bahwa Anda tidak harus memiliki, valgrind dapat memberitahu Anda bahwa. 668 00:30:40,350 --> 00:30:41,660 Menulis tidak valid ukuran 4. 669 00:30:41,660 --> 00:30:43,640 Anda menyentuh empat byte bahwa Anda tidak harus memiliki. 670 00:30:43,640 --> 00:30:44,840 Di mana Anda melakukan itu? 671 00:30:44,840 --> 00:30:45,900 Ini adalah keindahan. 672 00:30:45,900 --> 00:30:50,000 Memori dot c line 21 adalah di mana Anda kacau dan itulah mengapa itu membantu. 673 00:30:50,000 --> 00:30:53,410 Banyak seperti GDB itu, dapat membantu mengarahkan Anda pada kesalahan yang sebenarnya. 674 00:30:53,410 --> 00:30:57,170 >> Sekarang, yang satu ini lebih sedikit verbose, jika tidak membingungkan. 675 00:30:57,170 --> 00:31:01,307 40 byte dalam 1 blok pasti hilang dalam catatan hilangnya 1 dari 1. 676 00:31:01,307 --> 00:31:02,140 Maksudnya itu apa? 677 00:31:02,140 --> 00:31:05,920 Nah, itu hanya berarti Anda meminta 40 byte dan Anda tidak pernah memberikannya kembali. 678 00:31:05,920 --> 00:31:08,930 Anda disebut malloc atau Anda disebut GetString dan sistem operasi 679 00:31:08,930 --> 00:31:12,450 memberi Anda 40 bytes, tapi Anda tidak pernah dibebaskan atau dilepaskan bahwa memori, 680 00:31:12,450 --> 00:31:15,400 dan untuk menjadi adil, kita tidak pernah menunjukkan Anda bagaimana untuk memberikan kembali memori. 681 00:31:15,400 --> 00:31:17,910 Ternyata ada super fungsi sederhana yang disebut bebas. 682 00:31:17,910 --> 00:31:21,170 Mengambil satu argumen, hal yang Anda ingin membebaskan atau memberikan kembali, 683 00:31:21,170 --> 00:31:23,430 tapi 40 byte, tampaknya, dalam program ini 684 00:31:23,430 --> 00:31:27,300 telah hilang pada baris 20 memori dot c. 685 00:31:27,300 --> 00:31:28,650 >> Jadi mari kita lihat program ini. 686 00:31:28,650 --> 00:31:31,020 Ini super berguna. 687 00:31:31,020 --> 00:31:33,980 Ini hanya menunjukkan kesalahan tertentu. 688 00:31:33,980 --> 00:31:34,920 Jadi mari kita lihat. 689 00:31:34,920 --> 00:31:39,920 Berikut adalah utama dan utama, pemberitahuan, panggilan fungsi disebut f dan kemudian kembali. 690 00:31:39,920 --> 00:31:41,550 Jadi tidak semua yang menarik. 691 00:31:41,550 --> 00:31:42,664 Apa f lakukan? 692 00:31:42,664 --> 00:31:44,330 Perhatikan Aku tidak repot-repot dengan prototipe. 693 00:31:44,330 --> 00:31:46,520 Saya ingin menjaga kode seminimal mungkin. 694 00:31:46,520 --> 00:31:49,530 Jadi saya menempatkan f diatas utama dan itu bagus, tentu, 695 00:31:49,530 --> 00:31:51,500 untuk program singkat seperti ini. 696 00:31:51,500 --> 00:31:56,910 Jadi f tidak kembali apa-apa dan tidak tidak mengambil apa-apa, tetapi tidak melakukan hal ini. 697 00:31:56,910 --> 00:31:59,620 Ini menyatakan, seperti dalam contoh Binky, 698 00:31:59,620 --> 00:32:02,682 pointer disebut x yang akan untuk menyimpan alamat int. 699 00:32:02,682 --> 00:32:03,890 Jadi itulah sisi kiri. 700 00:32:03,890 --> 00:32:07,230 Dalam bahasa Inggris, apa sisi melakukan kanan? 701 00:32:07,230 --> 00:32:09,770 Siapapun? 702 00:32:09,770 --> 00:32:13,665 Apa ini lakukan untuk kita? 703 00:32:13,665 --> 00:32:14,651 Ya? 704 00:32:14,651 --> 00:32:16,623 >> AUDIENCE: [tidak terdengar] kali ukuran sebuah int 705 00:32:16,623 --> 00:32:19,175 yang merupakan 10 kali [tidak terdengar] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Baik dan biarkan saya meringkas. 707 00:32:20,800 --> 00:32:25,480 Jadi mengalokasikan cukup ruang untuk 10 bilangan bulat atau 10, apa ukuran int, 708 00:32:25,480 --> 00:32:29,340 itu empat byte, jadi 10 kali 4 adalah 40, sehingga sisi kanan bahwa saya telah 709 00:32:29,340 --> 00:32:33,930 disorot adalah memberi saya 40 byte dan menyimpan alamat dari byte pertama 710 00:32:33,930 --> 00:32:34,940 ke x. 711 00:32:34,940 --> 00:32:38,380 Dan sekarang terakhir, dan di sinilah program ini adalah kereta, apa 712 00:32:38,380 --> 00:32:41,540 salah dengan line 21 berdasarkan logika itu? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Apa yang salah dengan line 21? 715 00:32:46,280 --> 00:32:46,780 Ya? 716 00:32:46,780 --> 00:32:49,550 AUDIENCE: Anda tidak bisa indeks ke x [tidak terdengar]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Ya. 718 00:32:50,300 --> 00:32:52,270 Saya tidak harus indeks ke x seperti itu. 719 00:32:52,270 --> 00:32:53,850 Jadi sintaksis, itu OK. 720 00:32:53,850 --> 00:32:56,990 Apa yang baik adalah, seperti Anda dapat mengobati nama array 721 00:32:56,990 --> 00:33:01,080 seolah itu pointer, sama dapat Anda memperlakukan pointer seolah itu 722 00:33:01,080 --> 00:33:06,425 array, dan jadi saya bisa sintaksis mengatakan x braket sesuatu, x braket i, 723 00:33:06,425 --> 00:33:07,800 tapi 10 bermasalah. 724 00:33:07,800 --> 00:33:09,096 Mengapa? 725 00:33:09,096 --> 00:33:10,910 >> AUDIENCE: Karena itu tidak di dalam. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: Ini tidak dalam yang sepotong memori. 727 00:33:12,390 --> 00:33:15,306 Apa nilai terbesar saya harus menempatkan pada mereka kurung? 728 00:33:15,306 --> 00:33:16,870 9, 0 sampai 9. 729 00:33:16,870 --> 00:33:18,160 Karena nol pengindeksan. 730 00:33:18,160 --> 00:33:20,190 Jadi 0 sampai 9 akan baik-baik saja. 731 00:33:20,190 --> 00:33:23,960 Bracket 10 tidak baik dan tapi, ingat meskipun, setiap kali 732 00:33:23,960 --> 00:33:27,017 Saya tampaknya mencoba untuk membuat CS50 IDE kecelakaan dengan mengetikkan nilai palsu, 733 00:33:27,017 --> 00:33:29,100 itu tidak selalu bekerja sama, dan memang, Anda sering 734 00:33:29,100 --> 00:33:31,460 beruntung hanya karena sistem operasi tidak 735 00:33:31,460 --> 00:33:35,467 melihat bahwa Anda pernah jadi sedikit melewati beberapa sepotong memori, 736 00:33:35,467 --> 00:33:38,300 karena Anda tinggal dalam teknis segmen Anda, tetapi lebih pada 737 00:33:38,300 --> 00:33:40,940 di kelas sistem operasi, dan jadi sesuatu seperti ini 738 00:33:40,940 --> 00:33:43,000 bisa sangat mudah terdeteksi. 739 00:33:43,000 --> 00:33:48,120 Program Anda tidak akan pernah kecelakaan konsisten tapi mungkin sesekali. 740 00:33:48,120 --> 00:33:50,610 >> Dan mari kita coba valgrind ini, dan inilah 741 00:33:50,610 --> 00:33:52,870 di mana kita akan mendapatkan kewalahan oleh output sesaat. 742 00:33:52,870 --> 00:34:00,810 Sehingga membuat memori valgrind kebocoran cek sama penuh memori dot slash. 743 00:34:00,810 --> 00:34:03,040 Dan inilah mengapa saya berjanji ini akan membanjiri. 744 00:34:03,040 --> 00:34:05,700 Inilah yang valgrind, inilah yang programmer, beberapa tahun yang lalu- 745 00:34:05,700 --> 00:34:08,469 memutuskan itu akan menjadi ide yang baik untuk output terlihat seperti. 746 00:34:08,469 --> 00:34:09,750 Jadi mari kita memahami ini. 747 00:34:09,750 --> 00:34:13,120 Jadi semua jalan di kiri sisi tanpa alasan 748 00:34:13,120 --> 00:34:16,620 adalah proses ID dari program kita hanya menjalankan, pengenal unik 749 00:34:16,620 --> 00:34:18,030 untuk program kami hanya berlari. 750 00:34:18,030 --> 00:34:19,738 Kami dihapus bahwa dari slide, tetapi ada 751 00:34:19,738 --> 00:34:22,190 adalah beberapa informasi yang berguna di sini. 752 00:34:22,190 --> 00:34:24,684 >> Mari kita gulir ke atas ke bagian paling atas. 753 00:34:24,684 --> 00:34:25,600 Di sinilah kita mulai. 754 00:34:25,600 --> 00:34:27,040 Sehingga tidak semua yang banyak output. 755 00:34:27,040 --> 00:34:30,429 Berikut yang menulis valid ukuran 4 on line 21. 756 00:34:30,429 --> 00:34:31,760 Nah, apa line 21? 757 00:34:31,760 --> 00:34:34,500 Line 21 adalah persis ini dan itu masuk akal 758 00:34:34,500 --> 00:34:37,290 bahwa aku di sah menulis 4 byte karena aku 759 00:34:37,290 --> 00:34:40,389 mencoba untuk menempatkan bilangan bulat ini, yang bisa apa saja, 760 00:34:40,389 --> 00:34:42,370 itu hanya kebetulan nol, tapi aku berusaha 761 00:34:42,370 --> 00:34:44,940 untuk meletakkannya di lokasi yang bukan milik saya. 762 00:34:44,940 --> 00:34:50,900 Selain itu, di sini, 40 byte dalam satu blok pasti hilang dalam catatan 1. 763 00:34:50,900 --> 00:34:56,500 Itu karena ketika saya sebut malloc di sini, saya pernah benar-benar membebaskan memori. 764 00:34:56,500 --> 00:34:58,140 >> Jadi bagaimana kita bisa memperbaiki ini? 765 00:34:58,140 --> 00:35:02,970 Biarkan aku pergi ke depan dan menjadi sedikit lebih aman dan melakukan 9 di sana dan biarkan aku di sini gratis x. 766 00:35:02,970 --> 00:35:04,820 Ini adalah fungsi baru untuk hari ini. 767 00:35:04,820 --> 00:35:11,520 Jika saya sekarang jalankan kembali membuat memori dot slash, mari kita jalankan valgrind di atasnya lagi, 768 00:35:11,520 --> 00:35:14,990 memaksimalkan jendela dan tekan Enter. 769 00:35:14,990 --> 00:35:16,900 Sekarang, itu baik. 770 00:35:16,900 --> 00:35:19,590 Mereka mengubur kabar baik di semua output ini. 771 00:35:19,590 --> 00:35:20,810 Semua blok tumpukan bebas. 772 00:35:20,810 --> 00:35:23,604 Kami akan kembali ke apa heap , tapi tidak ada kebocoran yang mungkin. 773 00:35:23,604 --> 00:35:25,520 Jadi ini hanyalah alat untuk tool kit Anda 774 00:35:25,520 --> 00:35:30,220 dengan mana Anda dapat mulai untuk menemukan sekarang kesalahan seperti itu. 775 00:35:30,220 --> 00:35:34,532 >> Tapi mari kita lihat apa lebih bisa salah di sini. 776 00:35:34,532 --> 00:35:38,890 Mari transisi sekarang untuk benar-benar memecahkan masalah. 777 00:35:38,890 --> 00:35:42,440 Sebagai samping, apakah ini akan meredakan sedikit kebingungan atau ketegangan, 778 00:35:42,440 --> 00:35:43,430 ini sekarang lucu. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Ya. 781 00:35:46,900 --> 00:35:49,040 Itu cukup bagus. 782 00:35:49,040 --> 00:35:50,890 Karena pointer alamat dan alamat 783 00:35:50,890 --> 00:35:53,098 umumnya dengan konvensi ditulis dengan heksadesimal. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, ini lucu sekarang. 785 00:35:54,650 --> 00:35:58,390 Bagaimanapun, jadi mari kita sekarang benar-benar memecahkan masalah. 786 00:35:58,390 --> 00:36:00,840 Ini telah super, Super tingkat rendah sejauh ini, 787 00:36:00,840 --> 00:36:03,950 dan kita benar-benar bisa melakukan berguna hal dengan rincian tingkat rendah ini. 788 00:36:03,950 --> 00:36:06,710 >> Jadi kami memperkenalkan beberapa minggu lalu gagasan array. 789 00:36:06,710 --> 00:36:09,177 Array bagus karena sulit untuk membersihkan kode kita 790 00:36:09,177 --> 00:36:11,760 karena jika kita ingin menulis Program dengan beberapa siswa 791 00:36:11,760 --> 00:36:15,270 atau beberapa nama dan rumah dan asrama dan perguruan tinggi dan semua itu, 792 00:36:15,270 --> 00:36:19,430 kita bisa menyimpan segala sesuatu lebih bersih dalam array. 793 00:36:19,430 --> 00:36:23,039 Tapi mengusulkan satu kelemahan array sejauh ini. 794 00:36:23,039 --> 00:36:26,080 Bahkan jika Anda sudah tidak mengalami sendiri dalam sebuah program, hanya naluriah, 795 00:36:26,080 --> 00:36:30,870 apa adalah hal yang buruk tentang array, mungkin? 796 00:36:30,870 --> 00:36:32,337 Saya mendengar beberapa murmur. 797 00:36:32,337 --> 00:36:34,170 AUDIENCE: Sulit untuk mengubah ukuran. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Sulit untuk mengubah ukuran. 799 00:36:36,128 --> 00:36:38,660 Anda tidak dapat mengubah ukuran array, pada kenyataannya, per se 800 00:36:38,660 --> 00:36:43,040 di C. Anda dapat mengalokasikan array lain, memindahkan segala sesuatu dari yang lama 801 00:36:43,040 --> 00:36:45,380 ke dalam baru, dan sekarang memiliki beberapa ruang tambahan, 802 00:36:45,380 --> 00:36:47,469 tapi itu tidak seperti bahasa seperti Java atau Python 803 00:36:47,469 --> 00:36:49,760 atau sejumlah lainnya bahasa dengan yang sebagian dari Anda 804 00:36:49,760 --> 00:36:52,070 mungkin akrab di mana Anda hanya bisa terus menambahkan hal-hal 805 00:36:52,070 --> 00:36:53,930 memuakkan ke akhir array. 806 00:36:53,930 --> 00:36:57,880 Bila Anda memiliki sebuah array ukuran 6, yaitu ukurannya, 807 00:36:57,880 --> 00:37:01,970 dan begitu banyak seperti ide awal memiliki buffer dengan ukuran tertentu, 808 00:37:01,970 --> 00:37:05,940 Anda harus menebak keluar dari gerbang apa ukuran yang Anda inginkan? 809 00:37:05,940 --> 00:37:07,880 Jika Anda menebak terlalu besar, Anda membuang-buang ruang. 810 00:37:07,880 --> 00:37:10,950 Jika Anda menebak terlalu kecil, Anda tidak bisa menyimpan data itu, setidaknya 811 00:37:10,950 --> 00:37:12,940 tanpa banyak pekerjaan lebih. 812 00:37:12,940 --> 00:37:18,180 >> Jadi hari ini, berkat pointer, kita bisa mulai menjahit kustom kita sendiri 813 00:37:18,180 --> 00:37:20,989 struktur data, dan di Bahkan, di sini adalah sesuatu 814 00:37:20,989 --> 00:37:23,030 yang terlihat sedikit lebih samar pada pandangan pertama, 815 00:37:23,030 --> 00:37:26,440 tapi ini adalah apa yang akan kita sebut terkait daftar, dan jenis namanya merangkum 816 00:37:26,440 --> 00:37:26,940 saya t. 817 00:37:26,940 --> 00:37:29,550 Ini daftar nomor, atau di kasus ini, daftar nomor, 818 00:37:29,550 --> 00:37:33,480 tapi bisa daftar apa-apa, tapi itu dihubungkan bersama dengan cara panah, 819 00:37:33,480 --> 00:37:36,380 dan hanya mengambil menebak dengan teknik apa 820 00:37:36,380 --> 00:37:38,310 kita akan dapat untuk menjahit bersama, 821 00:37:38,310 --> 00:37:42,540 semacam seperti popcorn dengan benang, sebuah linked list persegi panjang di sini? 822 00:37:42,540 --> 00:37:43,936 Jumlahnya? 823 00:37:43,936 --> 00:37:45,560 Apa fitur bahasa yang mendasari? 824 00:37:45,560 --> 00:37:46,350 >> AUDIENCE: Sebuah pointer. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Sebuah pointer. 826 00:37:47,308 --> 00:37:51,700 Jadi setiap anak panah ini di sini mewakili pointer atau hanya alamat. 827 00:37:51,700 --> 00:37:54,590 Jadi dengan kata lain, jika saya ingin untuk menyimpan daftar nomor, 828 00:37:54,590 --> 00:37:59,040 Aku tidak bisa hanya menyimpannya jika saya ingin kemampuan untuk tumbuh dan menyusut 829 00:37:59,040 --> 00:38:00,990 struktur data saya dalam array. 830 00:38:00,990 --> 00:38:03,000 Jadi saya harus memiliki sedikit lebih kecanggihan, 831 00:38:03,000 --> 00:38:05,720 tapi melihat bahwa ini gambar jenis menyarankan 832 00:38:05,720 --> 00:38:08,650 bahwa jika Anda baru saja benang sedikit menghubungkan segala sesuatu bersama-sama, 833 00:38:08,650 --> 00:38:13,100 mungkin tidak sulit untuk membuat ruang di antara dua dari mereka persegi panjang 834 00:38:13,100 --> 00:38:16,750 atau dua dari mereka node, seperti yang kita akan mulai memanggil mereka, dimasukkan ke dalam simpul baru, 835 00:38:16,750 --> 00:38:19,547 dan kemudian dengan beberapa thread baru, hanya parit tiga node bersama-sama, 836 00:38:19,547 --> 00:38:22,880 yang pertama, yang terakhir, dan satu bahwa Anda hanya dimasukkan ke tengah. 837 00:38:22,880 --> 00:38:26,000 >> Dan memang sebuah linked list, tidak seperti array, bersifat dinamis. 838 00:38:26,000 --> 00:38:27,840 Hal ini dapat tumbuh dan itu bisa menyusut dan Anda tidak 839 00:38:27,840 --> 00:38:32,434 harus tahu atau peduli terlebih dahulu bagaimana banyak data Anda akan menyimpan, 840 00:38:32,434 --> 00:38:35,600 tapi ternyata kami harus sedikit hati-hati tentang bagaimana melaksanakan ini. 841 00:38:35,600 --> 00:38:39,070 Jadi pertama mari kita mempertimbangkan bagaimana kita menerapkan salah satu persegi panjang kecil. 842 00:38:39,070 --> 00:38:40,690 Sangat mudah untuk menerapkan int. 843 00:38:40,690 --> 00:38:44,000 Anda hanya mengatakan int n dan kemudian Anda mendapatkan 4 byte untuk int, 844 00:38:44,000 --> 00:38:49,089 tapi bagaimana saya mendapatkan int, sebut saja n, dan kemudian pointer, sebut saja berikutnya. 845 00:38:49,089 --> 00:38:50,880 Kita bisa menyebutnya hal apa pun yang kita inginkan 846 00:38:50,880 --> 00:38:53,590 tapi aku butuh struktur data kustom. 847 00:38:53,590 --> 00:38:54,257 Ya? 848 00:38:54,257 --> 00:38:57,020 >> AUDIENCE: Ampersand [tak terdengar]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Jadi ampersand akan kita gunakan untuk mendapatkan alamat dari simpul yang berpotensi. 850 00:39:00,940 --> 00:39:02,740 Tapi kita perlu lain Fitur dari C dalam rangka 851 00:39:02,740 --> 00:39:06,700 untuk memberikan kemampuan untuk membuat persegi panjang kebiasaan ini, kebiasaan ini 852 00:39:06,700 --> 00:39:08,919 variabel jika Anda mau, dalam memori. 853 00:39:08,919 --> 00:39:09,710 AUDIENCE: Sebuah struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: Sebuah struct. 855 00:39:10,626 --> 00:39:14,310 Ingat dari minggu lalu, kami memperkenalkan struct, kata kunci yang relatif sederhana ini 856 00:39:14,310 --> 00:39:16,254 yang memungkinkan kami melakukan hal-hal seperti ini. 857 00:39:16,254 --> 00:39:18,420 C tidak datang dengan data struktur disebut mahasiswa. 858 00:39:18,420 --> 00:39:22,190 Muncul dengan int dan mengambang dan char dan seperti itu, tapi itu tidak datang dengan siswa, 859 00:39:22,190 --> 00:39:26,750 tapi kita dapat membuat tipe data siswa, struktur siswa, dengan sintaks ini 860 00:39:26,750 --> 00:39:27,250 sini. 861 00:39:27,250 --> 00:39:28,350 Dan Anda akan melihat ini lagi dan lagi. 862 00:39:28,350 --> 00:39:30,426 Jadi jangan khawatir tentang menghafal kata kunci, 863 00:39:30,426 --> 00:39:33,300 tapi kata kunci yang penting adalah hanya fakta bahwa kita mengatakan struct 864 00:39:33,300 --> 00:39:37,590 dan kemudian kami menyebutnya mahasiswa dan di dalam siswa adalah nama dan rumah 865 00:39:37,590 --> 00:39:39,390 atau asrama atau sejenisnya. 866 00:39:39,390 --> 00:39:41,980 >> Dan jadi sekarang hari ini, mari kita mengusulkan ini. 867 00:39:41,980 --> 00:39:45,240 Saya telah menambahkan beberapa kata, tapi jika saya ingin untuk melaksanakan persegi panjang ini yang 868 00:39:45,240 --> 00:39:48,440 mendapat kedua int dan pointer, Anda tahu apa, aku 869 00:39:48,440 --> 00:39:51,540 akan mendeklarasikan struct disebut simpul. 870 00:39:51,540 --> 00:39:55,630 Saya juga, di dalamnya, akan mengatakan bahwa node, persegi panjang ini, memiliki int 871 00:39:55,630 --> 00:39:59,730 dan kami akan menyebutnya n dan memiliki pointer berikutnya. 872 00:39:59,730 --> 00:40:02,540 Dan ini sedikit verbose, tetapi jika Anda berpikir tentang hal itu, 873 00:40:02,540 --> 00:40:07,300 panah yang berada di gambar beberapa saat yang lalu adalah apa tipe data? 874 00:40:07,300 --> 00:40:12,330 Di mana masing-masing anak panah menunjuk untuk apa jenis struktur data? 875 00:40:12,330 --> 00:40:14,332 Ini tidak menunjuk hanya untuk int per se. 876 00:40:14,332 --> 00:40:16,165 Ini menunjuk ke Semuanya persegi panjang 877 00:40:16,165 --> 00:40:18,720 dan bahwa hal persegi panjang, kami katakan, disebut node. 878 00:40:18,720 --> 00:40:21,720 Dan jadi kita semacam harus rekursif menentukan ini seperti 879 00:40:21,720 --> 00:40:26,270 bahwa sebuah node, kita akan berkata, akan berisi int disebut n 880 00:40:26,270 --> 00:40:31,070 dan pointer disebut depan dan jenis struktur data yang 881 00:40:31,070 --> 00:40:35,770 yang poin pointer tampaknya akan menjadi struct simpul. 882 00:40:35,770 --> 00:40:41,550 >> Jadi ini mengganggu verbose dan hanya untuk menjadi bertele-tele, 883 00:40:41,550 --> 00:40:44,100 alasan mengapa kita tidak bisa hanya mengatakan ini, yang terus terang 884 00:40:44,100 --> 00:40:46,860 tampak jauh lebih mudah dibaca, karena ingat bahwa C baca 885 00:40:46,860 --> 00:40:48,710 hal atas ke bawah, kiri ke kanan. 886 00:40:48,710 --> 00:40:54,120 Ini tidak sampai kita mendapatkan titik koma bahwa simpul kunci benar-benar ada. 887 00:40:54,120 --> 00:40:57,980 Jadi jika kita ingin memiliki semacam ini referensi siklus dalam data 888 00:40:57,980 --> 00:41:02,120 struktur, kita harus melakukan ini, di mana kita katakan struct simpul di bagian atas, yang 889 00:41:02,120 --> 00:41:06,770 memberi kita cara yang lebih menggambarkan ini hal, kemudian di dalam kita katakan struct node, 890 00:41:06,770 --> 00:41:09,560 dan kemudian di garis yang terakhir kita katakan, baiklah, C, dengan cara, 891 00:41:09,560 --> 00:41:12,060 hanya memanggil seluruh sialan ini Hal node dan berhenti 892 00:41:12,060 --> 00:41:14,360 menggunakan struct kata kunci sama sekali. 893 00:41:14,360 --> 00:41:18,030 Jadi ini hanya semacam sintaksis trik yang pada akhirnya memungkinkan kita buat 894 00:41:18,030 --> 00:41:21,370 sesuatu yang tampak persis seperti ini. 895 00:41:21,370 --> 00:41:25,010 >> Jadi jika kita asumsikan sekarang kita bisa menerapkan hal ini di C, 896 00:41:25,010 --> 00:41:28,040 bagaimana kita benar-benar mulai melintasi ini? 897 00:41:28,040 --> 00:41:32,360 Nah, pada kenyataannya, yang harus kita lakukan adalah iterate dari kiri ke kanan dan hanya 898 00:41:32,360 --> 00:41:35,960 jenis menyisipkan node atau menghapus node atau mencari hal-hal di mana pun kita inginkan, 899 00:41:35,960 --> 00:41:39,560 tapi untuk melakukan hal ini, mari kita pergi ke depan dan membuat sesuatu yang sedikit lebih nyata karena ini 900 00:41:39,560 --> 00:41:42,560 telah super rendah tingkat sejauh ini. 901 00:41:42,560 --> 00:41:45,700 Apakah ada yang benar-benar ingin menjadi yang pertama? 902 00:41:45,700 --> 00:41:46,200 OKE. 903 00:41:46,200 --> 00:41:47,092 Ayo up. 904 00:41:47,092 --> 00:41:47,800 Siapa namamu? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: David. 907 00:41:49,290 --> 00:41:49,998 Senang berjumpa dengan mu. 908 00:41:49,998 --> 00:41:50,960 Saya juga. 909 00:41:50,960 --> 00:41:52,450 Baiklah. 910 00:41:52,450 --> 00:41:53,990 Dan kita membutuhkan nomor 9. 911 00:41:53,990 --> 00:41:55,240 Tidak sebagus pertama, mungkin. 912 00:41:55,240 --> 00:41:56,430 OK, nomor 9. 913 00:41:56,430 --> 00:41:59,667 Sejumlah 17, silakan. 914 00:41:59,667 --> 00:42:01,000 Biarkan aku kembali sedikit lebih jauh. 915 00:42:01,000 --> 00:42:03,980 Nomor 22, silahkan, dan bagaimana jauh kembali 916 00:42:03,980 --> 00:42:06,344 jika saya bisa melihat tangan dengan semua cahaya atau tidak. 917 00:42:06,344 --> 00:42:08,010 Seseorang sedang mengajukan diri di sana. 918 00:42:08,010 --> 00:42:08,968 Apakah Anda ingin datang? 919 00:42:08,968 --> 00:42:10,450 Lengan Anda paksa naik. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 yang turun. 923 00:42:15,120 --> 00:42:18,450 Akan ada orang lain ingin forcefully-- Ayo up. 924 00:42:18,450 --> 00:42:21,030 Relawan yang sebenarnya. 925 00:42:21,030 --> 00:42:23,330 >> Jadi sangat cepat, jika kalian bisa mengatur 926 00:42:23,330 --> 00:42:26,550 dirimu hanya ingin node pada layar. 927 00:42:26,550 --> 00:42:27,510 Terima kasih. 928 00:42:27,510 --> 00:42:29,234 Dan Anda akan 26. 929 00:42:29,234 --> 00:42:30,650 Baiklah dan cepat perkenalan. 930 00:42:30,650 --> 00:42:32,139 Jadi aku David dan Anda juga? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: Dan Anda? 933 00:42:33,721 --> 00:42:34,229 Jake: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE: Sue. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Sangat baik. 940 00:42:37,590 --> 00:42:39,810 Jadi ini adalah sukarelawan kami untuk hari ini dan pergi ke depan 941 00:42:39,810 --> 00:42:43,090 dan bergeser sedikit seperti itu, dan hanya pergi ke depan dan tetap 942 00:42:43,090 --> 00:42:47,024 memegang nomor Anda seperti Anda atau Anda Tanda pertama dan menggunakan tangan kiri Anda, 943 00:42:47,024 --> 00:42:48,940 pergi ke depan dan hanya menerapkan panah tersebut, hanya 944 00:42:48,940 --> 00:42:51,360 sehingga tangan kiri Anda secara harfiah menunjuk pada apa pun yang Anda harus menunjukkan 945 00:42:51,360 --> 00:42:54,610 di, dan memberikan diri Anda beberapa ruang sehingga kita secara visual dapat melihat lengan Anda benar-benar 946 00:42:54,610 --> 00:42:58,120 menunjuk, dan Anda hanya bisa mengarahkan semacam di tanah baik-baik saja. 947 00:42:58,120 --> 00:43:03,040 >> Jadi di sini kita memiliki daftar link dari satu, dua, tiga, empat, lima node awalnya, 948 00:43:03,040 --> 00:43:05,860 dan perhatikan kami memiliki khusus ini pointer pada awal siapa 949 00:43:05,860 --> 00:43:09,770 kunci karena kita harus melacak daftar panjang keseluruhan entah bagaimana. 950 00:43:09,770 --> 00:43:13,590 Orang-orang ini, meskipun mereka meninggalkan ke kanan, kembali ke belakang dalam memori, 951 00:43:13,590 --> 00:43:15,950 mereka benar-benar dapat di mana saja di memori komputer. 952 00:43:15,950 --> 00:43:18,240 Jadi orang-orang ini bisa menjadi berdiri di mana saja di atas panggung 953 00:43:18,240 --> 00:43:20,960 dan itu bagus, asalkan mereka sebenarnya menunjuk satu sama lain, 954 00:43:20,960 --> 00:43:22,770 tetapi untuk menjaga hal-hal bersih dan sederhana, kami akan 955 00:43:22,770 --> 00:43:25,728 hanya menarik mereka kiri ke kanan seperti ini, namun mungkin ada kesenjangan besar 956 00:43:25,728 --> 00:43:26,790 di antara mereka node. 957 00:43:26,790 --> 00:43:30,710 >> Sekarang, jika saya ingin benar-benar memasukkan beberapa nilai baru, mari kita pergi ke depan dan melakukan hal ini. 958 00:43:30,710 --> 00:43:33,720 Kami memiliki kesempatan sekarang untuk memilih node lain. 959 00:43:33,720 --> 00:43:39,820 Mengatakan mari kita mulai dengan mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Apakah seseorang keberatan malloc? 961 00:43:41,320 --> 00:43:42,280 OK, datang ke atas. 962 00:43:42,280 --> 00:43:42,992 Siapa namamu? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Rainbow? 965 00:43:44,050 --> 00:43:44,810 Baiklah. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Ayo up. 968 00:43:47,450 --> 00:43:51,610 Jadi sekarang kita harus bertanya pada diri sendiri algorithmically mana kita dapat menempatkan 55. 969 00:43:51,610 --> 00:43:53,610 Jadi kita semua tahu, jelas, mana mungkin dia 970 00:43:53,610 --> 00:43:55,401 milik jika kita mencoba untuk menjaga ini diurutkan 971 00:43:55,401 --> 00:43:58,299 dan jika kalian bisa mengambil satu melangkah mundur sehingga kita tidak jatuh 972 00:43:58,299 --> 00:43:59,590 panggung, yang akan menjadi besar. 973 00:43:59,590 --> 00:44:01,420 Jadi sebenarnya, Rainbow, mulai di sini dengan saya, 974 00:44:01,420 --> 00:44:04,200 karena kita sebagai komputer sekarang dapat hanya melihat satu variabel pada suatu waktu. 975 00:44:04,200 --> 00:44:05,190 Jadi jika ini adalah simpul pertama. 976 00:44:05,190 --> 00:44:07,160 Perhatikan dia tidak node, dia hanya pointer, 977 00:44:07,160 --> 00:44:10,270 dan itulah sebabnya dia ditarik menjadi hanya ukuran pointer, tidak 978 00:44:10,270 --> 00:44:11,780 salah satu persegi panjang penuh. 979 00:44:11,780 --> 00:44:16,650 Jadi kita akan memeriksa pada setiap iterasi adalah 55 kurang dari 9? 980 00:44:16,650 --> 00:44:17,150 Tidak. 981 00:44:17,150 --> 00:44:19,060 Apakah 55 kurang dari 17? 982 00:44:19,060 --> 00:44:19,720 Tidak. 983 00:44:19,720 --> 00:44:20,800 Kurang dari 22? 984 00:44:20,800 --> 00:44:22,020 Kurang dari 26? 985 00:44:22,020 --> 00:44:23,390 Kurang dari 34? 986 00:44:23,390 --> 00:44:25,890 Dan sekarang, jelas Rainbow milik di akhir. 987 00:44:25,890 --> 00:44:27,270 Jadi harus jelas, dan apa adalah nama Anda, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Jadi antara Taylor tangan kiri dan tangan Rainbow di sini, 990 00:44:32,510 --> 00:44:38,324 tangan yang perlu untuk menunjuk pada apa yang di memesan untuk memasukkan ke dalam daftar 55 ini? 991 00:44:38,324 --> 00:44:39,240 Apa yang perlu kita lakukan? 992 00:44:39,240 --> 00:44:39,700 Ya? 993 00:44:39,700 --> 00:44:41,140 >> AUDIENCE: tangan Taylor perlu untuk menunjuk kiri. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Tepat. 995 00:44:41,680 --> 00:44:43,800 Jadi memasukkan node ke akhir daftar 996 00:44:43,800 --> 00:44:47,140 cukup sederhana karena hanya Taylor harus menunjuk, bukan di tanah 997 00:44:47,140 --> 00:44:49,640 atau kita akan menyebutnya nol, nol adalah semacam ketidakhadiran 998 00:44:49,640 --> 00:44:51,640 dari pointer atau khusus nol pointer, Anda 999 00:44:51,640 --> 00:44:53,740 akan menunjukkan dengan kiri Anda tangan di Rainbow dan kemudian Rainbow, 1000 00:44:53,740 --> 00:44:55,910 di mana harus kiri Anda tangan mungkin menunjuk? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Ini tidak baik jika tangannya adalah semacam menunjuk off di sini atau semacam apapun 1003 00:45:00,140 --> 00:45:00,640 jalan yang mana. 1004 00:45:00,640 --> 00:45:02,407 Yang akan dianggap nilai sampah, 1005 00:45:02,407 --> 00:45:04,240 tetapi jika ia menunjuk ke beberapa nilai yang dikenal, kita akan 1006 00:45:04,240 --> 00:45:07,360 menyebutnya nol atau nol, itu OK karena kita memiliki istilah dalam ini 1007 00:45:07,360 --> 00:45:09,390 dan kita tahu daftar sekarang selesai. 1008 00:45:09,390 --> 00:45:11,550 >> Jadi apa lagi kasus yang relatif sederhana? 1009 00:45:11,550 --> 00:45:13,125 Bisakah kita malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Ayo up. 1011 00:45:14,010 --> 00:45:14,782 Siapa namamu? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Maaf? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID Malan: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Baiklah. 1017 00:45:17,110 --> 00:45:19,071 Tiffany telah malloced dengan nilai 5. 1018 00:45:19,071 --> 00:45:19,570 Ayo up. 1019 00:45:19,570 --> 00:45:23,820 Yang satu ini relatif mudah juga, tapi mari kita mempertimbangkan urutan operasi sekarang. 1020 00:45:23,820 --> 00:45:25,820 Itu cukup mudah dengan Taylor di akhir. 1021 00:45:25,820 --> 00:45:30,302 Nomor 5 ini tentu saja kurang dari 9, dan jadi kita harus David, kita memiliki Tiffany, 1022 00:45:30,302 --> 00:45:31,260 dan apa nama Anda? 1023 00:45:31,260 --> 00:45:31,680 >> Jake: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID Malan: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Jake, dan David. 1026 00:45:34,300 --> 00:45:36,580 Yang tangan harus diperbarui pertama? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Apa yang Anda ingin lakukan di sini? 1029 00:45:40,590 --> 00:45:45,244 Ada beberapa cara yang mungkin, tapi ada juga satu atau cara yang lebih salah. 1030 00:45:45,244 --> 00:45:46,620 >> AUDIENCE: Mulailah dengan yang paling kiri. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Mulailah dengan yang paling kiri. 1032 00:45:47,800 --> 00:45:49,008 Siapa paling kiri di sini? 1033 00:45:49,008 --> 00:45:49,700 AUDIENCE: Pertama. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Jadi mulai dengan pertama dan mana Anda ingin memperbarui tangan Daud menjadi? 1036 00:45:53,781 --> 00:45:54,780 AUDIENCE: Menjelang 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 Jadi David, titik di lima atau Tiffany sini, dan sekarang? 1039 00:45:59,026 --> 00:46:01,072 >> AUDIENCE: Tiffany menunjuk ke 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Sempurna, kecuali Binky ini kepala hanya jenis jatuh, kan? 1041 00:46:04,030 --> 00:46:06,820 Karena apa yang salah dengan gambar ini benar? 1042 00:46:06,820 --> 00:46:08,070 AUDIENCE: Tidak ada yang menunjuk. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Tidak ada yang menunjuk ke Jake sekarang. 1044 00:46:09,945 --> 00:46:13,360 Kami telah benar-benar yatim 9 dan 17, dan kami sudah benar 1045 00:46:13,360 --> 00:46:18,450 bocor semua memori ini, karena dengan memperbarui tangan David pertama, yang 1046 00:46:18,450 --> 00:46:21,660 baik sejauh itu benar menunjuk Tiffany sekarang, 1047 00:46:21,660 --> 00:46:25,410 tetapi jika tidak ada yang memiliki kejelian untuk menunjuk Jake, 1048 00:46:25,410 --> 00:46:27,490 maka kita telah kehilangan keseluruhan daftar itu. 1049 00:46:27,490 --> 00:46:28,200 Jadi mari kita batalkan. 1050 00:46:28,200 --> 00:46:30,950 Jadi itu hal yang baik untuk tersandung tapi mari kita perbaiki sekarang. 1051 00:46:30,950 --> 00:46:33,624 Apa yang harus kita lakukan pertama bukan? 1052 00:46:33,624 --> 00:46:34,124 Ya? 1053 00:46:34,124 --> 00:46:35,791 >> AUDIENCE: Tiffany harus menunjuk pada 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Saya tidak bisa mendapatkan yang dekat dengan Anda. 1055 00:46:37,582 --> 00:46:38,720 Siapa yang harus menunjuk pada 9? 1056 00:46:38,720 --> 00:46:39,220 >> AUDIENCE: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Baiklah. 1058 00:46:39,390 --> 00:46:41,200 Jadi Tiffany harus titik pertama di 9. 1059 00:46:41,200 --> 00:46:43,550 Jadi Tiffany harus mengambil pada nilai yang identik 1060 00:46:43,550 --> 00:46:45,820 David, yang tampaknya berlebihan sesaat, 1061 00:46:45,820 --> 00:46:48,820 tapi itu baik-baik saja karena sekarang, kedua langkah, kita dapat memperbarui tangan David 1062 00:46:48,820 --> 00:46:52,680 untuk menunjuk Tiffany, dan kemudian jika kita hanya jenis bersih segalanya 1063 00:46:52,680 --> 00:46:55,740 seolah-olah ini adalah jenis semi-seperti, sekarang itu pemasangan yang benar. 1064 00:46:55,740 --> 00:46:56,700 Jadi sangat baik. 1065 00:46:56,700 --> 00:46:57,970 Jadi sekarang kita sudah hampir sampai. 1066 00:46:57,970 --> 00:47:01,075 Mari kita memasukkan satu akhir nilai seperti nilai 20. 1067 00:47:01,075 --> 00:47:03,010 Jika kita bisa malloc satu relawan akhir? 1068 00:47:03,010 --> 00:47:04,140 Ayo up. 1069 00:47:04,140 --> 00:47:06,224 Jadi yang satu ini sedikit lebih rumit. 1070 00:47:06,224 --> 00:47:08,390 Tapi benar-benar, kode kami menulis, meskipun secara lisan, 1071 00:47:08,390 --> 00:47:10,610 adalah seperti memiliki a bunch dari jika kondisi sekarang, kan? 1072 00:47:10,610 --> 00:47:12,318 Kami memiliki kondisi memeriksa apakah itu milik 1073 00:47:12,318 --> 00:47:13,840 pada akhir, mungkin awal. 1074 00:47:13,840 --> 00:47:15,940 Kami memerlukan beberapa jenis loop untuk menemukan tempat di tengah. 1075 00:47:15,940 --> 00:47:17,400 Jadi mari kita melakukannya dengan siapa namamu? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID Malan: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eric. 1079 00:47:18,660 --> 00:47:19,368 Senang berjumpa dengan mu. 1080 00:47:19,368 --> 00:47:20,490 Jadi kita memiliki 20. 1081 00:47:20,490 --> 00:47:21,220 Kurang dari lima? 1082 00:47:21,220 --> 00:47:21,530 Tidak. 1083 00:47:21,530 --> 00:47:22,160 Kurang dari sembilan? 1084 00:47:22,160 --> 00:47:22,410 Tidak. 1085 00:47:22,410 --> 00:47:23,050 Kurang dari 17? 1086 00:47:23,050 --> 00:47:23,550 Tidak. 1087 00:47:23,550 --> 00:47:23,740 OKE. 1088 00:47:23,740 --> 00:47:25,701 Dia berada di sini dan Nama Anda lagi adalah? 1089 00:47:25,701 --> 00:47:26,200 SUE: Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID Malan: Sue. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID Malan: Sue, Alex, dan? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID Malan: Eric. 1095 00:47:30,120 --> 00:47:32,140 Tangan yang perlu mendapatkan update pertama? 1096 00:47:32,140 --> 00:47:32,930 >> AUDIENCE: Eric. 1097 00:47:32,930 --> 00:47:33,429 OKE. 1098 00:47:33,429 --> 00:47:35,200 Jadi Eric harus menunjuk di mana? 1099 00:47:35,200 --> 00:47:35,930 Pada 22. 1100 00:47:35,930 --> 00:47:36,430 Baik. 1101 00:47:36,430 --> 00:47:38,180 Dan sekarang apa berikutnya? 1102 00:47:38,180 --> 00:47:40,800 Sue kemudian dapat menunjuk Eric dan sekarang, jika kalian hanya 1103 00:47:40,800 --> 00:47:44,077 membuat beberapa kamar, yang baik-baik saja visual, sekarang kita sudah melakukan penyisipan. 1104 00:47:44,077 --> 00:47:47,160 Jadi mari kita sekarang mempertimbangkan pertanyaan tapi terima kasih banyak untuk relawan kami. 1105 00:47:47,160 --> 00:47:48,090 Bagus sekali. 1106 00:47:48,090 --> 00:47:50,831 Anda dapat menjaga mereka, jika Anda suka. 1107 00:47:50,831 --> 00:47:54,140 Dan kami memiliki hadiah perpisahan indah jika Anda akan setiap ingin mengambil bola stres. 1108 00:47:54,140 --> 00:47:56,030 Mari saya hanya lulus ini turun. 1109 00:47:56,030 --> 00:47:58,430 Jadi apa adalah takeaway dari ini? 1110 00:47:58,430 --> 00:48:02,430 Hal ini tampaknya menjadi luar biasa sejauh yang kita miliki sekarang 1111 00:48:02,430 --> 00:48:06,360 memperkenalkan alternatif untuk sebuah Array yang tidak begitu terbatas 1112 00:48:06,360 --> 00:48:07,780 ke array beberapa ukuran tetap. 1113 00:48:07,780 --> 00:48:09,380 Mereka dapat tumbuh secara dinamis. 1114 00:48:09,380 --> 00:48:13,220 >> Tapi seperti yang telah kita lihat dalam beberapa pekan masa lalu, kita tidak pernah mendapatkan sesuatu secara gratis, 1115 00:48:13,220 --> 00:48:15,740 seperti pasti ada trade-off di sini. 1116 00:48:15,740 --> 00:48:18,890 Jadi dengan terbalik dari terkait daftar, adalah dinamisme ini? 1117 00:48:18,890 --> 00:48:21,590 Kemampuan untuk tumbuh dan terus terang, kita bisa melakukan hapus 1118 00:48:21,590 --> 00:48:23,570 dan kita bisa menyusut sesuai kebutuhan. 1119 00:48:23,570 --> 00:48:24,710 Berapa harga yang kita bayar? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dua kali lebih banyak ruang, pertama-tama. 1122 00:48:30,340 --> 00:48:34,010 Jika Anda melihat gambar, tidak lagi aku menyimpan daftar bilangan bulat. 1123 00:48:34,010 --> 00:48:36,740 Aku menyimpan daftar bilangan bulat ditambah pointer. 1124 00:48:36,740 --> 00:48:38,240 Jadi aku menggandakan jumlah ruang. 1125 00:48:38,240 --> 00:48:40,740 Sekarang, mungkin itu tidak seperti masalah besar 4 byte, 8 byte, 1126 00:48:40,740 --> 00:48:43,160 tapi itu pasti bisa menambahkan untuk set data yang besar. 1127 00:48:43,160 --> 00:48:45,570 Apa downside lain? 1128 00:48:45,570 --> 00:48:46,070 Ya? 1129 00:48:46,070 --> 00:48:48,010 >> AUDIENCE: Kita harus melintasi mereka satu-per-satu. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Ya. 1131 00:48:48,760 --> 00:48:50,260 Kami harus melintasi mereka satu-per-satu. 1132 00:48:50,260 --> 00:48:53,860 Anda tahu apa, kita menyerah super fitur yang mudah dari braket persegi 1133 00:48:53,860 --> 00:48:57,240 notasi, lebih tepat dikenal sebagai akses acak, 1134 00:48:57,240 --> 00:48:59,280 di mana kita hanya bisa melompat untuk elemen individual 1135 00:48:59,280 --> 00:49:01,470 tapi sekarang jika saya masih memiliki relawan saya di sini, 1136 00:49:01,470 --> 00:49:04,660 jika saya ingin menemukan nomor 22, saya tidak bisa hanya 1137 00:49:04,660 --> 00:49:06,620 melompat ke braket sesuatu sesuatu. 1138 00:49:06,620 --> 00:49:10,530 Saya harus melihat daftar itu, banyak seperti contoh pencarian kami linear, 1139 00:49:10,530 --> 00:49:12,260 untuk menemukan nomor 22. 1140 00:49:12,260 --> 00:49:14,340 Jadi kita tampaknya telah membayar harga di sana. 1141 00:49:14,340 --> 00:49:16,430 Tapi kita bisa tetap memecahkan masalah lainnya. 1142 00:49:16,430 --> 00:49:18,587 >> Bahkan, izinkan saya memperkenalkan hanya beberapa visual. 1143 00:49:18,587 --> 00:49:20,920 Jadi jika Anda sudah pernah ke Mather Dining Hall baru, 1144 00:49:20,920 --> 00:49:23,320 Anda akan ingat bahwa mereka tumpukan nampan seperti ini, 1145 00:49:23,320 --> 00:49:26,300 kami meminjam ini dari Annenberg sebelum kelas. 1146 00:49:26,300 --> 00:49:28,930 Jadi tumpukan ini nampan, meskipun, adalah perwakilan sebenarnya 1147 00:49:28,930 --> 00:49:30,860 dari struktur data ilmu komputer. 1148 00:49:30,860 --> 00:49:32,910 Ada struktur data dalam ilmu komputer 1149 00:49:32,910 --> 00:49:38,010 dikenal sebagai stack yang sangat baik cocok untuk persis ini visual. 1150 00:49:38,010 --> 00:49:41,380 Jadi jika masing-masing nampan tersebut bukan baki tapi seperti nomor dan saya ingin 1151 00:49:41,380 --> 00:49:45,010 untuk menyimpan nomor, saya bisa menempatkan satu di sini, 1152 00:49:45,010 --> 00:49:48,320 dan aku bisa meletakkan lain di sini, dan terus menumpuk nomor 1153 00:49:48,320 --> 00:49:53,180 di atas satu sama lain, dan apa yang berpotensi membantu tentang ini 1154 00:49:53,180 --> 00:49:55,450 adalah bahwa apa implikasinya dari struktur data? 1155 00:49:55,450 --> 00:49:58,045 Yang nomor dapat saya tarik keluar pertama yang paling mudah? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Yang paling baru-baru ini salah satu put di sana. 1158 00:50:03,030 --> 00:50:06,430 >> Jadi ini adalah apa yang kita sebut di ilmu komputer struktur data LIFO. 1159 00:50:06,430 --> 00:50:08,070 Bertahan di, keluar pertama. 1160 00:50:08,070 --> 00:50:10,800 Dan kita akan melihat tak lama mengapa yang mungkin berguna tetapi untuk sekarang, 1161 00:50:10,800 --> 00:50:12,200 hanya mempertimbangkan properti. 1162 00:50:12,200 --> 00:50:15,158 Dan itu agak bodoh jika Anda berpikir tentang bagaimana ruang makan melakukannya. 1163 00:50:15,158 --> 00:50:17,910 Setiap kali mereka nampan bersih dan menempatkan orang-orang segar di atas, 1164 00:50:17,910 --> 00:50:22,160 Anda bisa memiliki sebelumnya bersih tapi akhirnya sangat kotor dan berdebu 1165 00:50:22,160 --> 00:50:24,360 baki di bagian paling bawah jika Anda pernah benar-benar 1166 00:50:24,360 --> 00:50:26,820 sampai ke bawah yang stack, karena Anda hanya 1167 00:50:26,820 --> 00:50:29,380 tetap menempatkan yang baru dan yang bersih di atasnya. 1168 00:50:29,380 --> 00:50:31,840 Hal yang sama mungkin terjadi di supermarket juga. 1169 00:50:31,840 --> 00:50:35,450 Jika Anda memiliki kasus layar susu dan setiap kali CVS 1170 00:50:35,450 --> 00:50:37,610 atau siapa pun yang mendapatkan lebih banyak susu, Anda hanya mendorong para susu 1171 00:50:37,610 --> 00:50:39,880 Anda sudah harus kembali dan Anda menempatkan yang baru di depan, 1172 00:50:39,880 --> 00:50:43,088 Anda akan memiliki beberapa cukup menjijikkan susu pada akhir struktur data, 1173 00:50:43,088 --> 00:50:46,390 karena selalu di bagian bawah atau ekuivalen itu selalu di belakang. 1174 00:50:46,390 --> 00:50:50,407 >> Tapi ada cara lain untuk berpikir tentang berbaris data dan misalnya, ini. 1175 00:50:50,407 --> 00:50:53,490 Jika Anda salah satu dari orang-orang yang suka berbaris di luar toko-toko Apple 1176 00:50:53,490 --> 00:50:55,610 ketika sebuah produk baru datang keluar, Anda mungkin 1177 00:50:55,610 --> 00:50:58,780 tidak menggunakan data tumpukan struktur karena Anda 1178 00:50:58,780 --> 00:51:03,070 akan mengasingkan orang lain yang berbaris untuk membeli beberapa mainan baru. 1179 00:51:03,070 --> 00:51:06,610 Sebaliknya, Anda mungkin menggunakan jenis struktur data 1180 00:51:06,610 --> 00:51:10,050 atau apa jenis sistem di dunia nyata? 1181 00:51:10,050 --> 00:51:13,493 Mudah-mudahan itu garis, atau lebih benar atau lebih British-seperti, antrian. 1182 00:51:13,493 --> 00:51:17,700 Dan ternyata antrian juga struktur data dalam ilmu komputer, 1183 00:51:17,700 --> 00:51:19,700 tapi antrian memiliki sangat properti yang berbeda. 1184 00:51:19,700 --> 00:51:20,820 Ini bukan LIFO. 1185 00:51:20,820 --> 00:51:21,990 Bertahan di, keluar pertama. 1186 00:51:21,990 --> 00:51:22,800 Amit-amit. 1187 00:51:22,800 --> 00:51:24,280 Ini bukan FIFO. 1188 00:51:24,280 --> 00:51:26,110 Pertama masuk pertama keluar. 1189 00:51:26,110 --> 00:51:27,970 Dan itu adalah hal yang baik untuk 'demi keadilan 1190 00:51:27,970 --> 00:51:30,428 tentu ketika Anda lapisan super awal di pagi hari. 1191 00:51:30,428 --> 00:51:33,400 Jika Anda sampai di sana pertama, Anda ingin keluar pertama juga. 1192 00:51:33,400 --> 00:51:35,880 >> Dan semua data ini struktur, antrian dan tumpukan 1193 00:51:35,880 --> 00:51:39,220 dan tandan lain, ternyata Anda dapat menganggap ini sebagai hanya sebuah array. 1194 00:51:39,220 --> 00:51:41,820 Ini adalah sebuah array, mungkin ukuran tetap 4, tapi itu akan 1195 00:51:41,820 --> 00:51:44,990 menjadi baik jika kita hanya bisa menumpuk nampan hampir tak terhingga tinggi jika kita 1196 00:51:44,990 --> 00:51:46,780 memiliki banyak nampan atau angka. 1197 00:51:46,780 --> 00:51:48,840 Jadi mungkin kita ingin menggunakan daftar link di sini, 1198 00:51:48,840 --> 00:51:51,800 tapi trade-off akan menjadi berpotensi bahwa kita membutuhkan lebih banyak memori, 1199 00:51:51,800 --> 00:51:55,930 Dibutuhkan sedikit lebih banyak waktu, tapi kami tidak membatasi ketinggian tumpukan, 1200 00:51:55,930 --> 00:51:59,550 seperti etalase Mather mungkin membatasi ukuran stack, 1201 00:51:59,550 --> 00:52:03,117 dan jadi ini adalah keputusan desain atau pilihan yang tersedia bagi kita akhirnya. 1202 00:52:03,117 --> 00:52:04,950 Jadi dengan data ini struktur, kita sudah mulai 1203 00:52:04,950 --> 00:52:09,360 melihat batas atas baru berpotensi pada apa yang sebelumnya adalah super cepat 1204 00:52:09,360 --> 00:52:11,260 dan di mana kita akan meninggalkan off hari ini dan di mana 1205 00:52:11,260 --> 00:52:13,200 kita akan berharap untuk mendapatkan adalah pada hari Rabu, kami akan 1206 00:52:13,200 --> 00:52:15,740 mulai melihat data struktur yang memungkinkan kita mencari 1207 00:52:15,740 --> 00:52:18,260 melalui data dalam log waktu akhir lagi. 1208 00:52:18,260 --> 00:52:21,470 Dan kita melihat bahwa, mengingat, dalam seminggu nol dan satu dengan pencarian biner atau membagi 1209 00:52:21,470 --> 00:52:22,180 dan menaklukkan. 1210 00:52:22,180 --> 00:52:26,240 Itu datang kembali dan lebih baik lagi, grail suci untuk Rabu ini 1211 00:52:26,240 --> 00:52:29,510 akan datang dengan struktur data yang berjalan benar-benar 1212 00:52:29,510 --> 00:52:32,070 atau secara teoritis di waktu yang konstan, dimana 1213 00:52:32,070 --> 00:52:34,760 tidak peduli berapa banyak jutaan atau milyaran hal 1214 00:52:34,760 --> 00:52:38,470 kita miliki dalam struktur data, maka akan membawa kita waktu yang konstan, mungkin satu langkah 1215 00:52:38,470 --> 00:52:41,387 atau dua langkah atau 10 langkah, tetapi jumlah konstan langkah 1216 00:52:41,387 --> 00:52:42,970 untuk mencari melalui struktur data. 1217 00:52:42,970 --> 00:52:46,300 Bahwa memang akan menjadi holy grail tetapi lebih pada Rabu. 1218 00:52:46,300 --> 00:52:49,045 Lihat ya kemudian. 1219 00:52:49,045 --> 00:52:53,704 >> [MUSIC PLAYING] 1220 00:52:53,704 --> 00:56:08,448