1 00:00:00,000 --> 00:00:03,381 >> [Bermain muzik] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO MAIN SEMULA] 4 00:00:11,610 --> 00:00:13,640 >> -Dia Berbohong. 5 00:00:13,640 --> 00:00:14,380 >> -Tentang apa? 6 00:00:14,380 --> 00:00:17,182 >> -Saya tidak tahu. 7 00:00:17,182 --> 00:00:19,990 >> -Jadi Apa yang kita tahu? 8 00:00:19,990 --> 00:00:23,145 >> -Itu Pada 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 persoalannya ialah, apa yang yang dia buat di 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Milimeter 9 sesuatu. 12 00:00:29,720 --> 00:00:31,540 Mungkin dia melihat sniper. 13 00:00:31,540 --> 00:00:33,412 >> -atau Telah bekerjasama dengan beliau. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Kembali satu. 16 00:00:36,200 --> 00:00:36,975 >> -Apa yang awak nampak? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Mukanya skrin penuh. 19 00:00:47,805 --> 00:00:48,680 >> Cermin mata -His. 20 00:00:48,680 --> 00:00:50,060 >> -Ada Pantulan. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Ia Pasukan besbol Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Itulah logo mereka. 24 00:01:03,110 --> 00:01:05,820 >> -dan Dia bercakap dengan sesiapa yang memakai jaket itu. 25 00:01:05,820 --> 00:01:06,670 >> [AKHIR MAIN SEMULA] 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 adalah sedikit lebih [didengar] yang anda berada 28 00:01:11,210 --> 00:01:12,890 berkecimpung dengan masalah set empat. 29 00:01:12,890 --> 00:01:16,606 Hari ini kita mula kelihatan sedikit lebih mendalam perkara-perkara ini dipanggil petunjuk, 30 00:01:16,606 --> 00:01:18,480 yang walaupun ia topik yang agak sukar difahami, 31 00:01:18,480 --> 00:01:20,813 ternyata bahawa ia akan sebagai cara dengan mana kita 32 00:01:20,813 --> 00:01:24,320 boleh mula membina dan memasang program-program yang lebih canggih. 33 00:01:24,320 --> 00:01:28,150 Tetapi kita lakukan pada Rabu lalu melalui beberapa claymation pertama. 34 00:01:28,150 --> 00:01:30,190 Jadi ini, ingat, adalah Binky dan kami selalu dia 35 00:01:30,190 --> 00:01:33,148 untuk mengambil lihat pada program yang tidak benar-benar melakukan apa-apa yang menarik, 36 00:01:33,148 --> 00:01:34,950 tetapi ia tidak mendedahkan beberapa masalah. 37 00:01:34,950 --> 00:01:38,570 Jadi bermula hari ini, mengapa tidak kita berjalan cepat melalui beberapa langkah-langkah ini, 38 00:01:38,570 --> 00:01:41,920 cuba untuk menyuling ke dalam istilah manusia apa yang berlaku di sini 39 00:01:41,920 --> 00:01:45,410 dan mengapa ini tidak baik, dan kemudian beralih dan benar-benar mula membina 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 dari segi orang biasa itu, apa sedang kedua-dua baris buat? 43 00:01:51,340 --> 00:01:55,600 Seseorang yang munasabah yang selesa dengan apa yang diisytiharkan pada skrin? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Apakah kedua-dua baris buat? 46 00:02:00,120 --> 00:02:02,070 Ia bukan semua yang berbeza dari minggu satu, 47 00:02:02,070 --> 00:02:03,611 tetapi terdapat beberapa simbol khas. 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 >> PENONTON: Mengisytiharkan petunjuk? 51 00:02:07,092 --> 00:02:08,050 DAVID MALAN: Katakanlah lagi? 52 00:02:08,050 --> 00:02:08,860 PENONTON: Mengisytiharkan petunjuk? 53 00:02:08,860 --> 00:02:11,776 DAVID MALAN: Mengisytiharkan petunjuk dan mari kita menghalusi lebih sedikit. 54 00:02:11,776 --> 00:02:14,050 PENONTON: [didengar] alamat x dan kemudian y. 55 00:02:14,050 --> 00:02:15,300 DAVID MALAN: Dan kemudian alamat. 56 00:02:15,300 --> 00:02:18,550 Jadi secara khusus apa yang kami lakukan adalah kita mengisytiharkan dua pembolehubah. 57 00:02:18,550 --> 00:02:21,252 Pembolehubah ini, walaupun, akan sebagai jenis int bintang, yang 58 00:02:21,252 --> 00:02:23,210 lebih khusus bermakna 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 Maka adakah nilai? 61 00:02:27,660 --> 00:02:32,621 Adakah terdapat mana-mana alamat sebenar dalam ini dua pembolehubah pada masa ini? 62 00:02:32,621 --> 00:02:33,120 No. 63 00:02:33,120 --> 00:02:35,030 Ia hanya apa yang dipanggil nilai sampah. 64 00:02:35,030 --> 00:02:38,120 Jika anda tidak benar-benar menetapkan berubah-ubah, apa sahaja yang di dalam RAM 65 00:02:38,120 --> 00:02:42,224 sebelum ini akan isi dengan sifar dan orang yang kedua-dua mereka pembolehubah. 66 00:02:42,224 --> 00:02:44,140 Tetapi kita masih belum tahu apa yang mereka dan itulah 67 00:02:44,140 --> 00:02:47,060 akan menjadi kunci mengapa Binky kehilangan kepalanya pada minggu lalu. 68 00:02:47,060 --> 00:02:49,980 >> Jadi ini adalah claymation yang penjelmaan ini 69 00:02:49,980 --> 00:02:53,580 di mana anda mempunyai hanya dua pembolehubah, keping bulat sedikit tanah liat, 70 00:02:53,580 --> 00:02:57,330 yang boleh menyimpan pembolehubah, tetapi sebagai anak panah berselimut mencadangkan, 71 00:02:57,330 --> 00:03:00,640 mereka tidak sebenarnya menunjuk ke mana-mana dikenali semata-mata. 72 00:03:00,640 --> 00:03:03,670 Sebab itu kita mempunyai garis ini, dan ini adalah baru minggu lepas, malloc untuk ingatan 73 00:03:03,670 --> 00:03:07,130 peruntukan, yang hanya cara yang mewah memberitahu sistem operasi, Linux 74 00:03:07,130 --> 00:03:09,750 atau Mac OS atau Windows, hey, memberi aku ingatan, 75 00:03:09,750 --> 00:03:11,780 dan semua yang anda perlu memberitahu sistem operasi 76 00:03:11,780 --> 00:03:14,699 adalah apa apabila meminta ia untuk ingatan. 77 00:03:14,699 --> 00:03:16,990 Ia tidak akan peduli apa anda akan lakukan dengan ia, 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 >> PENONTON: 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 bait, dan sebagainya, ini, sekali lagi, contoh yang dibuat-buat, hanya mengatakan, 83 00:03:25,280 --> 00:03:27,360 memberi saya saiz int. 84 00:03:27,360 --> 00:03:30,550 Sekarang, saiz int adalah empat bait atau 32 bit. 85 00:03:30,550 --> 00:03:32,850 Jadi ini adalah hanya satu cara untuk berkata, hey, sistem operasi, 86 00:03:32,850 --> 00:03:37,290 memberi saya empat bait memori yang boleh saya gunakan ada pada saya, 87 00:03:37,290 --> 00:03:40,560 dan khususnya, apa yang tidak pulangan malloc berkenaan 88 00:03:40,560 --> 00:03:41,795 itu sebahagian daripada empat bait? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 PENONTON: Alamat? 91 00:03:44,860 --> 00:03:45,901 DAVID MALAN: Alamat. 92 00:03:45,901 --> 00:03:47,580 Alamat bahawa sebahagian daripada empat bait. 93 00:03:47,580 --> 00:03:48,190 Tepat sekali. 94 00:03:48,190 --> 00:03:51,430 Dan supaya apa yang disimpan akhirnya dalam x dan sebab itu kita tidak benar-benar 95 00:03:51,430 --> 00:03:55,240 peduli apa jumlah yang alamat, sama ada ia OX1 atau OX2 96 00:03:55,240 --> 00:03:57,110 atau beberapa alamat perenambelasan samar. 97 00:03:57,110 --> 00:03:59,850 Kami hanya mengambil berat bergambar yang bahawa pemboleh ubah x kini 98 00:03:59,850 --> 00:04:01,630 menunjuk kepada yang sebahagian memori. 99 00:04:01,630 --> 00:04:05,570 Jadi anak panah mewakili penunjuk, atau lebih khusus, alamat ingatan. 100 00:04:05,570 --> 00:04:09,120 Tetapi sekali lagi, kita tidak biasanya mengambil berat apa yang orang-orang alamat sebenar adalah. 101 00:04:09,120 --> 00:04:11,780 Sekarang, talian ini mengatakan apa dari segi orang biasa itu? 102 00:04:11,780 --> 00:04:14,330 Bintang x mendapat 42 koma bertitik. 103 00:04:14,330 --> 00:04:17,390 Apakah ini bermakna? 104 00:04:17,390 --> 00:04:18,200 Anda mahu pergi? 105 00:04:18,200 --> 00:04:20,102 Jangan menggaru leher anda. 106 00:04:20,102 --> 00:04:22,360 >> PENONTON: Alamat x adalah pada 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID MALAN: Alamat x adalah pada 42. 108 00:04:24,300 --> 00:04:25,190 Tidak cukup. 109 00:04:25,190 --> 00:04:28,485 Begitu dekat, tetapi tidak cukup, kerana ada bintang yang yang x awalan ini. 110 00:04:28,485 --> 00:04:29,860 Oleh itu, kita perlu tweak sedikit. 111 00:04:29,860 --> 00:04:31,032 Ya? 112 00:04:31,032 --> 00:04:36,044 >> PENONTON: Nilai bahawa penunjuk x menunjuk ke 42. 113 00:04:36,044 --> 00:04:36,710 DAVID MALAN: OK. 114 00:04:36,710 --> 00:04:40,840 Nilai yang penunjuk x ialah menunjuk ke, katakan, hendaklah menjadi 42, 115 00:04:40,840 --> 00:04:44,165 atau meletakkan cara lain, bintang x kata, pergi kepada apa sahaja alamat 116 00:04:44,165 --> 00:04:48,340 adalah dalam x, sama ada 1 Oxford Jalan atau 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 atau OX1 atau ox33, apa sahaja bahawa alamat angka adalah, 118 00:04:51,850 --> 00:04:54,380 bintang x adalah penyahrujukan x. 119 00:04:54,380 --> 00:04:57,297 Jadi pergi ke alamat itu dan kemudian meletakkan nombor 42 di sana. 120 00:04:57,297 --> 00:04:59,380 Supaya akan menjadi cara sama dengan mengatakan bahawa. 121 00:04:59,380 --> 00:05:01,860 Jadi itu sahaja halus dan kemudian kita akan mewakili gambar 122 00:05:01,860 --> 00:05:05,370 seperti berikut di mana kami telah menambah 42 itu sebahagian daripada empat 123 00:05:05,370 --> 00:05:09,370 bait di sebelah kanan, tetapi garis ini adalah di mana perkara yang pergi jauh menyimpang 124 00:05:09,370 --> 00:05:11,120 dan kepala Binky ini muncul off pada ketika ini, 125 00:05:11,120 --> 00:05:15,290 kerana perkara-perkara buruk berlaku apabila anda dereference nilai sampah 126 00:05:15,290 --> 00:05:18,210 atau anda dereference tidak sah petunjuk, dan aku berkata tidak sah 127 00:05:18,210 --> 00:05:21,020 kerana pada ketika ini dalam cerita, maksud yang terkandung dalam y? 128 00:05:21,020 --> 00:05:24,440 Apakah nilai y berdasarkan mengenai langkah-langkah kebelakangan ini? 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 >> PENONTON: Satu alamat. 132 00:05:26,990 --> 00:05:28,460 DAVID MALAN: Satu alamat. 133 00:05:28,460 --> 00:05:31,910 Ia harus menjadi satu alamat tetapi saya dimulakan ia? 134 00:05:31,910 --> 00:05:32,800 Jadi saya tidak perlu lagi. 135 00:05:32,800 --> 00:05:35,430 Jadi apa yang dikenali sebagai di sana? 136 00:05:35,430 --> 00:05:37,590 Ia hanya beberapa nilai sampah. 137 00:05:37,590 --> 00:05:41,500 Ia boleh menjadi mana-mana alamat dari sifar hingga 2000000000 jika anda mempunyai dua gig RAM, 138 00:05:41,500 --> 00:05:44,289 atau sifar ke 4000000000 jika anda telah mendapat empat gigabait RAM. 139 00:05:44,289 --> 00:05:46,080 Ia adalah beberapa nilai sampah, tetapi masalahnya ialah 140 00:05:46,080 --> 00:05:48,200 bahawa sistem operasi, jika ia tidak memberikan anda 141 00:05:48,200 --> 00:05:51,140 yang sebahagian memori khusus yang anda cuba untuk pergi ke, 142 00:05:51,140 --> 00:05:54,650 ia biasanya akan menyebabkan apa kami telah dilihat sebagai satu kesalahan segmentasi. 143 00:05:54,650 --> 00:05:57,810 Jadi sebenarnya, mana-mana orang yang mempunyai bergelut pada masalah pada waktu pejabat 144 00:05:57,810 --> 00:06:00,393 atau dalam masalah yang lebih secara amnya dengan cuba untuk memikirkan 145 00:06:00,393 --> 00:06:02,150 kesalahan segmentasi, yang biasanya bermakna 146 00:06:02,150 --> 00:06:05,017 anda menyentuh segmen memori yang anda tidak perlu. 147 00:06:05,017 --> 00:06:07,350 Anda menyentuh memori yang sistem operasi tidak mempunyai 148 00:06:07,350 --> 00:06:10,450 membolehkan anda untuk menyentuh, sama ada dengan pergi terlalu jauh dalam pelbagai anda 149 00:06:10,450 --> 00:06:12,870 atau memulakan sekarang, sama ada ia adalah kerana 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 >> Berbuat demikian bintang x di sini jenis tingkah laku ditentukan. 152 00:06:18,230 --> 00:06:22,030 Anda tidak boleh melakukannya kerana kemungkinan sedang, program ini hanya akan kemalangan, 153 00:06:22,030 --> 00:06:24,050 kerana anda katakan, pergi ke alamat ini 154 00:06:24,050 --> 00:06:27,000 dan anda tidak tahu di mana alamat yang sebenarnya. 155 00:06:27,000 --> 00:06:30,300 Jadi sistem operasi itu mungkin akan crash program anda 156 00:06:30,300 --> 00:06:33,840 akibat dan sesungguhnya, itulah apa yang berlaku di sana untuk Binky. 157 00:06:33,840 --> 00:06:37,210 Jadi akhirnya, Binky tetap masalah ini dengan ini. 158 00:06:37,210 --> 00:06:38,909 Jadi program itu sendiri adalah cacat. 159 00:06:38,909 --> 00:06:41,450 Tetapi jika anda jenis mara ke hadapan dan melaksanakan garis ini sebaliknya, 160 00:06:41,450 --> 00:06:45,580 y sama x hanya bermakna apa sahaja alamat adalah x, juga memasukkannya ke dalam y. 161 00:06:45,580 --> 00:06:48,740 >> Dan sebagainya bergambar, kami telah diwakili ini dengan dua anak panah 162 00:06:48,740 --> 00:06:51,570 dari x dan dari y menunjuk ke tempat yang sama. 163 00:06:51,570 --> 00:06:55,760 Jadi semantik, x sama kepada y kerana kedua-dua mereka 164 00:06:55,760 --> 00:07:00,300 menimbun yang sama alamat, ergo menunjuk pada 42, 165 00:07:00,300 --> 00:07:04,910 dan kini, dengan berkata bintang y, pergi ke alamat dalam y, 166 00:07:04,910 --> 00:07:06,790 ini mempunyai kesan sampingan yang menarik. 167 00:07:06,790 --> 00:07:10,320 Jadi alamat dalam y adalah Perkara yang sama seperti alamat yang dalam x. 168 00:07:10,320 --> 00:07:15,060 Jadi, jika anda mengatakan pergi ke alamat dalam y dan menukar nilai kepada 13, 169 00:07:15,060 --> 00:07:17,140 siapa lagi ia berlaku? 170 00:07:17,140 --> 00:07:21,100 X, titik D, boleh dikatakan, harus terjejas juga. 171 00:07:21,100 --> 00:07:24,340 >> Dan sesungguhnya, bagaimana Nick menarik gambar ini dalam claymation betul-betul itu. 172 00:07:24,340 --> 00:07:28,665 Walaupun kita mengikuti penunjuk y, kita berakhir di tempat yang sama, 173 00:07:28,665 --> 00:07:32,780 dan sebagainya jika kita mencetak keluar x atau pointee y, 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 Pengaturcara, untuk saya pengetahuan, tidak pernah benar-benar 177 00:07:39,760 --> 00:07:42,460 mengatakan pointee perkataan, apa yang ada tajam 178 00:07:42,460 --> 00:07:44,650 di, tetapi untuk konsisten dengan video, menyedari 179 00:07:44,650 --> 00:07:47,520 itu sahaja yang telah bermakna dalam keadaan itu. 180 00:07:47,520 --> 00:07:54,190 Jadi apa-apa soalan mengenai claymation atau petunjuk atau malloc sahaja lagi? 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 lanjut ado, mari kita lihat 184 00:07:58,560 --> 00:08:00,700 di mana ini sebenarnya mempunyai telah digunakan untuk beberapa ketika. 185 00:08:00,700 --> 00:08:03,580 Oleh itu, kita mempunyai perpustakaan CS50 ini yang mempunyai semua fungsi-fungsi ini. 186 00:08:03,580 --> 00:08:06,810 Kami telah menggunakan GetInt banyak, GetString, mungkin GetLongLong awal 187 00:08:06,810 --> 00:08:09,840 dalam Serangga saya satu atau lebih, tetapi apa yang sebenarnya telah berlaku? 188 00:08:09,840 --> 00:08:12,920 Nah, mari kita melihat cepat di bawah hood di program yang 189 00:08:12,920 --> 00:08:17,017 memberi inspirasi mengapa kami memberi anda CS50 perpustakaan, dan sesungguhnya pada minggu lepas, 190 00:08:17,017 --> 00:08:18,850 kita mula mengambil orang-orang roda latihan di luar. 191 00:08:18,850 --> 00:08:21,080 Jadi ini kini disusun daripada bedah siasat apa 192 00:08:21,080 --> 00:08:23,690 telah berlaku dalam perpustakaan CS50, 193 00:08:23,690 --> 00:08:27,250 walaupun kita kini akan mula bergerak jauh dari itu bagi kebanyakan program. 194 00:08:27,250 --> 00:08:29,460 >> Jadi ini adalah satu program yang dipanggil scanf 0. 195 00:08:29,460 --> 00:08:30,510 Ia sangat pendek. 196 00:08:30,510 --> 00:08:33,909 Ia hanya mempunyai ayat-ayat ini, tetapi ia memperkenalkan scanf fungsi dipanggil 197 00:08:33,909 --> 00:08:36,909 bahawa kita sebenarnya akan melihat dalam seketika di dalam perpustakaan CS50, 198 00:08:36,909 --> 00:08:38,600 walaupun dalam bentuk yang sedikit berbeza. 199 00:08:38,600 --> 00:08:41,330 Jadi program ini di talian 16 yang mengisytiharkan x berubah-ubah. 200 00:08:41,330 --> 00:08:43,150 Maka berikanlah kepadaku empat bait untuk int. 201 00:08:43,150 --> 00:08:45,750 Ia telah memberitahu pengguna, nombor kehendaki, dan kemudian 202 00:08:45,750 --> 00:08:49,010 ini adalah barisan yang menarik yang sebenarnya mengikat bersama-sama pada minggu lepas 203 00:08:49,010 --> 00:08:49,790 dan ini. 204 00:08:49,790 --> 00:08:53,230 Scanf, dan kemudian melihat ia mengambil rentetan format, seperti printf, 205 00:08:53,230 --> 00:08:57,480 % i bermakna int, dan kemudian ia mengambil Hujah kedua yang kelihatan sedikit 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Ia Ampersand x, dan untuk menarik balik, kita hanya lihat minggu sekali terakhir ini. 208 00:09:01,880 --> 00:09:03,465 Apakah Ampersand x mewakili? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Apakah Ampersand dilakukan di C? 211 00:09:08,450 --> 00:09:08,950 Ya? 212 00:09:08,950 --> 00:09:10,024 >> PENONTON: Alamat. 213 00:09:10,024 --> 00:09:11,190 DAVID MALAN: Alamat. 214 00:09:11,190 --> 00:09:13,190 Jadi ia adalah sebaliknya pengendali bintang, 215 00:09:13,190 --> 00:09:17,270 manakala pengendali bintang itu berkata, pergi ke alamat ini, pengendali Ampersand 216 00:09:17,270 --> 00:09:20,280 berkata, memikirkan alamat pembolehubah ini, 217 00:09:20,280 --> 00:09:23,530 dan sebagainya ini adalah kunci, kerana tujuan scanf dalam kehidupan 218 00:09:23,530 --> 00:09:26,320 adalah untuk mengimbas pengguna ini input daripada papan kekunci, 219 00:09:26,320 --> 00:09:29,970 bergantung kepada apa sahaja yang dia jenis, dan kemudian membaca input pengguna tersebut 220 00:09:29,970 --> 00:09:32,970 ke dalam pembolehubah, tetapi kita lihat dalam dua minggu yang lalu 221 00:09:32,970 --> 00:09:36,080 bahawa fungsi swap yang kita cuba dengan mudah untuk melaksanakan 222 00:09:36,080 --> 00:09:37,110 hanya patah. 223 00:09:37,110 --> 00:09:42,470 Ingat bahawa dengan fungsi swap, jika kita hanya mengisytiharkan A dan B seperti ints, 224 00:09:42,470 --> 00:09:47,040 kami tidak berjaya menukar dua pemboleh ubah di dalam pertukaran 225 00:09:47,040 --> 00:09:50,080 hanya suka dengan susu dan OJ, tetapi sebaik sahaja pertukaran kembali, 226 00:09:50,080 --> 00:09:55,200 apakah keputusan berkenaan dengan x dan y, nilai asal? 227 00:09:55,200 --> 00:09:55,700 Apa-apa. 228 00:09:55,700 --> 00:09:56,200 Yeah. 229 00:09:56,200 --> 00:09:59,754 Tiada apa yang berlaku waktu itu, sebab swap berubah hanya salinan tempatan, 230 00:09:59,754 --> 00:10:01,670 yang mengatakan, semua kali ini, setiap kali kita ada 231 00:10:01,670 --> 00:10:04,010 telah lulus dalam hujah-hujah dengan fungsi, kami 232 00:10:04,010 --> 00:10:05,939 hanya lulus salinan mereka hujah. 233 00:10:05,939 --> 00:10:07,980 Anda boleh lakukan dengan yang apa sahaja yang anda mahu dengan mereka, 234 00:10:07,980 --> 00:10:10,890 tetapi mereka akan tidak mempunyai kesan ke atas nilai asal. 235 00:10:10,890 --> 00:10:13,650 Jadi ini adalah bermasalah jika anda mahu mempunyai fungsi seperti scanf 236 00:10:13,650 --> 00:10:17,170 dalam kehidupan, yang tujuan adalah untuk mengimbas input pengguna dari keyboard 237 00:10:17,170 --> 00:10:22,010 dan kemudian isikan tempat kosong, jadi untuk berkata-kata, iaitu, memberi pembolehubah seperti x 238 00:10:22,010 --> 00:10:25,410 nilai, kerana jika saya untuk melepaskan sahaja x untuk scanf, 239 00:10:25,410 --> 00:10:28,790 jika anda mengambil kira logik lalu minggu, scanf boleh melakukan apa sahaja yang ia mahu 240 00:10:28,790 --> 00:10:33,100 dengan salinan x, tetapi ia tidak boleh secara kekal menukar x melainkan kita memberi 241 00:10:33,100 --> 00:10:37,120 scanf peta harta, boleh dikatakan, mana x menandakan tempat, di mana 242 00:10:37,120 --> 00:10:41,860 kita lulus dalam alamat x supaya scanf boleh pergi ke sana dan sebenarnya perubahan 243 00:10:41,860 --> 00:10:42,920 nilai x. 244 00:10:42,920 --> 00:10:45,080 Dan sebagainya memang, semua bahawa program ini tidak 245 00:10:45,080 --> 00:10:53,180 jika saya membuat scanf 0, dalam sumber saya Direktori 5m, membuat scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot mengurangkan scanf, nombor sila 50, terima kasih untuk 50. 247 00:10:57,730 --> 00:11:01,020 >> Jadi ia tidak semua yang menarik, tetapi apa yang sebenarnya berlaku 248 00:11:01,020 --> 00:11:04,820 adalah bahawa sebaik sahaja saya memanggil scanf sini, nilai x 249 00:11:04,820 --> 00:11:06,410 sedang selama-lamanya berubah. 250 00:11:06,410 --> 00:11:08,335 Sekarang, ini seolah-olah baik dan baik, dan sebenarnya, ia 251 00:11:08,335 --> 00:11:11,200 seolah-olah seperti kita tidak benar-benar memerlukan perpustakaan CS50 sama sekali lagi. 252 00:11:11,200 --> 00:11:13,960 Sebagai contoh, mari kita berjalan ini sekali lagi di sini. 253 00:11:13,960 --> 00:11:15,750 Biar saya membukanya semula untuk kali kedua. 254 00:11:15,750 --> 00:11:20,600 Mari kita cuba sebilangan sila dan daripada berkata 50 seperti sebelum ini, 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 pelik. 257 00:11:24,000 --> 00:11:25,270 OKAY. 258 00:11:25,270 --> 00:11:28,680 Dan hanya beberapa karut di sini. 259 00:11:28,680 --> 00:11:31,170 Oleh itu, ia seolah-olah tidak menangani situasi yang salah. 260 00:11:31,170 --> 00:11:33,620 Oleh itu, kita perlu secara minimum permulaan menambah beberapa ralat semakan 261 00:11:33,620 --> 00:11:37,460 memastikan bahawa pengguna mempunyai ditaip dalam jumlah yang sebenar seperti 50, 262 00:11:37,460 --> 00:11:40,720 kerana nampaknya menaip perkataan tidak dikesan sebagai bermasalah, 263 00:11:40,720 --> 00:11:42,020 tetapi ia mungkin boleh. 264 00:11:42,020 --> 00:11:46,450 >> Mari kita lihat versi ini kini itulah percubaan saya untuk mengimplemen semula GetString. 265 00:11:46,450 --> 00:11:48,437 Jika scanf mempunyai semua ini fungsi terbina dalam, 266 00:11:48,437 --> 00:11:51,270 mengapa kita telah berkecimpung dengan ini roda latihan seperti GetString? 267 00:11:51,270 --> 00:11:55,450 Nah, di sini mungkin saya sendiri Versi mudah GetString 268 00:11:55,450 --> 00:12:00,766 mana seminggu yang lalu, saya mungkin berkata, memberi saya rentetan dan memanggilnya penampan. 269 00:12:00,766 --> 00:12:03,390 Hari ini, saya akan mula hanya berkata bintang char, yang, ingat, 270 00:12:03,390 --> 00:12:04,400 ia hanya sinonim. 271 00:12:04,400 --> 00:12:06,629 Ia kelihatan menakutkan tetapi ia perkara sama. 272 00:12:06,629 --> 00:12:09,420 Itu, kurniakanlah daku penampan pembolehubah dipanggil yang akan menyimpan rentetan, 273 00:12:09,420 --> 00:12:12,780 memberitahu rentetan pengguna sila, dan kemudian, sama seperti sebelum ini, 274 00:12:12,780 --> 00:12:17,760 mari kita cuba untuk meminjam pelajaran ini scanf % s masa ini dan kemudian lulus dalam buffer. 275 00:12:17,760 --> 00:12:19,310 Kini, cek kewarasan cepat. 276 00:12:19,310 --> 00:12:22,120 Kenapa saya tidak mengatakan Ampersand penampan kali ini? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Membuat kesimpulan daripada contoh sebelumnya. 279 00:12:26,625 --> 00:12:28,000 PENONTON: Char bintang ini penunjuk. 280 00:12:28,000 --> 00:12:29,920 DAVID MALAN: Tepat sekali, kerana kali ini, char 281 00:12:29,920 --> 00:12:34,080 bintang sudah menjadi penunjuk, alamat, dengan takrif bahawa bintang berada di sana. 282 00:12:34,080 --> 00:12:37,530 Dan jika scanf menjangka alamat, ia mencukupi hanya untuk lulus dalam penampan. 283 00:12:37,530 --> 00:12:39,260 Saya tidak perlu berkata penampan Ampersand. 284 00:12:39,260 --> 00:12:42,177 Bagi yang ingin tahu, anda boleh melakukan sesuatu seperti ini. 285 00:12:42,177 --> 00:12:43,510 Ia akan mempunyai maksud yang berbeza. 286 00:12:43,510 --> 00:12:47,240 Ini akan memberikan anda penunjuk kepada penunjuk, yang sebenarnya 287 00:12:47,240 --> 00:12:50,050 satu perkara yang sah di C, tetapi untuk sekarang, mari kita memastikan ia mudah 288 00:12:50,050 --> 00:12:51,750 dan cerita yang konsisten. 289 00:12:51,750 --> 00:12:54,100 Saya hanya akan lulus dalam penampan dan itu betul. 290 00:12:54,100 --> 00:12:56,487 Masalahnya walaupun adalah ini. 291 00:12:56,487 --> 00:12:58,820 Biar saya pergi ke hadapan dan menjalankan ini program selepas menyusun ia. 292 00:12:58,820 --> 00:13:00,902 Membuat scanf 1. 293 00:13:00,902 --> 00:13:02,610 Sialan, pengkompil saya menangkap kesilapan saya. 294 00:13:02,610 --> 00:13:04,090 Berikan saya satu saat. 295 00:13:04,090 --> 00:13:05,460 Dilafaz. 296 00:13:05,460 --> 00:13:06,990 Katakan scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 OKAY. 299 00:13:11,380 --> 00:13:12,720 Di sana kami pergi. 300 00:13:12,720 --> 00:13:14,280 Saya perlukannya. 301 00:13:14,280 --> 00:13:16,750 ID CS50 mempunyai pelbagai tetapan tatarajah 302 00:13:16,750 --> 00:13:18,280 yang melindungi anda terhadap diri anda. 303 00:13:18,280 --> 00:13:21,300 Saya perlu untuk melumpuhkan mereka dengan berjalan dilafaz secara manual masa ini. 304 00:13:21,300 --> 00:13:22,140 Jadi rentetan sila. 305 00:13:22,140 --> 00:13:25,560 Saya akan pergi ke hadapan dan taip di dunia hello kegemaran 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 taip. 308 00:13:27,700 --> 00:13:29,690 Jadi ia menunjukkan sesuatu yang salah. 309 00:13:29,690 --> 00:13:33,920 Biar saya pergi ke hadapan dan taip dalam rentetan benar-benar panjang. 310 00:13:33,920 --> 00:13:37,210 Terima kasih kerana batal dan saya tidak tahu jika saya akan dapat kemalangan itu. 311 00:13:37,210 --> 00:13:40,240 Mari kita cuba satu salinan kecil paste dan lihat jika ini dapat membantu. 312 00:13:40,240 --> 00:13:43,290 Hanya tampal banyak ini. 313 00:13:43,290 --> 00:13:47,310 Ia pasti yang lebih besar rentetan daripada biasa. 314 00:13:47,310 --> 00:13:51,450 Mari kita benar-benar menulisnya. 315 00:13:51,450 --> 00:13:51,950 No. 316 00:13:51,950 --> 00:13:52,650 Tak guna. 317 00:13:52,650 --> 00:13:53,480 Perintahkanlah tidak dijumpai. 318 00:13:53,480 --> 00:13:54,550 Jadi, itu tidak berkaitan. 319 00:13:54,550 --> 00:13:56,440 Ini kerana saya ditampal beberapa watak yang tidak baik, 320 00:13:56,440 --> 00:13:59,780 tetapi ini ternyata tidak akan berfungsi. 321 00:13:59,780 --> 00:14:03,510 >> Mari kita cuba ini sekali lagi, kerana ia lebih menyeronokkan jika kita benar-benar kemalangan itu. 322 00:14:03,510 --> 00:14:09,116 Mari kita menaip ini dan sekarang, saya akan menyalin rentetan benar-benar panjang 323 00:14:09,116 --> 00:14:10,990 dan sekarang mari kita lihat jika kita boleh kemalangan perkara ini. 324 00:14:10,990 --> 00:14:14,235 Notis saya ditinggalkan ruang dan barisan baru dan koma bertitik 325 00:14:14,235 --> 00:14:16,035 dan semua watak funky. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 Dan kini rangkaian cuma lambat. 329 00:14:22,880 --> 00:14:27,460 Saya ditekan Command-V terlalu lama, dengan jelas. 330 00:14:27,460 --> 00:14:28,190 Tak guna! 331 00:14:28,190 --> 00:14:29,260 Perintahkanlah tidak dijumpai. 332 00:14:29,260 --> 00:14:29,780 >> OKAY. 333 00:14:29,780 --> 00:14:32,240 Nah, persoalannya adalah namun berikut. 334 00:14:32,240 --> 00:14:36,910 Jadi apa yang sebenarnya akan pada dengan pengakuan ini 335 00:14:36,910 --> 00:14:39,240 penimbal bintang char pada baris 16? 336 00:14:39,240 --> 00:14:41,820 Jadi apa yang saya mendapat apabila saya mengisytiharkan penunjuk? 337 00:14:41,820 --> 00:14:47,440 Semua Saya mendapat adalah nilai empat bait dipanggil penampan, tetapi apa yang di dalamnya 338 00:14:47,440 --> 00:14:49,540 pada masa ini? 339 00:14:49,540 --> 00:14:50,930 Ia hanya beberapa nilai sampah. 340 00:14:50,930 --> 00:14:54,170 Kerana bila-bila masa anda mengisytiharkan pembolehubah dalam C, ia hanya beberapa nilai sampah, 341 00:14:54,170 --> 00:14:56,220 dan kami mula perjalanan lebih realiti ini. 342 00:14:56,220 --> 00:14:59,720 Sekarang, apabila saya memberitahu scanf, pergi ke alamat ini 343 00:14:59,720 --> 00:15:01,520 dan meletakkan apa sahaja jenis pengguna dalam. 344 00:15:01,520 --> 00:15:06,400 Jika jenis pengguna dalam hello dunia, baik, di mana saya meletakkan ia? 345 00:15:06,400 --> 00:15:07,750 Buffer adalah nilai sampah. 346 00:15:07,750 --> 00:15:11,510 >> Jadi itulah jenis seperti anak panah yang menunjuk siapa tahu di mana. 347 00:15:11,510 --> 00:15:13,880 Mungkin ia menunjuk di sini di ingatan saya. 348 00:15:13,880 --> 00:15:16,560 Dan supaya apabila pengguna jenis di dunia hello, 349 00:15:16,560 --> 00:15:22,380 program ini cuba untuk meletakkan rentetan hello dunia backslash 0 350 00:15:22,380 --> 00:15:23,910 kerana sebahagian memori. 351 00:15:23,910 --> 00:15:27,070 Tetapi dengan kebarangkalian yang tinggi, tetapi jelas tidak 100% kebarangkalian, 352 00:15:27,070 --> 00:15:30,440 komputer akan kemudian berlanggar program ini kerana ini bukan 353 00:15:30,440 --> 00:15:32,490 ingatan saya harus dibenarkan untuk menyentuh. 354 00:15:32,490 --> 00:15:36,330 Jadi ringkasnya, program ini adalah boleh dipercayai sama sekali untuk betul-betul sebab itu. 355 00:15:36,330 --> 00:15:38,070 Saya pada dasarnya tidak melakukan apa? 356 00:15:38,070 --> 00:15:42,366 Apakah langkah-langkah yang telah saya ditinggalkan, seperti kita ditinggalkan dengan contoh pertama Binky ini? 357 00:15:42,366 --> 00:15:42,866 Ya? 358 00:15:42,866 --> 00:15:43,710 >> PENONTON: Peruntukan memori? 359 00:15:43,710 --> 00:15:45,001 >> DAVID MALAN: peruntukan Memori. 360 00:15:45,001 --> 00:15:48,400 Saya tidak benar-benar diperuntukkan apa-apa memori untuk tali itu. 361 00:15:48,400 --> 00:15:50,270 Oleh itu, kita boleh menetapkan ini dalam beberapa cara. 362 00:15:50,270 --> 00:15:52,700 Satu, kita boleh memastikan ia mudah dan sebenarnya, kini anda 363 00:15:52,700 --> 00:15:55,116 akan mula melihat kabur yang garis antara apa 364 00:15:55,116 --> 00:15:58,520 array, apa tali adalah, apa yang char bintang ini, apa yang pelbagai aksara 365 00:15:58,520 --> 00:15:59,020 adalah. 366 00:15:59,020 --> 00:16:02,450 Berikut adalah contoh yang kedua yang melibatkan tali dan notis 367 00:16:02,450 --> 00:16:05,690 semua yang saya lakukan di talian 16 adalah, daripada berkata 368 00:16:05,690 --> 00:16:09,530 penampan yang akan menjadi char bintang, penunjuk kepada sebahagian memori, 369 00:16:09,530 --> 00:16:14,057 Saya akan memberikan yang proaktif diri saya penampan bagi 16 aksara, 370 00:16:14,057 --> 00:16:16,390 dan sebenarnya, jika anda sudah biasa dengan buffering istilah, 371 00:16:16,390 --> 00:16:20,570 mungkin dari dunia video, mana video adalah buffering, buffering, 372 00:16:20,570 --> 00:16:21,175 buffering. 373 00:16:21,175 --> 00:16:22,550 Nah, apa yang berkaitan di sini? 374 00:16:22,550 --> 00:16:24,960 Nah, Di dalam YouTube dan di dalam pemain video 375 00:16:24,960 --> 00:16:27,200 secara amnya adalah array yang lebih besar daripada 16. 376 00:16:27,200 --> 00:16:30,340 Ia mungkin pelbagai saiz satu megabait, mungkin 10 megabait, 377 00:16:30,340 --> 00:16:34,330 dan ke dalam pelbagai yang tidak penyemak imbas anda turun sejumlah bait, 378 00:16:34,330 --> 00:16:37,500 sejumlah besar megabait video, dan pemain video, 379 00:16:37,500 --> 00:16:40,930 YouTube atau sesiapa yang, bermula membaca bait dari pelbagai itu, 380 00:16:40,930 --> 00:16:43,530 dan bila-bila masa anda melihat perkataan buffering, buffering, 381 00:16:43,530 --> 00:16:46,350 ini bermakna pemain mempunyai mendapat ke akhir array itu. 382 00:16:46,350 --> 00:16:50,430 Rangkaian ini sangat pelan dan ia tidak mempunyai diisi semula array dengan lebih bytes 383 00:16:50,430 --> 00:16:55,610 dan supaya anda berada di luar bit untuk dipaparkan kepada pengguna. 384 00:16:55,610 --> 00:16:59,430 >> Jadi penampan adalah istilah apt di sini kerana ia hanya pelbagai, sebahagian memori. 385 00:16:59,430 --> 00:17:02,530 Dan ini akan memperbaikinya kerana ia ternyata 386 00:17:02,530 --> 00:17:07,410 bahawa anda boleh merawat tatasusunan seolah-olah mereka alamat, walaupun penampan 387 00:17:07,410 --> 00:17:10,710 hanya simbol, ia adalah satu jujukan aksara, penampan, 388 00:17:10,710 --> 00:17:14,760 yang berguna untuk saya, pengaturcara, anda boleh lulus namanya sekitar 389 00:17:14,760 --> 00:17:17,079 seolah-olah ia adalah suatu penunjuk, seolah-olah ia 390 00:17:17,079 --> 00:17:21,000 adalah alamat sebahagian yang memori untuk 16 aksara. 391 00:17:21,000 --> 00:17:24,530 Jadi, itu untuk mengatakan, saya boleh lulus scanf betul-betul perkataan yang 392 00:17:24,530 --> 00:17:30,670 dan demikian sekarang, jika saya membuat program ini, membuat scanf 2, dot slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 dan taip hello dunia, Enter, time-- yang 394 00:17:35,386 --> 00:17:37,590 >> Hmm, apa yang berlaku? 395 00:17:37,590 --> 00:17:39,340 String sila. 396 00:17:39,340 --> 00:17:41,430 Apa yang saya buat salah? 397 00:17:41,430 --> 00:17:43,800 Hello dunia, penampan. 398 00:17:43,800 --> 00:17:44,705 Hai dunia. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, saya tahu apa yang ia lakukan. 401 00:17:49,420 --> 00:17:49,920 OKAY. 402 00:17:49,920 --> 00:17:51,628 Jadi ia membaca sehingga sehingga ruang yang pertama. 403 00:17:51,628 --> 00:17:55,680 Jadi mari kita menipu untuk hanya seketika dan mengatakan saya hanya mahu menaip sesuatu 404 00:17:55,680 --> 00:18:01,408 benar-benar panjang seperti ini adalah ayat yang panjang itulah salah satu, dua, tiga, empat, lima, 405 00:18:01,408 --> 00:18:04,420 enam, tujuh, lapan, sembilan, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 OKAY. 407 00:18:05,300 --> 00:18:07,600 Sesungguhnya ia adalah hukuman yang panjang. 408 00:18:07,600 --> 00:18:10,710 Jadi ayat ini adalah lebih lama daripada 16 aksara 409 00:18:10,710 --> 00:18:13,670 Dan setelah saya tekan Enter, apa yang akan berlaku? 410 00:18:13,670 --> 00:18:16,940 Nah, dalam kes ini daripada penampan cerita, saya telah mengisytiharkan 411 00:18:16,940 --> 00:18:22,190 untuk benar-benar menjadi array dengan 16 aksara bersedia untuk pergi. 412 00:18:22,190 --> 00:18:27,426 Jadi, satu, dua, tiga, empat, lima, enam, tujuh, lapan, 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 aksara, dan kini, apabila saya membaca dalam sesuatu seperti ini adalah yang panjang 415 00:18:34,410 --> 00:18:43,950 ayat, apa yang akan berlaku adalah bahawa saya akan membaca yang demikian mengandungi satu lama 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, hukuman. 417 00:18:49,660 --> 00:18:52,270 >> Jadi ini adalah sengaja perkara yang tidak baik yang saya 418 00:18:52,270 --> 00:18:55,060 terus menulis di luar sempadan pelbagai saya, 419 00:18:55,060 --> 00:18:56,660 luar sempadan penampan saya. 420 00:18:56,660 --> 00:19:00,100 Saya boleh mendapatkan bertuah dan program akan terus berjalan dan tidak peduli, 421 00:19:00,100 --> 00:19:03,450 tetapi secara umumnya bercakap, ini sesungguhnya akan kemalangan program saya, 422 00:19:03,450 --> 00:19:06,440 dan ia adalah pepijat dalam saya kod masa ini saya melangkah 423 00:19:06,440 --> 00:19:08,576 di luar sempadan array itu, kerana saya 424 00:19:08,576 --> 00:19:10,450 tidak tahu jika ia semestinya akan crash 425 00:19:10,450 --> 00:19:12,120 atau jika saya hanya akan mendapat bertuah. 426 00:19:12,120 --> 00:19:15,750 Jadi ini adalah bermasalah kerana dalam kes ini, ia seolah-olah untuk bekerja 427 00:19:15,750 --> 00:19:20,931 dan mari kita menggoda nasib di sini, walaupun IDE seolah-olah bertolak ansur dengan agak sedikit 428 00:19:20,931 --> 00:19:21,430 daripada- 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 saya satu-satunya yang boleh melihat ini. 432 00:19:26,470 --> 00:19:29,630 Jadi saya hanya mempunyai banyak menaip menyeronokkan daripada frasa yang sebenar benar-benar panjang 433 00:19:29,630 --> 00:19:32,800 bahawa ia pasti melebihi 16 bait, kerana saya 434 00:19:32,800 --> 00:19:38,050 ditaip dalam berbilang talian ini lama gila frasa, dan kemudian melihat apa yang berlaku. 435 00:19:38,050 --> 00:19:41,110 Program ini cuba mencetaknya dan ketika ia kesalahan segmentasi 436 00:19:41,110 --> 00:19:44,430 dan kesalahan segmentasi adalah apabila sesuatu seperti ini berlaku 437 00:19:44,430 --> 00:19:47,650 dan sistem operasi itu berkata tidak, tidak boleh menyentuh memori itu. 438 00:19:47,650 --> 00:19:49,570 Kita akan membunuh program ini sama sekali. 439 00:19:49,570 --> 00:19:51,180 >> Jadi ini kelihatan bermasalah. 440 00:19:51,180 --> 00:19:54,540 Saya telah menyempurnakan program di mana sekurang-kurangnya mempunyai beberapa memori, 441 00:19:54,540 --> 00:19:58,000 tetapi ini akan kelihatan untuk menghadkan fungsi GetString untuk mendapat 442 00:19:58,000 --> 00:20:00,780 tali panjang lebar terhingga 16. 443 00:20:00,780 --> 00:20:04,200 Jadi, jika anda mahu menyokong lagi ayat daripada 16 aksara, 444 00:20:04,200 --> 00:20:04,880 apa yang awak buat? 445 00:20:04,880 --> 00:20:07,970 Dengan baik, anda boleh meningkatkan saiz penimbal ini kepada 32 446 00:20:07,970 --> 00:20:09,190 atau bahawa seolah-olah jenis pendek. 447 00:20:09,190 --> 00:20:12,260 Apa kata kita hanya membuat ia 1000 tetapi menolak kembali. 448 00:20:12,260 --> 00:20:17,100 Apakah sambutan yang intuitif daripada hanya mengelakkan masalah ini dengan membuat 449 00:20:17,100 --> 00:20:20,660 penampan saya lebih besar, seperti 1000 aksara? 450 00:20:20,660 --> 00:20:23,470 Dengan melaksanakan 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 PENONTON: Jika anda mengikat banyak ruang dan anda tidak menggunakannya, 454 00:20:30,574 --> 00:20:33,500 maka anda tidak boleh mengagihkan semula ruang itu. 455 00:20:33,500 --> 00:20:34,500 DAVID MALAN: Sudah tentu. 456 00:20:34,500 --> 00:20:38,480 Ia membazir setakat yang jika tidak benar-benar memerlukan 900 orang bytes 457 00:20:38,480 --> 00:20:41,057 tetapi anda meminta 1000 dalam jumlah anyway, 458 00:20:41,057 --> 00:20:44,140 anda hanya memakan lebih banyak memori pada komputer pengguna daripada apa yang anda perlu, 459 00:20:44,140 --> 00:20:45,740 dan selepas semua, sebahagian daripada anda telah dihadapi 460 00:20:45,740 --> 00:20:47,620 dalam kehidupan apabila anda berada menjalankan banyak program 461 00:20:47,620 --> 00:20:50,470 dan mereka makan sehingga banyak memori, ini sebenarnya boleh memberi kesan kepada prestasi 462 00:20:50,470 --> 00:20:52,220 dan pengalaman pengguna pada komputer. 463 00:20:52,220 --> 00:20:56,090 Jadi itulah jenis penyelesaian malas, yang pasti, dan sebaliknya, 464 00:20:56,090 --> 00:21:00,140 ia bukan sahaja membazir, apa masalah masih kekal, walaupun saya membuat penampan saya 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Ya? 467 00:21:02,600 --> 00:21:04,475 >> PENONTON: Rentetan adalah panjang 1,001. 468 00:21:04,475 --> 00:21:05,350 DAVID MALAN: Tepat sekali. 469 00:21:05,350 --> 00:21:08,280 Jika tali anda adalah panjang 1001, anda mempunyai masalah yang sama, 470 00:21:08,280 --> 00:21:10,705 dan dengan hujah saya, saya akan hanya kemudian menjadikan tahun 2000, 471 00:21:10,705 --> 00:21:12,830 tetapi anda tidak tahu dalam memajukan berapa besar yang sepatutnya, 472 00:21:12,830 --> 00:21:16,890 dan lagi, saya perlu menyusun program saya sebelum membiarkan orang menggunakan dan memuat turun 473 00:21:16,890 --> 00:21:17,390 ia. 474 00:21:17,390 --> 00:21:21,490 Jadi ini adalah betul-betul jenis barangan bahawa CS50 perpustakaan try 475 00:21:21,490 --> 00:21:24,750 untuk membantu kami dengan dan kami akan hanya pandang di beberapa pelaksanaan asas 476 00:21:24,750 --> 00:21:29,790 di sini, tetapi ini adalah CS50 dot C. Ini adalah fail yang sudah di CS50 IDE 477 00:21:29,790 --> 00:21:31,420 semua minggu ini yang anda telah gunakan. 478 00:21:31,420 --> 00:21:34,280 Ia pra-disusun dan anda telah telah menggunakan ia secara automatik 479 00:21:34,280 --> 00:21:38,780 dengan sifat yang mempunyai melontarkan L CS50 bendera dengan dilafaz, 480 00:21:38,780 --> 00:21:42,300 tetapi jika saya tatal ke bawah melalui semua fungsi-fungsi ini, di sini adalah GetString, 481 00:21:42,300 --> 00:21:44,636 dan hanya untuk memberikan anda satu rasa apa yang berlaku, 482 00:21:44,636 --> 00:21:46,760 mari kita lihat cepat pada kerumitan relatif. 483 00:21:46,760 --> 00:21:48,870 Ia bukan yang lama hilang fungsi, tetapi kita tidak 484 00:21:48,870 --> 00:21:52,530 perlu berfikir keras tentang semua bagaimana untuk pergi tentang mendapatkan tali. 485 00:21:52,530 --> 00:21:55,660 >> Jadi di sini adalah penampan saya dan saya nampaknya memulakan ia ke nol. 486 00:21:55,660 --> 00:21:57,990 Ini, sudah tentu, adalah perkara yang sama seperti char bintang, 487 00:21:57,990 --> 00:22:00,585 tetapi saya mengambil keputusan dalam melaksanakan perpustakaan CS50 488 00:22:00,585 --> 00:22:02,460 bahawa jika kita akan benar-benar dinamik, 489 00:22:02,460 --> 00:22:05,770 Saya tidak tahu terlebih dahulu berapa besar daripada pengguna rentetan akan mahu untuk mendapatkan. 490 00:22:05,770 --> 00:22:08,140 Jadi, saya akan memulakan dengan hanya rentetan kosong 491 00:22:08,140 --> 00:22:11,507 dan saya akan membina sebanyak memori yang saya perlukan untuk muat rentetan pengguna 492 00:22:11,507 --> 00:22:13,340 dan jika saya tidak mempunyai cukup, saya akan bertanya 493 00:22:13,340 --> 00:22:15,010 sistem operasi untuk lebih banyak memori. 494 00:22:15,010 --> 00:22:17,510 Saya akan bergerak rentetan mereka menjadi sebahagian yang lebih besar memori 495 00:22:17,510 --> 00:22:21,847 dan saya akan melepaskan atau membebaskan sebahagian tidak cukup memori yang besar 496 00:22:21,847 --> 00:22:23,680 dan kami hanya akan untuk melakukan ini secara berulang. 497 00:22:23,680 --> 00:22:25,570 >> Jadi pandangan yang cepat, di sini hanya pembolehubah 498 00:22:25,570 --> 00:22:28,780 yang aku nak untuk mengesan kapasiti penimbal saya. 499 00:22:28,780 --> 00:22:30,071 Berapa banyak bait yang boleh saya patut? 500 00:22:30,071 --> 00:22:32,070 Berikut adalah n ubah dengan yang saya akan menjaga 501 00:22:32,070 --> 00:22:36,200 mengesan berapa banyak bait sebenarnya dalam penampan atau pengguna itu telah ditaip. 502 00:22:36,200 --> 00:22:39,900 Jika anda tidak melihat ini sebelum ini, anda boleh menentukan bahawa pembolehubah seperti int 503 00:22:39,900 --> 00:22:46,370 adalah tidak ditandatangani, yang seperti namanya, bermakna ia bukan negatif, dan mengapa akan 504 00:22:46,370 --> 00:22:50,590 Yang pernah saya mahu mengganggu dengan menjelaskan jika yang int bukan sahaja int, 505 00:22:50,590 --> 00:22:52,540 tetapi ia int tidak ditandatangani? 506 00:22:52,540 --> 00:22:55,064 Ia adalah satu int bukan negatif. 507 00:22:55,064 --> 00:22:56,355 Apakah yang dikatakan [didengar] bermakna? 508 00:22:56,355 --> 00:22:58,910 >> PENONTON: Ia menggambarkan jumlah yang memori yang boleh [didengar]. 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 tidak ditandatangani, ini sebenarnya memberikan anda satu bit memori tambahan 511 00:23:03,710 --> 00:23:07,440 dan ia seolah-olah jenis bodoh, tetapi jika anda mempunyai satu sedikit memori tambahan, yang 512 00:23:07,440 --> 00:23:09,940 bermakna anda mempunyai dua kali ganda nilai yang anda boleh mewakili, 513 00:23:09,940 --> 00:23:11,570 kerana ia boleh menjadi 0 atau 1. 514 00:23:11,570 --> 00:23:14,660 Jadi secara lalai, int boleh kira-kira negatif 2000000000 sepanjang jalan 515 00:23:14,660 --> 00:23:16,030 sehingga positif 2 bilion. 516 00:23:16,030 --> 00:23:18,540 Mereka adalah julat yang besar, tetapi ia masih sejenis membazir 517 00:23:18,540 --> 00:23:21,280 jika anda hanya mengambil berat tentang saiz, yang hanya mengikut gerak hati 518 00:23:21,280 --> 00:23:24,620 harus bukan negatif atau positif atau 0, dan kemudian, 519 00:23:24,620 --> 00:23:28,884 mengapa engkau membuang 2000000000 nilai yang mungkin bagi nombor 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 tidak ditandatangani, kini saya boleh int antara 0 dan kira-kira 4 bilion. 522 00:23:35,350 --> 00:23:39,280 >> Jadi di sini adalah hanya int C atas sebab-sebab kami tidak akan masuk ke dalam tadi sebagai 523 00:23:39,280 --> 00:23:42,280 mengapa ia adalah satu int sebaliknya char, tetapi di sini adalah 524 00:23:42,280 --> 00:23:44,630 intipati apa yang berlaku pada, dan sebahagian dari kamu 525 00:23:44,630 --> 00:23:48,340 mungkin menggunakan, sebagai contoh, fungsi fgetc walaupun dalam pset empat 526 00:23:48,340 --> 00:23:51,580 atau selepas itu, kita akan melihat ia lagi dalam masalah menetapkan lima, 527 00:23:51,580 --> 00:23:55,410 fgetc adalah baik kerana sebagai nama jenis, jenis arcanely mencadangkan, 528 00:23:55,410 --> 00:23:57,940 ia adalah fungsi yang mendapat watak dan sebagainya, 529 00:23:57,940 --> 00:24:00,690 apa yang pada asasnya berbeza tentang apa yang kita lakukan dalam 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 menjalar di sepanjang langkah demi langkah atas apa sahaja yang pengguna itu telah ditaip dalam, 532 00:24:07,550 --> 00:24:10,970 kerana kita sentiasa boleh memperuntukkan satu char, dan dengan itu kita boleh sentiasa selamat 533 00:24:10,970 --> 00:24:15,599 melihat satu char pada satu masa, dan sihir mula berlaku di sini. 534 00:24:15,599 --> 00:24:17,890 Saya akan tatal ke bawah ke pertengahan fungsi ini 535 00:24:17,890 --> 00:24:20,360 hanya untuk memperkenalkan secara ringkas fungsi ini. 536 00:24:20,360 --> 00:24:22,670 Sama seperti ada Fungsi malloc, ada 537 00:24:22,670 --> 00:24:27,740 fungsi realloc mana realloc membolehkan anda mengagihkan semula sebahagian memori 538 00:24:27,740 --> 00:24:29,570 dan menjadikannya lebih besar atau lebih kecil. 539 00:24:29,570 --> 00:24:33,060 Cerita jadi pendek dan panjang dengan menggerakkan tangan saya untuk hari ini, 540 00:24:33,060 --> 00:24:35,620 tahu bahawa apa yang GetString yang dilakukannya adalah ia semacam 541 00:24:35,620 --> 00:24:39,720 daripada ajaib tumbuh atau mengecut penampan sebagai pengguna 542 00:24:39,720 --> 00:24:41,440 jenis yang masing-masing tali. 543 00:24:41,440 --> 00:24:43,962 >> Jadi, jika jenis pengguna yang tali pendek, kod ini 544 00:24:43,962 --> 00:24:45,920 hanya memperuntukkan cukup memori untuk muat tali. 545 00:24:45,920 --> 00:24:48,086 Jika pengguna terus menaip seperti yang saya lakukan lagi dan lagi 546 00:24:48,086 --> 00:24:50,330 dan sekali lagi, baik, jika ini penampan mulanya ini besar 547 00:24:50,330 --> 00:24:53,310 dan program menyedari, untuk tunggu sebentar, saya keluar dari ruang, 548 00:24:53,310 --> 00:24:55,410 ia akan menggandakan saiz penimbal 549 00:24:55,410 --> 00:24:59,110 dan kemudian dua kali ganda saiz penimbal dan kod yang melakukan dua kali ganda itu, 550 00:24:59,110 --> 00:25:03,170 jika kita lihat di sini, ia hanya ini pandai satu liner. 551 00:25:03,170 --> 00:25:06,830 Anda tidak mungkin telah melihat sintaks ini sebelum ini, tetapi jika anda mengatakan bintang sama, 552 00:25:06,830 --> 00:25:10,470 ini adalah perkara yang sama seperti berkata kali kapasiti 2. 553 00:25:10,470 --> 00:25:13,390 Oleh itu, ia hanya menyimpan dua kali ganda kapasiti penimbal 554 00:25:13,390 --> 00:25:17,480 dan kemudian memberitahu realloc untuk memberi sendiri bahawa memori banyak lagi. 555 00:25:17,480 --> 00:25:19,720 >> Sekarang, sebagai diketepikan, terdapat adalah fungsi lain di sini 556 00:25:19,720 --> 00:25:23,680 bahawa kita tidak akan melihat ke dalam apa-apa butiran selain daripada untuk menunjukkan dalam GetInt, 557 00:25:23,680 --> 00:25:26,150 kita menggunakan GetString dalam GetInt. 558 00:25:26,150 --> 00:25:28,192 Kami pastikan bahawa ia tidak batal, yang, ingat, 559 00:25:28,192 --> 00:25:30,400 adalah nilai yang khas yang bermaksud sesuatu yang tidak kena. 560 00:25:30,400 --> 00:25:31,233 Kami keluar dari ingatan. 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 mengembalikan nilai sentinel. 563 00:25:33,710 --> 00:25:37,850 Tetapi saya akan menangguhkan kepada komen-komen untuk mengapa dan maka kita menggunakan sepupu ini scanf 564 00:25:37,850 --> 00:25:42,100 dipanggil sscanf dan ternyata yang scanf sscanf, atau tali, 565 00:25:42,100 --> 00:25:45,310 membolehkan anda mengambil lihat pada baris yang pengguna itu telah ditaip dan membiarkan anda 566 00:25:45,310 --> 00:25:49,610 menganalisis ia pada dasarnya dan apa yang saya lakukan di sini saya memberitahu sscanf, 567 00:25:49,610 --> 00:25:54,440 menganalisis apa sahaja pengguna mempunyai ditaip dan memastikan% i, 568 00:25:54,440 --> 00:25:59,250 terdapat integer di dalamnya, dan kita tidak akan masuk ke dalam hari ini dengan tepat mengapa ada juga 569 00:25:59,250 --> 00:26:03,760 c% di sini, tetapi itu secara ringkas membolehkan kami mengesan jika pengguna telah ditaip 570 00:26:03,760 --> 00:26:06,050 dalam sesuatu yang palsu selepas nombor. 571 00:26:06,050 --> 00:26:11,766 Jadi sebab yang GetInt dan GetString memberitahu anda untuk mencuba semula, cuba semula, cuba semula 572 00:26:11,766 --> 00:26:13,640 adalah kerana semua bahawa kod kami telah menulis, 573 00:26:13,640 --> 00:26:17,900 ia adalah jenis melihat input pengguna dalam memastikan ia sepenuhnya angka 574 00:26:17,900 --> 00:26:21,700 atau ia adalah satu terapung sebenar nilai mata atau sebagainya, 575 00:26:21,700 --> 00:26:24,233 bergantung kepada apa nilai berfungsi yang anda gunakan. 576 00:26:24,233 --> 00:26:25,060 >> Huh. 577 00:26:25,060 --> 00:26:25,710 OKAY. 578 00:26:25,710 --> 00:26:27,592 Mereka itu adalah satu hal yg tetapi penting di sini adalah 579 00:26:27,592 --> 00:26:29,550 bahawa sebab kami terpaksa mereka roda latihan 580 00:26:29,550 --> 00:26:32,880 adalah kerana pada tahap yang paling rendah, terdapat hanya begitu banyak perkara yang 581 00:26:32,880 --> 00:26:35,674 boleh salah yang kita mahu untuk preemptively mengendalikan 582 00:26:35,674 --> 00:26:38,090 perkara-perkara yang pasti di minggu terawal kelas, 583 00:26:38,090 --> 00:26:42,230 tetapi kini dengan Serangga empat dan lima dan Serangga di luar anda akan melihat bahawa ia lebih kepada 584 00:26:42,230 --> 00:26:45,570 anda tetapi juga anda akan lebih mampu menyelesaikan orang-orang jenis masalah 585 00:26:45,570 --> 00:26:47,180 diri sendiri. 586 00:26:47,180 --> 00:26:51,770 Sebarang pertanyaan mengenai GetString atau GetInt? 587 00:26:51,770 --> 00:26:52,630 Ya? 588 00:26:52,630 --> 00:26:55,130 >> PENONTON: Bagaimana kamu akan menggandakan kapasiti penimbal 589 00:26:55,130 --> 00:26:57,630 bukan hanya meningkatkan oleh jumlah sebenar? 590 00:26:57,630 --> 00:26:58,100 >> DAVID MALAN: Soalan yang baik. 591 00:26:58,100 --> 00:27:00,474 Mengapa kita akan menggandakan kapasiti penimbal yang bertentangan 592 00:27:00,474 --> 00:27:02,800 hanya meningkatkannya oleh beberapa nilai malar? 593 00:27:02,800 --> 00:27:03,900 Ia merupakan satu keputusan reka bentuk. 594 00:27:03,900 --> 00:27:08,590 Kami hanya membuat keputusan itu kerana ia cenderung untuk menjadi sedikit mahal masa-bijak untuk bertanya 595 00:27:08,590 --> 00:27:10,440 sistem operasi untuk ingatan, kita tidak 596 00:27:10,440 --> 00:27:13,210 mahu berakhir masuk ke kerja kerana tali besar 597 00:27:13,210 --> 00:27:14,960 bahawa kita telah meminta OS lagi dan lagi 598 00:27:14,960 --> 00:27:17,500 dan sekali lagi dan sekali lagi pada masa yang singkat untuk ingatan. 599 00:27:17,500 --> 00:27:20,387 Oleh itu, kita hanya membuat keputusan, agak sewenang-wenangnya tetapi kami berharap munasabah, 600 00:27:20,387 --> 00:27:22,720 itu, anda tahu apa, mari kita cuba untuk mendapatkan lebih awal daripada diri kita sendiri 601 00:27:22,720 --> 00:27:25,520 dan hanya menyimpan dua kali ganda ia supaya kita mengurangkan jumlah kali 602 00:27:25,520 --> 00:27:29,010 kita perlu memanggil malloc atau realloc, tetapi jumlah penghakiman 603 00:27:29,010 --> 00:27:31,820 panggilan jika tiada mengetahui apa yang pengguna mungkin mahu menaip. 604 00:27:31,820 --> 00:27:33,600 Kedua-dua cara boleh dipertikaikan. 605 00:27:33,600 --> 00:27:35,430 Boleh dikatakan baik. 606 00:27:35,430 --> 00:27:39,240 >> Oleh itu, mari kita lihat pada pasangan kesan sampingan lain ingatan, 607 00:27:39,240 --> 00:27:41,610 perkara-perkara yang boleh pergi salah dan alat-alat yang anda boleh 608 00:27:41,610 --> 00:27:43,880 gunakan untuk menangkap jenis-jenis kesilapan. 609 00:27:43,880 --> 00:27:47,800 Ia ternyata anda semua, walaupun check50 tidak memberitahu anda sebanyak, 610 00:27:47,800 --> 00:27:50,050 telah menulis kereta Kod sejak minggu satu, 611 00:27:50,050 --> 00:27:53,630 walaupun semua ujian check50 adalah berlalu, dan walaupun anda dan TF anda 612 00:27:53,630 --> 00:27:56,010 super yakin kod anda berfungsi seperti yang sepatutnya. 613 00:27:56,010 --> 00:27:59,190 Kod anda telah kereta atau boleh dipercayai sama sekali kerana anda semua, 614 00:27:59,190 --> 00:28:02,540 dalam menggunakan perpustakaan CS50, telah bocor ingatan. 615 00:28:02,540 --> 00:28:06,040 Anda telah meminta sistem operasi untuk ingatan dalam kebanyakan program 616 00:28:06,040 --> 00:28:08,850 anda tulis, tetapi anda telah sebenarnya tidak pernah diberikan kembali. 617 00:28:08,850 --> 00:28:12,110 Anda dipanggil GetString dan GetInt dan GetFloat, 618 00:28:12,110 --> 00:28:15,270 tetapi dengan GetString, anda telah pernah dipanggil unGetString atau Berikan 619 00:28:15,270 --> 00:28:19,890 String Belakang atau sebagainya, tetapi kami telah lihat yang GetString tidak memperuntukkan 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 hampir sama di hadapan Allah, dan lagi, kita telah 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 diketepikan, ternyata bahawa apabila suatu program berhenti, kesemua memori yang 625 00:28:33,550 --> 00:28:34,870 secara automatik dibebaskan. 626 00:28:34,870 --> 00:28:36,150 Jadi ia tidak perjanjian yang besar. 627 00:28:36,150 --> 00:28:38,590 Ia tidak akan memecahkan IDE atau benda perlahan ke bawah, 628 00:28:38,590 --> 00:28:40,670 tetapi apabila program melakukan umumnya kebocoran memori 629 00:28:40,670 --> 00:28:42,170 dan mereka berjalan untuk masa yang lama. 630 00:28:42,170 --> 00:28:45,640 Jika anda pernah melihat sedikit bodoh bola pantai dalam Mac OS atau hourglass 631 00:28:45,640 --> 00:28:51,160 pada Windows di mana ia adalah jenis memperlahankan atau berfikir atau pemikiran 632 00:28:51,160 --> 00:28:53,770 atau hanya benar-benar mula perlahan merangkak, 633 00:28:53,770 --> 00:28:56,960 sangat mungkin boleh menjadi hasil daripada kebocoran memori. 634 00:28:56,960 --> 00:28:59,970 Pengaturcara yang menulis perisian yang anda gunakan 635 00:28:59,970 --> 00:29:03,570 meminta sistem operasi untuk ingatan setiap beberapa minit, setiap jam. 636 00:29:03,570 --> 00:29:05,570 Tetapi jika anda menjalankan perisian, walaupun ia 637 00:29:05,570 --> 00:29:08,680 dikurangkan dalam komputer anda berjam-jam atau hari pada akhir, 638 00:29:08,680 --> 00:29:11,980 anda mungkin akan meminta lebih dan lebih memori dan tidak pernah benar-benar menggunakannya 639 00:29:11,980 --> 00:29:15,180 dan sebagainya kod anda mungkin, atau program mungkin bocor memori, 640 00:29:15,180 --> 00:29:18,350 dan jika anda mula bocor memori, ada ingatan kurang untuk program lain, 641 00:29:18,350 --> 00:29:21,220 dan kesan ini adalah untuk memperlahankan semua turun. 642 00:29:21,220 --> 00:29:23,600 >> Sekarang, ini adalah setakat ini salah satu program yang paling kejam 643 00:29:23,600 --> 00:29:26,350 anda akan mempunyai peluang berjalan di CS50 setakat 644 00:29:26,350 --> 00:29:31,650 sebagai output adalah lebih esoterik daripada yang dilafaz atau membuat atau mana-mana arahan 645 00:29:31,650 --> 00:29:35,930 program talian kami telah berjalan sebelum ini tetapi bersyukur, tertanam dalam output 646 00:29:35,930 --> 00:29:39,810 adalah beberapa tips yang berguna yang super akan berguna sama ada untuk pset empat 647 00:29:39,810 --> 00:29:41,510 atau pasti Serangga lima. 648 00:29:41,510 --> 00:29:44,250 Jadi valgrind adalah alat yang yang boleh 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 Ia agak mudah untuk menjalankan. 651 00:29:48,570 --> 00:29:51,420 Anda menjalankan valgrind dan kemudian, walaupun walaupun ia adalah satu lantung sedikit, 652 00:29:51,420 --> 00:29:54,440 dash dash kebocoran daftar sama penuh, dan kemudian dot 653 00:29:54,440 --> 00:29:56,320 mengurangkan dan nama program anda. 654 00:29:56,320 --> 00:30:00,010 Jadi valgrind akan menjalankan program anda dan bagi mereka yang terkemudian program anda 655 00:30:00,010 --> 00:30:02,240 berjalan sebelum ia berhenti dan memberikan anda satu lagi segera, 656 00:30:02,240 --> 00:30:04,980 ia akan menganalisis anda program semasa ia telah berjalan 657 00:30:04,980 --> 00:30:07,740 dan memberitahu anda adakah anda bocor apa-apa memori dan lebih baik lagi, 658 00:30:07,740 --> 00:30:10,610 adakah anda menyentuh memori yang bukan milik anda? 659 00:30:10,610 --> 00:30:13,700 Ia tidak boleh menangkap segala-galanya, tetapi ia cukup baik menangkap perkara yang paling. 660 00:30:13,700 --> 00:30:19,700 >> Jadi di sini adalah satu contoh yang mempunyai jangka saya program ini, mempunyai jangka valgrind, 661 00:30:19,700 --> 00:30:21,470 pada program yang dikenali sebagai ingatan, dan saya akan 662 00:30:21,470 --> 00:30:24,730 untuk menyerlahkan garisan yang akhirnya menarik kepada kami. 663 00:30:24,730 --> 00:30:27,690 Jadi ada lebih gangguan bahawa saya telah dipadamkan dari slaid. 664 00:30:27,690 --> 00:30:30,930 Tetapi mari kita lihat apa ini program mampu memberitahu kita. 665 00:30:30,930 --> 00:30:34,800 Ia mampu memberitahu kita perkara-perkara seperti menulis tidak sah saiz 4. 666 00:30:34,800 --> 00:30:38,020 Dalam erti kata lain, jika anda menyentuh memori, khusus 4 bait memori 667 00:30:38,020 --> 00:30:40,350 bahawa anda tidak perlu mempunyai, valgrind boleh memberitahu anda bahawa. 668 00:30:40,350 --> 00:30:41,660 Menulis tak sah saiz 4. 669 00:30:41,660 --> 00:30:43,640 Anda menyentuh empat bait bahawa anda tidak perlu mempunyai. 670 00:30:43,640 --> 00:30:44,840 Dari mana kamu berbuat demikian? 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 ia membantu. 673 00:30:50,000 --> 00:30:53,410 Sama seperti GDB, ia boleh membantu menunjukkan anda di ralat sebenar. 674 00:30:53,410 --> 00:30:57,170 >> Sekarang, yang satu ini adalah lebih sedikit banyak cakap, jika tidak mengelirukan. 675 00:30:57,170 --> 00:31:01,307 40 bait dalam 1 blok pasti hilang dalam kehilangan rekod 1 daripada 1. 676 00:31:01,307 --> 00:31:02,140 Apa maksudnya? 677 00:31:02,140 --> 00:31:05,920 Nah, itu hanya bermakna anda meminta 40 bait dan pernah bapa memberikan kembali. 678 00:31:05,920 --> 00:31:08,930 Anda dipanggil malloc atau anda dipanggil GetString dan sistem operasi 679 00:31:08,930 --> 00:31:12,450 memberikan anda 40 bait, tetapi anda tidak pernah dibebaskan atau dilepaskan memori, 680 00:31:12,450 --> 00:31:15,400 dan untuk berlaku adil, kita tidak pernah menunjukkan anda bagaimana untuk mengembalikan ingatan. 681 00:31:15,400 --> 00:31:17,910 Rupa-rupanya ada yang super fungsi mudah dipanggil percuma. 682 00:31:17,910 --> 00:31:21,170 Mengambil satu hujah, perkara yang anda mahu untuk membebaskan atau memberikan kembali, 683 00:31:21,170 --> 00:31:23,430 tetapi 40 bait, nampaknya, dalam program ini 684 00:31:23,430 --> 00:31:27,300 telah hilang di garisan 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 Ia sangat berguna. 687 00:31:31,020 --> 00:31:33,980 Ia hanya menunjukkan ini ralat 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, notis, panggilan fungsi yang dipanggil f dan kemudian pulangan. 690 00:31:39,920 --> 00:31:41,550 Jadi tidak semua yang menarik. 691 00:31:41,550 --> 00:31:42,664 Apakah f lakukan? 692 00:31:42,664 --> 00:31:44,330 Notis saya tidak mengganggu dengan prototaip. 693 00:31:44,330 --> 00:31:46,520 Saya mahu menyimpan kod di seperti yang minimum yang mungkin. 694 00:31:46,520 --> 00:31:49,530 Jadi saya meletakkan f di atas utama dan itu baik, sudah tentu, 695 00:31:49,530 --> 00:31:51,500 bagi program-program pendek seperti ini. 696 00:31:51,500 --> 00:31:56,910 Jadi f tidak kembali apa-apa dan tidak tidak mengambil apa-apa, tetapi ia melakukan ini. 697 00:31:56,910 --> 00:31:59,620 Ia menyatakan, sama seperti dalam contoh Binky ini, 698 00:31:59,620 --> 00:32:02,682 penunjuk dipanggil x yang akan untuk menyimpan alamat int. 699 00:32:02,682 --> 00:32:03,890 Jadi itulah yang sebelah kiri. 700 00:32:03,890 --> 00:32:07,230 Dalam bahasa Inggeris, apakah sebelah kanan buat? 701 00:32:07,230 --> 00:32:09,770 Sesiapa sahaja? 702 00:32:09,770 --> 00:32:13,665 Apakah ini lakukan untuk kita? 703 00:32:13,665 --> 00:32:14,651 Ya? 704 00:32:14,651 --> 00:32:16,623 >> PENONTON: [didengar] kali saiz int 705 00:32:16,623 --> 00:32:19,175 iaitu 10 kali ganda [didengar] 706 00:32:19,175 --> 00:32:20,800 DAVID MALAN: Baik dan biarlah saya ringkaskan. 707 00:32:20,800 --> 00:32:25,480 Jadi memperuntukkan ruang yang mencukupi untuk 10 integer atau 10, apa yang saiz int, 708 00:32:25,480 --> 00:32:29,340 ia empat bait, jadi 10 kali 4 adalah 40, supaya sebelah kanan bahawa saya telah 709 00:32:29,340 --> 00:32:33,930 diserlahkan adalah memberi saya 40 bait dan menyimpan alamat bait pertama 710 00:32:33,930 --> 00:32:34,940 ke x. 711 00:32:34,940 --> 00:32:38,380 Dan kini akhir sekali, dan di sini di mana program ini adalah kereta, apa yang 712 00:32:38,380 --> 00:32:41,540 salah dengan line 21 berdasarkan logik itu? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Apa salahnya dengan line 21? 715 00:32:46,280 --> 00:32:46,780 Ya? 716 00:32:46,780 --> 00:32:49,550 PENONTON: Anda tidak boleh indeks ke x [didengar]. 717 00:32:49,550 --> 00:32:50,300 DAVID MALAN: Ya. 718 00:32:50,300 --> 00:32:52,270 Saya tidak perlu 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, sama seperti anda boleh merawat nama array 721 00:32:56,990 --> 00:33:01,080 seolah-olah ia adalah penunjuk, begitu juga anda boleh merawat penunjuk seolah-olah ia 722 00:33:01,080 --> 00:33:06,425 pelbagai, dan saya boleh sintaksis kata x kurungan sesuatu, x kurungan i, 723 00:33:06,425 --> 00:33:07,800 tetapi 10 adalah bermasalah. 724 00:33:07,800 --> 00:33:09,096 Mengapa? 725 00:33:09,096 --> 00:33:10,910 >> PENONTON: Kerana ia bukan di dalam. 726 00:33:10,910 --> 00:33:12,390 >> DAVID MALAN: Ia bukan dalam bahawa sebahagian memori. 727 00:33:12,390 --> 00:33:15,306 Apakah nilai terbesar yang perlu saya dapat meletakkan dalam orang-orang kurungan persegi? 728 00:33:15,306 --> 00:33:16,870 9, 0 hingga 9. 729 00:33:16,870 --> 00:33:18,160 Kerana pengindeksan sifar. 730 00:33:18,160 --> 00:33:20,190 Jadi 0 hingga 9 akan menjadi baik. 731 00:33:20,190 --> 00:33:23,960 Kurungan 10 tidak baik dan tetapi, ingat walaupun, setiap kali 732 00:33:23,960 --> 00:33:27,017 Saya seolah-olah cuba untuk membuat CS50 IDE kemalangan dengan menaip dalam nilai-nilai palsu, 733 00:33:27,017 --> 00:33:29,100 ia tidak sentiasa bekerjasama, dan sesungguhnya, anda sering 734 00:33:29,100 --> 00:33:31,460 mendapatkan bertuah hanya kerana sistem operasi tidak 735 00:33:31,460 --> 00:33:35,467 melihat bahawa anda pernah jadi sedikit lulus beberapa sebahagian memori, 736 00:33:35,467 --> 00:33:38,300 kerana anda menginap di dalam teknikal segmen anda, tetapi lebih kepada yang 737 00:33:38,300 --> 00:33:40,940 dalam kelas sistem operasi, dan sebagainya seperti ini 738 00:33:40,940 --> 00:33:43,000 dengan mudah dapat tanpa dikesan. 739 00:33:43,000 --> 00:33:48,120 Program anda tidak pernah akan kemalangan konsisten tetapi mungkin sekali dalam seketika. 740 00:33:48,120 --> 00:33:50,610 >> Dan jadi mari kita cuba valgrind mengenai perkara ini, dan di sini 741 00:33:50,610 --> 00:33:52,870 di mana kita akan mendapat terharu oleh output seketika. 742 00:33:52,870 --> 00:34:00,810 Oleh itu, ingatan valgrind kebocoran daftar sama dengan penuh memori dot mengurangkan. 743 00:34:00,810 --> 00:34:03,040 Dan di sini sebabnya saya berjanji ini akan meliputi. 744 00:34:03,040 --> 00:34:05,700 Berikut adalah apa yang valgrind, inilah yang seorang programmer, beberapa tahun ago- 745 00:34:05,700 --> 00:34:08,469 memutuskan ia akan menjadi satu idea yang baik untuk output kelihatan 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 cara di tangan meninggalkan sampingan tanpa sebab yang baik 748 00:34:13,120 --> 00:34:16,620 adalah ID proses program kita hanya berjalan, pengecam unik 749 00:34:16,620 --> 00:34:18,030 untuk program ini kita hanya berlari. 750 00:34:18,030 --> 00:34:19,738 Kami dipadam bahawa dari slaid, tetapi ada 751 00:34:19,738 --> 00:34:22,190 adalah beberapa maklumat yang berguna di sini. 752 00:34:22,190 --> 00:34:24,684 >> Mari kita tatal ke atas ke bahagian paling atas. 753 00:34:24,684 --> 00:34:25,600 Berikut adalah di mana kita bermula. 754 00:34:25,600 --> 00:34:27,040 Jadi bukan semua output yang banyak. 755 00:34:27,040 --> 00:34:30,429 Berikut adalah yang menulis tidak sah saiz 4 di talian 21. 756 00:34:30,429 --> 00:34:31,760 Nah, apa yang line 21? 757 00:34:31,760 --> 00:34:34,500 Line 21 adalah betul-betul ini dan ia masuk akal 758 00:34:34,500 --> 00:34:37,290 bahawa saya dalam sah menulis 4 bait kerana saya 759 00:34:37,290 --> 00:34:40,389 cuba untuk meletakkan integer ini, yang boleh menjadi apa-apa, 760 00:34:40,389 --> 00:34:42,370 ia hanya berlaku untuk menjadi sifar, tetapi saya cuba 761 00:34:42,370 --> 00:34:44,940 untuk meletakkan ia di lokasi yang yang bukan milik kepada saya. 762 00:34:44,940 --> 00:34:50,900 Selain itu, turun di sini, 40 bait dalam salah satu blok pasti hilang dalam rekod 1. 763 00:34:50,900 --> 00:34:56,500 Ini kerana apabila saya memanggil malloc di sini, saya sebenarnya tidak pernah membebaskan memori. 764 00:34:56,500 --> 00:34:58,140 >> Jadi bagaimana kita boleh menetapkan ini? 765 00:34:58,140 --> 00:35:02,970 Biar saya pergi ke hadapan dan menjadi sedikit lebih selamat dan tidak terdapat 9 dan biarlah saya di sini percuma 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 kini memutarkan membuat memori dot slash, mari kita berjalan valgrind atas sekali lagi, 768 00:35:11,520 --> 00:35:14,990 memaksimumkan tingkap saya dan tekan Enter. 769 00:35:14,990 --> 00:35:16,900 Sekarang, ia adalah baik. 770 00:35:16,900 --> 00:35:19,590 Mereka mengebumikan berita baik dalam semua output ini. 771 00:35:19,590 --> 00:35:20,810 Semua blok timbunan bebas. 772 00:35:20,810 --> 00:35:23,604 Kita akan kembali kepada apa timbunan itu , tetapi tiada kebocoran yang mungkin. 773 00:35:23,604 --> 00:35:25,520 Jadi ini adalah hanya satu lagi alat untuk kit alat anda 774 00:35:25,520 --> 00:35:30,220 yang anda boleh mula mencari sekarang kesilapan seperti itu. 775 00:35:30,220 --> 00:35:34,532 >> Tetapi mari kita lihat apa banyak lagi yang boleh berlaku di sini. 776 00:35:34,532 --> 00:35:38,890 Mari kita peralihan sekarang untuk sebenarnya menyelesaikan masalah. 777 00:35:38,890 --> 00:35:42,440 Sebagai mengetepikan, jika ini akan melegakan sedikit sedikit kekeliruan atau ketegangan, 778 00:35:42,440 --> 00:35:43,430 ini kini lucu. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Yeah. 781 00:35:46,900 --> 00:35:49,040 Yang cukup baik. 782 00:35:49,040 --> 00:35:50,890 Kerana petunjuk adalah alamat dan alamat 783 00:35:50,890 --> 00:35:53,098 secara umumnya oleh konvensyen ditulis dengan perenambelasan. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, ini adalah lucu sekarang. 785 00:35:54,650 --> 00:35:58,390 Walau bagaimanapun, jadi mari kita kini sebenarnya menyelesaikan masalah. 786 00:35:58,390 --> 00:36:00,840 Ini telah menjadi super, super tahap rendah setakat ini, 787 00:36:00,840 --> 00:36:03,950 dan kita sebenarnya boleh lakukan berguna perkara dengan butir-butir peringkat rendah. 788 00:36:03,950 --> 00:36:06,710 >> Oleh itu, kita memperkenalkan beberapa minggu lalu tanggapan array. 789 00:36:06,710 --> 00:36:09,177 Pelbagai Bagus kerana ia sukar untuk membersihkan kod kami 790 00:36:09,177 --> 00:36:11,760 kerana jika kita mahu menulis program dengan pelbagai pelajar 791 00:36:11,760 --> 00:36:15,270 atau pelbagai nama-nama dan rumah-rumah dan asrama dan kolej dan semua itu, 792 00:36:15,270 --> 00:36:19,430 kita boleh menyimpan segala-galanya lebih bersih di dalam array. 793 00:36:19,430 --> 00:36:23,039 Tetapi mencadangkan satu halangan array setakat ini. 794 00:36:23,039 --> 00:36:26,080 Walaupun anda tidak mengalami sendiri dalam program, hanya naluri, 795 00:36:26,080 --> 00:36:30,870 apa yang perkara yang tidak baik tentang pelbagai, mungkin? 796 00:36:30,870 --> 00:36:32,337 Saya mendengar beberapa murmurs. 797 00:36:32,337 --> 00:36:34,170 PENONTON: Sukar untuk menukar saiz. 798 00:36:34,170 --> 00:36:36,128 DAVID MALAN: Sukar untuk menukar saiz. 799 00:36:36,128 --> 00:36:38,660 Anda tidak boleh mengubah saiz array, sebenarnya, per se 800 00:36:38,660 --> 00:36:43,040 dalam C. Anda boleh memperuntukkan pelbagai lain, bergerak segala-galanya daripada yang lama 801 00:36:43,040 --> 00:36:45,380 ke dalam baru, dan kini mempunyai sedikit ruang tambahan, 802 00:36:45,380 --> 00:36:47,469 tetapi ia tidak seperti yang bahasa seperti Java atau Python 803 00:36:47,469 --> 00:36:49,760 atau mana-mana nombor lain bahasa dengan yang ada di antara kamu 804 00:36:49,760 --> 00:36:52,070 mungkin biasa di mana anda hanya boleh menyimpan menambah perkara-perkara 805 00:36:52,070 --> 00:36:53,930 sampai membosankan ke akhir array. 806 00:36:53,930 --> 00:36:57,880 Apabila anda mempunyai pelbagai saiz 6, iaitu saiz, 807 00:36:57,880 --> 00:37:01,970 dan begitu banyak seperti idea yang lebih awal mempunyai penampan saiz yang tertentu, 808 00:37:01,970 --> 00:37:05,940 anda perlu meneka keluar dari pintu apa saiz yang anda mahu ia menjadi? 809 00:37:05,940 --> 00:37:07,880 Jika anda rasa terlalu besar, anda membuang ruang. 810 00:37:07,880 --> 00:37:10,950 Jika anda rasa terlalu kecil, anda tidak boleh menyimpan data itu, sekurang-kurangnya 811 00:37:10,950 --> 00:37:12,940 tanpa banyak kerja lagi. 812 00:37:12,940 --> 00:37:18,180 >> Jadi hari ini, terima kasih kepada petunjuk, kita boleh mula menjahit bersama-sama adat kita sendiri 813 00:37:18,180 --> 00:37:20,989 struktur data, dan dalam Malah, di sini adalah sesuatu yang 814 00:37:20,989 --> 00:37:23,030 yang kelihatan lebih sedikit samar pada pandangan pertama, 815 00:37:23,030 --> 00:37:26,440 tetapi ini adalah apa yang kita akan memanggil dikaitkan senarai, dan jenis namanya daripada meringkaskan 816 00:37:26,440 --> 00:37:26,940 ia. 817 00:37:26,940 --> 00:37:29,550 Ia adalah satu senarai nombor, atau dalam kes ini, senarai nombor, 818 00:37:29,550 --> 00:37:33,480 tetapi ia boleh menjadi satu senarai apa-apa, tetapi ia dikaitkan bersama-sama dengan cara anak panah, 819 00:37:33,480 --> 00:37:36,380 dan hanya mengambil tekaan dengan apa teknik 820 00:37:36,380 --> 00:37:38,310 kita akan dapat untuk menjahit bersama-sama, 821 00:37:38,310 --> 00:37:42,540 jenis seperti popcorn dengan benang, berpaut senarai segi empat tepat di sini? 822 00:37:42,540 --> 00:37:43,936 Jumlahnya? 823 00:37:43,936 --> 00:37:45,560 Apakah ciri-ciri bahasa yang mendasari? 824 00:37:45,560 --> 00:37:46,350 >> PENONTON: penunjuk A. 825 00:37:46,350 --> 00:37:47,308 >> DAVID MALAN: penunjuk A. 826 00:37:47,308 --> 00:37:51,700 Jadi setiap anak panah ini di sini mewakili penunjuk atau hanya alamat. 827 00:37:51,700 --> 00:37:54,590 Jadi dalam erti kata lain, jika saya mahu untuk menyimpan senarai nombor, 828 00:37:54,590 --> 00:37:59,040 Saya tidak boleh hanya menyimpannya jika saya mahu keupayaan untuk berkembang dan mengecut 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 perlu mempunyai sedikit kecanggihan lanjut, 831 00:38:03,000 --> 00:38:05,720 tetapi notis bahawa ini gambar jenis mencadangkan 832 00:38:05,720 --> 00:38:08,650 bahawa jika anda baru sahaja mendapat benang kecil menghubungkan semua bersama-sama, 833 00:38:08,650 --> 00:38:13,100 mungkin tidak begitu sukar untuk membuat ruang di antara dua daripada segi empat tepat 834 00:38:13,100 --> 00:38:16,750 atau dua daripada nod, seperti yang kita akan mula memanggil mereka, dimasukkan ke dalam nod baru, 835 00:38:16,750 --> 00:38:19,547 dan kemudian dengan beberapa thread baru, hanya parit tiga nod bersama-sama, 836 00:38:19,547 --> 00:38:22,880 yang pertama, yang terakhir, dan yang bahawa anda hanya dimasukkan ke dalam tengah-tengah. 837 00:38:22,880 --> 00:38:26,000 >> Dan sesungguhnya senarai berkaitan, tidak seperti pelbagai, adalah dinamik. 838 00:38:26,000 --> 00:38:27,840 Ia boleh membesar dan ia boleh mengecut dan anda tidak 839 00:38:27,840 --> 00:38:32,434 perlu tahu atau mengambil berat terlebih dahulu bagaimana data banyak yang anda akan dapat menyimpan, 840 00:38:32,434 --> 00:38:35,600 tetapi ternyata kita perlu menjadi sedikit berhati-hati tentang bagaimana untuk melaksanakan ini. 841 00:38:35,600 --> 00:38:39,070 Jadi pertama mari kita fikirkan bagaimana kita melaksanakan salah satu segi empat tepat sedikit. 842 00:38:39,070 --> 00:38:40,690 Ia mudah untuk melaksanakan int. 843 00:38:40,690 --> 00:38:44,000 Anda hanya berkata int n dan kemudian anda mendapat 4 bait untuk int, 844 00:38:44,000 --> 00:38:49,089 tetapi bagaimana saya boleh mendapatkan int, memanggilnya n, dan kemudian penunjuk, mari kita memanggilnya datang. 845 00:38:49,089 --> 00:38:50,880 Kita boleh memanggil ini apa-apa perkara yang kita mahu 846 00:38:50,880 --> 00:38:53,590 tetapi saya memerlukan struktur data adat. 847 00:38:53,590 --> 00:38:54,257 Ya? 848 00:38:54,257 --> 00:38:57,020 >> PENONTON: Ampersand [didengar]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID MALAN: Jadi Ampersand kita akan gunakan untuk mendapatkan alamat nod yang berpotensi. 850 00:39:00,940 --> 00:39:02,740 Tetapi kita perlu satu lagi ciri C untuk 851 00:39:02,740 --> 00:39:06,700 untuk memberikan saya keupayaan untuk mewujudkan ini rectangle adat, adat ini 852 00:39:06,700 --> 00:39:08,919 berubah-ubah jika anda akan, dalam ingatan. 853 00:39:08,919 --> 00:39:09,710 PENONTON: struct A. 854 00:39:09,710 --> 00:39:10,626 DAVID MALAN: struct A. 855 00:39:10,626 --> 00:39:14,310 Ingat dari minggu lepas, kami telah memperkenalkan struct, kata kunci ini agak mudah 856 00:39:14,310 --> 00:39:16,254 yang membolehkan kita membuat perkara seperti ini. 857 00:39:16,254 --> 00:39:18,420 C tidak datang dengan data yang struktur yang dikenali sebagai pelajar. 858 00:39:18,420 --> 00:39:22,190 Ia datang dengan int dan terapung dan char dan itu, tetapi ia tidak datang dengan pelajar, 859 00:39:22,190 --> 00:39:26,750 tetapi kita boleh mewujudkan satu jenis data pelajar, struktur pelajar, dengan sintaks ini 860 00:39:26,750 --> 00:39:27,250 di 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 bimbang tentang menghafal kata kunci, 863 00:39:30,426 --> 00:39:33,300 tetapi kata kunci yang penting adalah hanya hakikat bahawa kita berkata struct 864 00:39:33,300 --> 00:39:37,590 dan kemudian kita memanggilnya pelajar dan di dalam pelajar adalah nama dan rumah 865 00:39:37,590 --> 00:39:39,390 atau asrama atau sebagainya. 866 00:39:39,390 --> 00:39:41,980 >> Dan sehingga kini hari ini, mari kita mencadangkan ini. 867 00:39:41,980 --> 00:39:45,240 Saya telah menambah beberapa perkataan, tetapi jika saya mahu untuk melaksanakan ini segi empat tepat itu 868 00:39:45,240 --> 00:39:48,440 mendapat kedua-dua int dan penunjuk, anda tahu apa, saya 869 00:39:48,440 --> 00:39:51,540 akan mengisytiharkan struct yang dikenali sebagai nod. 870 00:39:51,540 --> 00:39:55,630 Saya juga, di dalam itu, akan berkata bahawa nod, segi empat tepat ini, mempunyai int 871 00:39:55,630 --> 00:39:59,730 dan kami akan memanggilnya n dan ia mempunyai penunjuk yang akan datang. 872 00:39:59,730 --> 00:40:02,540 Dan ini adalah sedikit berjela-jela, tetapi jika anda berfikir tentang hal itu, 873 00:40:02,540 --> 00:40:07,300 anak panah yang ada di gambar sebentar tadi adalah daripada jenis data? 874 00:40:07,300 --> 00:40:12,330 Di mana setiap orang-orang anak panah menunjuk jenis struktur data apa? 875 00:40:12,330 --> 00:40:14,332 Ia tidak menunjuk hanya untuk int per se. 876 00:40:14,332 --> 00:40:16,165 Ia menunjuk kepada Perkara yang segi empat tepat keseluruhan 877 00:40:16,165 --> 00:40:18,720 dan bahawa benda segi empat tepat, kita kata, dipanggil nod. 878 00:40:18,720 --> 00:40:21,720 Dan supaya kita jenis perlu rekursif mentakrifkan ini seperti 879 00:40:21,720 --> 00:40:26,270 bahawa nod, kita akan berkata, akan mengandungi int dipanggil n 880 00:40:26,270 --> 00:40:31,070 dan penunjuk yang dipanggil depan dan jenis struktur data kepada yang 881 00:40:31,070 --> 00:40:35,770 titik penunjuk nampaknya akan menjadi struct nod. 882 00:40:35,770 --> 00:40:41,550 >> Jadi ini adalah annoyingly lantung dan hanya untuk bengah, 883 00:40:41,550 --> 00:40:44,100 sebab mengapa kita tidak boleh hanya mengatakan ini, yang terus-terang 884 00:40:44,100 --> 00:40:46,860 kelihatan banyak yang lebih mudah dibaca, kerana ingat bahawa C membaca 885 00:40:46,860 --> 00:40:48,710 perkara yang atas ke bawah, kiri ke kanan. 886 00:40:48,710 --> 00:40:54,120 Ia bukan sehingga kita sampai koma bertitik nod kata kunci benar-benar wujud. 887 00:40:54,120 --> 00:40:57,980 Jadi, jika kita ingin mempunyai seperti ini rujukan kitaran dalam data 888 00:40:57,980 --> 00:41:02,120 struktur, yang perlu kita lakukan ini, di mana kita katakan struct nod di bahagian atas, yang 889 00:41:02,120 --> 00:41:06,770 memberikan kita cara yang lebih lama untuk menggambarkan ini perkara, maka di dalam kita katakan struct nod, 890 00:41:06,770 --> 00:41:09,560 dan kemudian pada garis yang terakhir kita katakan, semua hak, C, dengan cara itu, 891 00:41:09,560 --> 00:41:12,060 hanya memanggil sialan ini keseluruhan Perkara nod dan berhenti 892 00:41:12,060 --> 00:41:14,360 menggunakan kata kunci struct sama sekali. 893 00:41:14,360 --> 00:41:18,030 Jadi ini adalah hanya jenis yang sintaktik silap mata yang akhirnya membolehkan kami mereka 894 00:41:18,030 --> 00:41:21,370 sesuatu yang kelihatan betul-betul seperti ini. 895 00:41:21,370 --> 00:41:25,010 >> Jadi, jika kita menganggap sekarang kita boleh melaksanakan perkara ini dalam C, 896 00:41:25,010 --> 00:41:28,040 bagaimana kita benar-benar mula menyeberangi ini? 897 00:41:28,040 --> 00:41:32,360 Well, sebenarnya, apa yang harus kita lakukan adalah melelar dari kiri ke kanan dan hanya 898 00:41:32,360 --> 00:41:35,960 sejenis memasukkan nod atau memadam nod atau mencari untuk perkara-perkara di mana sahaja yang kita mahu, 899 00:41:35,960 --> 00:41:39,560 tetapi untuk melakukan ini, mari kita pergi ke depan dan membuat perkara yang sedikit lebih nyata kerana ini 900 00:41:39,560 --> 00:41:42,560 telah sangat rendah peringkat setakat ini. 901 00:41:42,560 --> 00:41:45,700 Adakah sesiapa yang benar-benar suka untuk menjadi yang pertama? 902 00:41:45,700 --> 00:41:46,200 OKAY. 903 00:41:46,200 --> 00:41:47,092 Naiklah. 904 00:41:47,092 --> 00:41:47,800 Siapa nama anda? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID MALAN: Daud. 907 00:41:49,290 --> 00:41:49,998 Gembira Mengenali Anda. 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 perlu beberapa 9. 911 00:41:53,990 --> 00:41:55,240 Tidak sebaik pertama, mungkin. 912 00:41:55,240 --> 00:41:56,430 OK, nombor 9. 913 00:41:56,430 --> 00:41:59,667 Sebilangan 17, sila. 914 00:41:59,667 --> 00:42:01,000 Biar saya pergi ke belakang sedikit lebih jauh. 915 00:42:01,000 --> 00:42:03,980 Number 22, sila, dan bagaimana pula lebih jauh ke belakang 916 00:42:03,980 --> 00:42:06,344 jika saya boleh melihat apa-apa tangan dengan semua cahaya atau tidak. 917 00:42:06,344 --> 00:42:08,010 Seseorang yang sedang menawarkan diri di sana. 918 00:42:08,010 --> 00:42:08,968 Adakah anda ingin datang? 919 00:42:08,968 --> 00:42:10,450 Lengan anda secara 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 akan datang ke bawah. 923 00:42:15,120 --> 00:42:18,450 Adakah orang lain suka forcefully-- Naiklah. 924 00:42:18,450 --> 00:42:21,030 Seorang sukarelawan yang sebenar. 925 00:42:21,030 --> 00:42:23,330 >> Jadi dengan cepat, jika anda semua boleh menguruskan 926 00:42:23,330 --> 00:42:26,550 kamu hanya suka nod pada skrin. 927 00:42:26,550 --> 00:42:27,510 Terima kasih. 928 00:42:27,510 --> 00:42:29,234 Dan anda akan menjadi 26. 929 00:42:29,234 --> 00:42:30,650 Semua pengenalan tepat dan cepat. 930 00:42:30,650 --> 00:42:32,139 Jadi saya Daud 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 beralih cara yang sedikit, dan hanya pergi ke depan dan 942 00:42:43,090 --> 00:42:47,024 memegang nombor anda kerana anda atau anda Tanda pertama dan menggunakan tangan kiri anda, 943 00:42:47,024 --> 00:42:48,940 pergi ke depan dan hanya melaksanakan anak panah ini, hanya 944 00:42:48,940 --> 00:42:51,360 supaya tangan kiri anda adalah benar-benar menunjuk pada apa sahaja yang anda perlu menunjukkan 945 00:42:51,360 --> 00:42:54,610 di, dan memberi diri anda sedikit ruang supaya kita visual boleh melihat senjata anda sebenarnya 946 00:42:54,610 --> 00:42:58,120 menunjuk, dan anda hanya boleh menunjukkan semacam di tanah adalah baik. 947 00:42:58,120 --> 00:43:03,040 >> Jadi di sini kita mempunyai senarai yang dikaitkan satu, dua, tiga, empat, lima nod pada mulanya, 948 00:43:03,040 --> 00:43:05,860 dan perhatikan kita mempunyai khas penunjuk pada awal siapa yang 949 00:43:05,860 --> 00:43:09,770 utama kerana kita perlu menjejaki senarai panjang keseluruhan entah bagaimana. 950 00:43:09,770 --> 00:43:13,590 Lelaki-lelaki ini, walaupun mereka ditinggalkan ke kanan, kembali ke belakang dalam ingatan, 951 00:43:13,590 --> 00:43:15,950 mereka sebenarnya boleh berada di mana sahaja dalam ingatan komputer. 952 00:43:15,950 --> 00:43:18,240 Jadi lelaki ini boleh menjadi berdiri di mana-mana peringkat 953 00:43:18,240 --> 00:43:20,960 dan itulah denda, selagi mereka sebenarnya menghala ke arah satu sama lain, 954 00:43:20,960 --> 00:43:22,770 tetapi untuk menjaga perkara-perkara bersih dan mudah, kita akan 955 00:43:22,770 --> 00:43:25,728 hanya menarik mereka kiri ke kanan seperti ini, tetapi mungkin ada jurang besar-besaran 956 00:43:25,728 --> 00:43:26,790 di antara mereka nod. 957 00:43:26,790 --> 00:43:30,710 >> Sekarang, jika saya mahu sebenarnya memasukkan beberapa nilai baru, mari kita pergi ke depan dan melakukan ini. 958 00:43:30,710 --> 00:43:33,720 Ada kesempatan bagi kita sekarang untuk memilih nod yang lain. 959 00:43:33,720 --> 00:43:39,820 Katakanlah mari kita mulakan dengan mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Adakah 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 nama anda? 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 Naiklah. 968 00:43:47,450 --> 00:43:51,610 Jadi sekarang kita perlu bertanya kepada diri kita sendiri algorithmically mana kita boleh meletakkan 55. 969 00:43:51,610 --> 00:43:53,610 Jadi kita semua tahu, jelas, di mana dia mungkin 970 00:43:53,610 --> 00:43:55,401 tergolong jika kita cuba untuk menjaga ini disusun 971 00:43:55,401 --> 00:43:58,299 dan jika anda semua boleh mengambil satu langkah ke belakang supaya kita tidak jatuh 972 00:43:58,299 --> 00:43:59,590 peringkat, yang akan menjadi besar. 973 00:43:59,590 --> 00:44:01,420 Jadi sebenarnya, Rainbow, mula di sini dengan saya, 974 00:44:01,420 --> 00:44:04,200 kerana kita sebagai komputer kini boleh hanya melihat satu pembolehubah pada satu masa. 975 00:44:04,200 --> 00:44:05,190 Jadi, jika ini adalah nod pertama. 976 00:44:05,190 --> 00:44:07,160 Perhatikan dia tidak nod, dia hanya penunjuk, 977 00:44:07,160 --> 00:44:10,270 dan sebab itu dia tertarik untuk menjadi hanya saiz penunjuk, tidak 978 00:44:10,270 --> 00:44:11,780 salah satu segi empat tepat sepenuhnya. 979 00:44:11,780 --> 00:44:16,650 Jadi, kita akan untuk memeriksa pada setiap lelaran adalah 55 kurang daripada 9? 980 00:44:16,650 --> 00:44:17,150 No. 981 00:44:17,150 --> 00:44:19,060 55 kurang daripada 17? 982 00:44:19,060 --> 00:44:19,720 No. 983 00:44:19,720 --> 00:44:20,800 Kurang daripada 22? 984 00:44:20,800 --> 00:44:22,020 Kurang daripada 26? 985 00:44:22,020 --> 00:44:23,390 Kurang daripada 34? 986 00:44:23,390 --> 00:44:25,890 Dan sehingga kini, jelas Rainbow tergolong pada akhir. 987 00:44:25,890 --> 00:44:27,270 Jadi untuk menjadi jelas, dan apa yang adalah nama, 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 tunjuk pada apa yang dalam memerintahkan untuk memasukkan 55 ke dalam senarai 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 >> PENONTON: tangan Taylor perlu menunjukkan kiri. 994 00:44:41,140 --> 00:44:41,680 >> DAVID MALAN: Tepat sekali. 995 00:44:41,680 --> 00:44:43,800 Jadi memasukkan nod ke akhir senarai 996 00:44:43,800 --> 00:44:47,140 ini agak mudah kerana Taylor hanya mempunyai ke titik, bukan di tanah 997 00:44:47,140 --> 00:44:49,640 atau kita akan memanggilnya null, null adalah jenis ketiadaan 998 00:44:49,640 --> 00:44:51,640 daripada penunjuk atau khas penunjuk sifar, anda berada 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 sepatutnya kiri anda tangan mungkin menunjukkan? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Ia tidak baik jika tangannya adalah jenis menunjuk off sini atau jenis apa-apa 1003 00:45:00,140 --> 00:45:00,640 yang cara. 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 dia menunjuk ke beberapa nilai yang diketahui, kita akan 1006 00:45:04,240 --> 00:45:07,360 memanggilnya sifar atau batal, itu OK kerana kita mempunyai istilah dalam ini 1007 00:45:07,360 --> 00:45:09,390 dan kita tahu senarai sekarang selesai. 1008 00:45:09,390 --> 00:45:11,550 >> Jadi apa lagi kes yang agak mudah? 1009 00:45:11,550 --> 00:45:13,125 Bolehkah kita malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Naiklah. 1011 00:45:14,010 --> 00:45:14,782 Siapa nama anda? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID MALAN: Saya minta 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 Naiklah. 1019 00:45:19,570 --> 00:45:23,820 Yang ini agak mudah juga, tetapi mari kita mempertimbangkan perintah operasi sekarang. 1020 00:45:23,820 --> 00:45:25,820 Ia agak mudah dengan Taylor pada akhir. 1021 00:45:25,820 --> 00:45:30,302 Nombor 5 adalah kursus kurang daripada 9, dan dengan itu kita mempunyai David, kami mempunyai Tiffany, 1022 00:45:30,302 --> 00:45:31,260 dan apa yang Engkau? 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 Daud. 1026 00:45:34,300 --> 00:45:36,580 Yang tangan perlu dikemaskini pertama? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Apa yang anda mahu lakukan di sini? 1029 00:45:40,590 --> 00:45:45,244 Ada beberapa kemungkinan cara, tetapi ada juga satu atau cara yang lebih salah. 1030 00:45:45,244 --> 00:45:46,620 >> PENONTON: Mulakan dengan paling kiri. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID MALAN: Mulakan dengan paling kiri itu. 1032 00:45:47,800 --> 00:45:49,008 Siapa paling kiri di sini ketika itu? 1033 00:45:49,008 --> 00:45:49,700 PENONTON: Pertama. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID MALAN: OK. 1035 00:45:50,366 --> 00:45:53,781 Jadi bermula dengan pertama dan di manakah anda mahu untuk mengemaskini tangan Daud untuk menjadi? 1036 00:45:53,781 --> 00:45:54,780 PENONTON: Menjelang 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID MALAN: OK. 1038 00:45:55,446 --> 00:45:59,026 Maka Daud dan titik pada lima atau Tiffany di sini, dan sekarang? 1039 00:45:59,026 --> 00:46:01,072 >> PENONTON: Tiffany mata kepada 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID MALAN: Perfect, kecuali yang Binky kepala hanya jenis jatuh, bukan? 1041 00:46:04,030 --> 00:46:06,820 Oleh kerana apa yang salah dengan gambar ini betul-betul? 1042 00:46:06,820 --> 00:46:08,070 PENONTON: Tiada apa-apa menunjuk. 1043 00:46:08,070 --> 00:46:09,945 DAVID MALAN: Tidak ada yang menunjuk kepada Jake sekarang. 1044 00:46:09,945 --> 00:46:13,360 Kami benar-benar yatim 9 dan 17, dan kami telah benar-benar 1045 00:46:13,360 --> 00:46:18,450 bocor kesemua memori ini, kerana dengan mengemaskini tangan Daud pertama, itu 1046 00:46:18,450 --> 00:46:21,660 denda sejauh mana ia betul menghala ke arah Tiffany sekarang, 1047 00:46:21,660 --> 00:46:25,410 tetapi jika tiada siapa yang mempunyai pandangan jauh untuk menunjukkan pada Jake, 1048 00:46:25,410 --> 00:46:27,490 maka kita telah kehilangan keseluruhan daripada senarai itu. 1049 00:46:27,490 --> 00:46:28,200 Jadi mari kita batal. 1050 00:46:28,200 --> 00:46:30,950 Jadi itu adalah satu perkara yang baik untuk tersandung tetapi mari kita betulkan sekarang. 1051 00:46:30,950 --> 00:46:33,624 Apa yang patut kita lakukan dahulu bukan? 1052 00:46:33,624 --> 00:46:34,124 Ya? 1053 00:46:34,124 --> 00:46:35,791 >> PENONTON: Tiffany perlu menunjukkan di 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID MALAN: saya tidak boleh mendapatkan yang rapat dengan anda. 1055 00:46:37,582 --> 00:46:38,720 Siapa yang patut tunjuk pada 9? 1056 00:46:38,720 --> 00:46:39,220 >> PENONTON: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID MALAN: Baiklah. 1058 00:46:39,390 --> 00:46:41,200 Jadi Tiffany sepatutnya mata pertama pada 9. 1059 00:46:41,200 --> 00:46:43,550 Jadi Tiffany perlu mengambil pada nilai yang sama 1060 00:46:43,550 --> 00:46:45,820 kepada Daud, yang seolah-olah berlebihan untuk seketika, 1061 00:46:45,820 --> 00:46:48,820 tetapi itulah denda kerana sekarang, kedua langkah, kita boleh mengemas kini tangan Daud 1062 00:46:48,820 --> 00:46:52,680 untuk menunjukkan pada Tiffany, dan kemudian jika kita hanya jenis perkara sehingga bersih 1063 00:46:52,680 --> 00:46:55,740 seolah-olah ini adalah jenis seperti musim bunga, kini itulah sisipan yang betul. 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. 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 boleh malloc satu sukarelawan akhir? 1068 00:47:03,010 --> 00:47:04,140 Naiklah. 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 Tetapi benar-benar, kod kami menulis, walaupun secara lisan, 1071 00:47:08,390 --> 00:47:10,610 hanya seperti mempunyai sekumpulan daripada jika keadaan sekarang, bukan? 1072 00:47:10,610 --> 00:47:12,318 Kami mempunyai keadaan memeriksa jika ia tergolong 1073 00:47:12,318 --> 00:47:13,840 pada akhirnya, mungkin permulaan. 1074 00:47:13,840 --> 00:47:15,940 Kita perlu beberapa jenis gelung untuk mencari tempat di bahagian tengah. 1075 00:47:15,940 --> 00:47:17,400 Jadi mari kita buat itu dengan apa nama anda? 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 Gembira Mengenali Anda. 1080 00:47:19,368 --> 00:47:20,490 Oleh itu, kita mempunyai 20. 1081 00:47:20,490 --> 00:47:21,220 Kurang daripada lima? 1082 00:47:21,220 --> 00:47:21,530 No. 1083 00:47:21,530 --> 00:47:22,160 Kurang daripada sembilan? 1084 00:47:22,160 --> 00:47:22,410 No. 1085 00:47:22,410 --> 00:47:23,050 Kurang daripada 17? 1086 00:47:23,050 --> 00:47:23,550 No. 1087 00:47:23,550 --> 00:47:23,740 OKAY. 1088 00:47:23,740 --> 00:47:25,701 Dia tergolong di sini dan nama anda lagi berada? 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 Yang tangan perlu mendapatkan dikemaskini pertama? 1096 00:47:32,140 --> 00:47:32,930 >> PENONTON: Eric. 1097 00:47:32,930 --> 00:47:33,429 OKAY. 1098 00:47:33,429 --> 00:47:35,200 Jadi Eric perlu menunjukkan di mana? 1099 00:47:35,200 --> 00:47:35,930 Pada 22. 1100 00:47:35,930 --> 00:47:36,430 Yang baik. 1101 00:47:36,430 --> 00:47:38,180 Dan sekarang apa yang akan datang? 1102 00:47:38,180 --> 00:47:40,800 Sue kemudiannya boleh tunjuk pada Eric dan kini, jika anda semua hanya 1103 00:47:40,800 --> 00:47:44,077 membuat beberapa bilik, yang adalah baik visual, sekarang kita telah melakukan pemasukan. 1104 00:47:44,077 --> 00:47:47,160 Jadi mari kita kini mempertimbangkan soalan tetapi terima kasih banyak untuk sukarelawan kami. 1105 00:47:47,160 --> 00:47:48,090 Sangat baik dilakukan. 1106 00:47:48,090 --> 00:47:50,831 Anda boleh menyimpan mereka, jika anda suka. 1107 00:47:50,831 --> 00:47:54,140 Dan kita mempunyai hadiah perpisahan indah jika anda akan setiap ingin mengambil bola tekanan. 1108 00:47:54,140 --> 00:47:56,030 Biar saya lulus ini ke bawah. 1109 00:47:56,030 --> 00:47:58,430 Jadi apakah Fleet ini? 1110 00:47:58,430 --> 00:48:02,430 Ini seolah-olah yang menakjubkan setakat yang kita ada sekarang 1111 00:48:02,430 --> 00:48:06,360 diperkenalkan alternatif kepada array yang tidak terhad jadi 1112 00:48:06,360 --> 00:48:07,780 kepada pelbagai beberapa saiz tetap. 1113 00:48:07,780 --> 00:48:09,380 Mereka boleh berkembang secara dinamik. 1114 00:48:09,380 --> 00:48:13,220 >> Tetapi banyak seperti yang kita lihat dalam beberapa minggu masa lalu, kita tidak mendapat apa-apa secara percuma, 1115 00:48:13,220 --> 00:48:15,740 seperti pasti ada-off perdagangan di sini. 1116 00:48:15,740 --> 00:48:18,890 Jadi dengan peningkatan sebanyak berpaut senarai, adalah dinamik ini? 1117 00:48:18,890 --> 00:48:21,590 Keupayaan ini berkembang dan terus-terang, yang kita boleh lakukan padam 1118 00:48:21,590 --> 00:48:23,570 dan kita boleh mengecut seperti yang diperlukan. 1119 00:48:23,570 --> 00:48:24,710 Apa harga kita membayar? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dua kali ganda ruang yang banyak, pertama sekali. 1122 00:48:30,340 --> 00:48:34,010 Jika anda melihat gambar, tidak lagi aku menyimpan senarai integer. 1123 00:48:34,010 --> 00:48:36,740 Saya menyimpan senarai integer serta petunjuk. 1124 00:48:36,740 --> 00:48:38,240 Jadi, saya dua kali ganda jumlah ruang. 1125 00:48:38,240 --> 00:48:40,740 Sekarang, mungkin itu bukan seperti masalah besar 4 bait, 8 bait, 1126 00:48:40,740 --> 00:48:43,160 tetapi ia sudah tentu boleh menambah untuk set data yang besar. 1127 00:48:43,160 --> 00:48:45,570 Apakah keburukan yang lain? 1128 00:48:45,570 --> 00:48:46,070 Ya? 1129 00:48:46,070 --> 00:48:48,010 >> PENONTON: Kita perlu merentasi mereka satu demi satu. 1130 00:48:48,010 --> 00:48:48,760 DAVID MALAN: Ya. 1131 00:48:48,760 --> 00:48:50,260 Kami perlu merentasi mereka satu demi satu. 1132 00:48:50,260 --> 00:48:53,860 Anda tahu apa, kita berputus asa super ini ciri mudah untuk kurungan persegi 1133 00:48:53,860 --> 00:48:57,240 notasi, lebih tepat dikenali sebagai capaian rawak, 1134 00:48:57,240 --> 00:48:59,280 di mana kita hanya boleh melompat kepada elemen individu 1135 00:48:59,280 --> 00:49:01,470 tetapi kini jika saya masih mempunyai sukarelawan saya di sini, 1136 00:49:01,470 --> 00:49:04,660 jika saya mahu mencari nombor 22, saya tidak boleh hanya 1137 00:49:04,660 --> 00:49:06,620 melompat ke kurungan sesuatu sesuatu. 1138 00:49:06,620 --> 00:49:10,530 Saya perlu melihat ke atas senarai, banyak seperti contoh pencarian kami linear, 1139 00:49:10,530 --> 00:49:12,260 untuk mencari bilangan 22. 1140 00:49:12,260 --> 00:49:14,340 Oleh itu, kita seolah-olah telah membayar harga yang di sana. 1141 00:49:14,340 --> 00:49:16,430 Tetapi kita boleh tetap menyelesaikan masalah-masalah lain. 1142 00:49:16,430 --> 00:49:18,587 >> Malah, izinkan saya memperkenalkan hanya beberapa visual. 1143 00:49:18,587 --> 00:49:20,920 Jadi, jika anda telah turun ke Dewan Makan Mather baru-baru ini, 1144 00:49:20,920 --> 00:49:23,320 anda akan ingat bahawa mereka susunan dulang seperti ini, 1145 00:49:23,320 --> 00:49:26,300 kita meminjam ini dari Annenberg sebelum kelas. 1146 00:49:26,300 --> 00:49:28,930 Jadi timbunan ini dulang, walaupun, adalah wakil sebenarnya 1147 00:49:28,930 --> 00:49:30,860 struktur data sains komputer. 1148 00:49:30,860 --> 00:49:32,910 Terdapat struktur data dalam bidang sains komputer 1149 00:49:32,910 --> 00:49:38,010 dikenali sebagai timbunan yang sangat baik ruang untuk betul-betul ini dengar. 1150 00:49:38,010 --> 00:49:41,380 Jadi, jika setiap dulang ini bukan dulang tetapi seperti nombor dan saya mahu 1151 00:49:41,380 --> 00:49:45,010 untuk menyimpan nombor, saya boleh meletakkan satu turun di sini, 1152 00:49:45,010 --> 00:49:48,320 dan saya boleh meletakkan satu lagi turun di sini, dan terus menyusun nombor 1153 00:49:48,320 --> 00:49:53,180 di atas satu sama lain, dan apa yang berpotensi berguna mengenai ini 1154 00:49:53,180 --> 00:49:55,450 adalah bahawa apa yang implikasi struktur data ini? 1155 00:49:55,450 --> 00:49:58,045 Yang nombor boleh 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 meletakkan di sana. 1158 00:50:03,030 --> 00:50:06,430 >> Jadi ini adalah apa yang kita akan memanggil komputer sains struktur data LIFO. 1159 00:50:06,430 --> 00:50:08,070 Bertahan dalam, dahulu. 1160 00:50:08,070 --> 00:50:10,800 Dan kita akan melihat tidak lama mengapa yang mungkin berguna tetapi untuk sekarang, 1161 00:50:10,800 --> 00:50:12,200 hanya menganggap tetamu. 1162 00:50:12,200 --> 00:50:15,158 Dan ia jenis bodoh jika anda berfikir tentang bagaimana dewan makan melakukannya. 1163 00:50:15,158 --> 00:50:17,910 Setiap kali mereka dulang bersih dan meletakkan orang-orang yang paling segar di atas, 1164 00:50:17,910 --> 00:50:22,160 anda boleh mempunyai yang dahulu bersih tetapi akhirnya sangat kotor dan berdebu 1165 00:50:22,160 --> 00:50:24,360 dulang di bahagian paling bawah jika anda tidak pernah benar-benar 1166 00:50:24,360 --> 00:50:26,820 sampai ke bahagian bawah itu timbunan, kerana anda hanya 1167 00:50:26,820 --> 00:50:29,380 terus meletakkan yang baru dan orang-orang yang bersih di atasnya. 1168 00:50:29,380 --> 00:50:31,840 Perkara yang sama mungkin berlaku di pasar raya juga. 1169 00:50:31,840 --> 00:50:35,450 Jika anda mempunyai kes paparan susu dan setiap kali CVS 1170 00:50:35,450 --> 00:50:37,610 atau sesiapa yang mendapat lebih banyak susu, anda hanya mendorong yang susu 1171 00:50:37,610 --> 00:50:39,880 anda sudah mempunyai ke belakang dan anda meletakkan yang baru di depan, 1172 00:50:39,880 --> 00:50:43,088 anda akan mempunyai beberapa cukup jahat susu pada akhir struktur data, 1173 00:50:43,088 --> 00:50:46,390 kerana ia sentiasa di bahagian bawah atau setara ia sentiasa di belakang. 1174 00:50:46,390 --> 00:50:50,407 >> Tetapi ada cara lain untuk berfikir tentang beratur data dan sebagai contoh, ini. 1175 00:50:50,407 --> 00:50:53,490 Jika anda salah seorang dari orang-orang yang suka untuk beratur di luar kedai Apple 1176 00:50:53,490 --> 00:50:55,610 apabila produk baru datang keluar, anda mungkin 1177 00:50:55,610 --> 00:50:58,780 tidak menggunakan data timbunan struktur kerana anda 1178 00:50:58,780 --> 00:51:03,070 akan merenggangkan orang lain yang beratur untuk membeli beberapa mainan baru. 1179 00:51:03,070 --> 00:51:06,610 Sebaliknya, anda mungkin menggunakan apa jenis struktur data 1180 00:51:06,610 --> 00:51:10,050 atau apa jenis sistem dalam dunia sebenar? 1181 00:51:10,050 --> 00:51:13,493 Mudah-mudahan ia garis, atau lebih betul atau lebih British-suka, barisan. 1182 00:51:13,493 --> 00:51:17,700 Dan ternyata barisan juga struktur data dalam bidang sains komputer, 1183 00:51:17,700 --> 00:51:19,700 tetapi barisan yang mempunyai sangat harta yang berlainan. 1184 00:51:19,700 --> 00:51:20,820 Ia bukan LIFO. 1185 00:51:20,820 --> 00:51:21,990 Bertahan dalam, dahulu. 1186 00:51:21,990 --> 00:51:22,800 Tuhan melarang. 1187 00:51:22,800 --> 00:51:24,280 Ia bukannya FIFO. 1188 00:51:24,280 --> 00:51:26,110 Masuk dahulu, keluar dahulu. 1189 00:51:26,110 --> 00:51:27,970 Dan itu adalah satu perkara yang baik demi keadilan ' 1190 00:51:27,970 --> 00:51:30,428 pasti apabila anda beratur sehingga hilang pada awal pagi. 1191 00:51:30,428 --> 00:51:33,400 Jika anda sampai ke sana pertama, anda mahu keluar pertama juga. 1192 00:51:33,400 --> 00:51:35,880 >> Dan supaya semua data ini struktur, barisan dan susunan 1193 00:51:35,880 --> 00:51:39,220 dan tandan orang lain, ternyata anda boleh berfikir ini hanya sebagai array. 1194 00:51:39,220 --> 00:51:41,820 Ini adalah pelbagai, mungkin saiz yang menetapkan 4, tetapi ia akan 1195 00:51:41,820 --> 00:51:44,990 menjadi jenis baik jika kita hanya boleh terkumpul dulang hampir tak terhingga tinggi jika kita 1196 00:51:44,990 --> 00:51:46,780 mempunyai bahawa dulang nombor atau banyak. 1197 00:51:46,780 --> 00:51:48,840 Jadi mungkin kita mahu menggunakan senarai dikaitkan di sini, 1198 00:51:48,840 --> 00:51:51,800 tetapi keseimbangan akan menjadi berpotensi bahawa kita perlu lebih banyak memori, 1199 00:51:51,800 --> 00:51:55,930 mengambil masa yang lebih sedikit, tetapi kita tidak mengehadkan ketinggian timbunan, 1200 00:51:55,930 --> 00:51:59,550 sama seperti paparan kes Mather mungkin membataskan saiz timbunan, 1201 00:51:59,550 --> 00:52:03,117 dan sebagainya ini adalah keputusan reka bentuk atau pilihan ada pada kita akhirnya. 1202 00:52:03,117 --> 00:52:04,950 Jadi dengan data ini struktur, kami telah mula 1203 00:52:04,950 --> 00:52:09,360 melihat batas atas baru berpotensi kepada apa yang sebelum ini 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 kami akan berharap untuk sampai ke adalah pada hari Rabu, kami akan 1206 00:52:13,200 --> 00:52:15,740 mula melihat data yang struktur yang membolehkan kita mencari 1207 00:52:15,740 --> 00:52:18,260 melalui data dalam masa akhir log lagi. 1208 00:52:18,260 --> 00:52:21,470 Dan kita melihat bahawa, masih ingat, pada minggu sifar dan satu dengan carian binari atau membahagi 1209 00:52:21,470 --> 00:52:22,180 dan menakluk. 1210 00:52:22,180 --> 00:52:26,240 Ia datang kembali dan lebih baik lagi, kaedah berpotensi suci untuk Rabu ini 1211 00:52:26,240 --> 00:52:29,510 adalah untuk datang dengan struktur data yang berjalan benar-benar 1212 00:52:29,510 --> 00:52:32,070 atau secara teori dalam masa yang berterusan, di mana 1213 00:52:32,070 --> 00:52:34,760 ia tidak kira berapa banyak berjuta-juta atau berbilion-bilion perkara 1214 00:52:34,760 --> 00:52:38,470 kita ada dalam struktur data, ia akan membawa kita masa yang berterusan, mungkin satu langkah 1215 00:52:38,470 --> 00:52:41,387 atau dua langkah atau 10 langkah, tetapi nombor yang berterusan daripada langkah-langkah 1216 00:52:41,387 --> 00:52:42,970 untuk mencari melalui struktur data. 1217 00:52:42,970 --> 00:52:46,300 Yang demikian itu ialah kaedah berpotensi suci tetapi lebih kepada yang pada hari Rabu. 1218 00:52:46,300 --> 00:52:49,045 Lihat ya itu. 1219 00:52:49,045 --> 00:52:53,704 >> [Bermain muzik] 1220 00:52:53,704 --> 00:56:08,448