1 00:00:00,000 --> 00:00:11,242 >> [Bermain muzik] 2 00:00:11,242 --> 00:00:16,630 >> DAVID J. MALAN: Baiklah ini adalah CS50 dan ini adalah permulaan lima minggu. 3 00:00:16,630 --> 00:00:21,480 Jadi hari ini, di bawah kusyen tempat duduk anda, anda tidak akan menemui apa-apa. 4 00:00:21,480 --> 00:00:24,790 Tetapi di atas, anda perlu mencari ini, satu tanda kecil penghargaan terhadap 5 00:00:24,790 --> 00:00:26,970 semua kerja-kerja yang anda meletakkan ke dalam Permainan Lima belas. 6 00:00:26,970 --> 00:00:30,290 Hanya membuang bulatan kecil pada bawah untuk mula bermain untuk 7 00:00:30,290 --> 00:00:31,680 baki kelas. 8 00:00:31,680 --> 00:00:38,930 >> Jadi ingat bahawa, atau tahu bahawa masalah yang ditetapkan empat, yang keluar hujung minggu ini, 9 00:00:38,930 --> 00:00:40,340 melibatkan bertulis permainan lain. 10 00:00:40,340 --> 00:00:43,740 Tetapi kali ini ia melibatkan menggunakan antara muka pengguna grafik yang sebenar, bukan 11 00:00:43,740 --> 00:00:46,310 muka teks seperti Permainan Lima belas itu. 12 00:00:46,310 --> 00:00:50,210 Dan permainan yang terletak di hadapan anda, jika anda belum lagi melihat ini datang, 13 00:00:50,210 --> 00:00:52,310 kelihatan sesuatu yang kecil seperti ini. 14 00:00:52,310 --> 00:00:55,170 Saya akan pergi ke terminal saya tingkap di sini di GDB. 15 00:00:55,170 --> 00:00:58,600 Dan saya akan pergi ke hadapan dan menjalankan penyelesaian kakitangan, yang anda boleh mengakses 16 00:00:58,600 --> 00:01:01,010 selepas menjalankan update 50 seperti biasa. 17 00:01:01,010 --> 00:01:04,090 >> Tetapi saya akan meletakkan ia ke dalam sedikit mod rahsia, Paskah sedikit telur, 18 00:01:04,090 --> 00:01:08,480 dipanggil mod Allah, dengan meletakkan Allah dalam argv1. 19 00:01:08,480 --> 00:01:12,920 Dan saya perlu ikut arahan saya sendiri, berjalan dalam saya sendiri 20 00:01:12,920 --> 00:01:14,220 masalah menetapkan direktori. 21 00:01:14,220 --> 00:01:19,190 Jadi sekarang anda melihat versi lengkap daripada permainan Breakout. 22 00:01:19,190 --> 00:01:21,090 Malah, ini adalah cara tidak tangan. 23 00:01:21,090 --> 00:01:24,850 Jadi ia sebenarnya - 24 00:01:24,850 --> 00:01:26,470 wowed walaupun anda mungkin - 25 00:01:26,470 --> 00:01:30,850 agak remeh untuk melaksanakan mod Tuhan dalam Breakout, tidak seperti Permainan Lima belas, 26 00:01:30,850 --> 00:01:33,590 yang sebahagian daripada anda mungkin telah ditangani untuk edisi penggodam. 27 00:01:33,590 --> 00:01:37,890 >> Dalam Breakout ia mencukupi kepada Tuhan mod dengan hanya melakukan apa yang, 28 00:01:37,890 --> 00:01:41,220 intuitif dengan dayung? 29 00:01:41,220 --> 00:01:45,630 Hanya membuat ia sama dengan apa jua kedudukan mendatar adalah bola. 30 00:01:45,630 --> 00:01:49,220 Dan selagi anda melakukan ini dalam lockstep dengan bola bergerak permainan ini akan 31 00:01:49,220 --> 00:01:53,100 tidak pernah, pernah, pernah terlepas bola dan anda akan memenangi setiap masa. 32 00:01:53,100 --> 00:01:55,430 >> Tetapi dalam edisi penggodam minggu ini terdapat lebih daripada sekadar mod Allah. 33 00:01:55,430 --> 00:01:56,720 Terdapat beberapa ciri-ciri lain. 34 00:01:56,720 --> 00:01:58,140 Antaranya, laser. 35 00:01:58,140 --> 00:02:01,070 Jadi jika anda benar-benar tidak sabar mendapatkan anda boleh mula menembak jatuh batu bata 36 00:02:01,070 --> 00:02:02,120 dan beberapa yang lain. 37 00:02:02,120 --> 00:02:04,560 Dan bagi mereka yang ingin menentukur standard berbanding hacker 38 00:02:04,560 --> 00:02:08,750 edisi, saya dapat melihat bahawa minggu ini edisi penggodam sengaja adalah 39 00:02:08,750 --> 00:02:12,830 sedikit lebih boleh dilakukan, berkata, daripada Allah mod adalah dengan Permainan Lima belas. 40 00:02:12,830 --> 00:02:15,300 >> Jadi, jika anda sedang mencari untuk menghulurkan dan anda sedang mencari untuk berseronok tambahan 41 00:02:15,300 --> 00:02:18,400 ciri-ciri melakukan menyelam dalam jika kepentingan. 42 00:02:18,400 --> 00:02:21,280 Sekarang, lebih praktikal, izinkan saya menunjukkan keluar satu perkara juga. 43 00:02:21,280 --> 00:02:24,780 GDB, yang sebahagian daripada anda mungkin tidak mempunyai lagi menyentuh peribadi, yang halus. 44 00:02:24,780 --> 00:02:28,530 Tetapi sekarang adalah benar-benar masa untuk mendapatkan digunakan ini dan selesa dengan alat ini 45 00:02:28,530 --> 00:02:31,510 kerana ia akan menjadikan kehidupan anda lebih mudah, benar-benar. 46 00:02:31,510 --> 00:02:34,900 >> Per kuliah Rob pada GDB pasangan minggu lalu, ingat 47 00:02:34,900 --> 00:02:36,810 GDB yang penyahpepijat. 48 00:02:36,810 --> 00:02:41,230 Ia adalah satu alat yang membolehkan anda menjalankan anda program tetapi berjalan langkah demi langkah, garis 49 00:02:41,230 --> 00:02:45,680 demi baris, supaya anda boleh mencucuk di sekitar, supaya anda melihat perkara yang berlaku, jadi 50 00:02:45,680 --> 00:02:47,310 bahawa anda boleh mencetak nilai-nilai pembolehubah. 51 00:02:47,310 --> 00:02:50,580 Secara ringkas, ia memberikan anda lebih banyak lagi kuasa daripada printDef tidak. 52 00:02:50,580 --> 00:02:52,900 >> Sekarang diakui, antara muka agak sukar difahami. 53 00:02:52,900 --> 00:02:55,180 Muka teks hitam dan putih bagi sebahagian besar. 54 00:02:55,180 --> 00:02:57,400 Arahan yang agak sukar ingat pada mulanya. 55 00:02:57,400 --> 00:03:01,230 Tetapi walaupun ia mungkin mengambil masa anda separuh satu jam, satu jam, untuk meletakkan terlebih dahulu bahawa 56 00:03:01,230 --> 00:03:02,940 pelaburan masa ke dalamnya, amanah saya. 57 00:03:02,940 --> 00:03:06,440 Sudah tentu pada akhir semester ini ia akan menjimatkan anda suatu perintah magnitud lebih 58 00:03:06,440 --> 00:03:07,600 masa daripada itu. 59 00:03:07,600 --> 00:03:09,200 >> Jadi pada awal minggu menyelam masuk 60 00:03:09,200 --> 00:03:13,200 Dan dari segi Breakout, tahu bahawa anda boleh melakukan ini selagi anda mempunyai 61 00:03:13,200 --> 00:03:18,230 kod pengedaran atau kod anda sendiri dijalankan di dalam direktori Pst4 anda. 62 00:03:18,230 --> 00:03:21,680 Tahu bahawa anda boleh menjalankan Pra-Pemasangan. / Pelarian. 63 00:03:21,680 --> 00:03:23,490 >> Ini akan membuka Windows seperti ini. 64 00:03:23,490 --> 00:03:25,530 Izinkan saya memberikan diri saya lebih tetingkap terminal. 65 00:03:25,530 --> 00:03:27,770 Dan kemudian apa yang saya akan pergi ke hadapan dan lakukan, ia tidak hanya menjalankan ia. 66 00:03:27,770 --> 00:03:30,690 Saya akan mula-mula titik rehat ingat, yang membolehkan anda untuk berhenti 67 00:03:30,690 --> 00:03:32,500 pelaksanaan di tempat tertentu. 68 00:03:32,500 --> 00:03:35,750 >> Hanya untuk memastikan perkara-perkara yang mudah saya akan untuk memecahkan di garisan satu hanya dengan menaip 69 00:03:35,750 --> 00:03:37,000 nombor satu. 70 00:03:37,000 --> 00:03:40,080 71 00:03:40,080 --> 00:03:43,250 Biar saya sebenarnya membuka semula tetingkap ini kerana ia mendapat 72 00:03:43,250 --> 00:03:45,700 sedikit kecil di sana. 73 00:03:45,700 --> 00:03:53,270 Jadi apa yang saya kini akan lakukan di sini adalah jika saya membuka tetingkap terminal saya. 74 00:03:53,270 --> 00:03:53,910 Ayuh, ada kita pergi. 75 00:03:53,910 --> 00:03:59,850 >> Jadi sekarang jika saya kembali ke dropbox, Pst4 dan menjalankan Pra-Pemasangan. / pelarian memasuki, notis 76 00:03:59,850 --> 00:04:02,600 Saya akan memecahkan satu untuk menetap titik rehat di garisan satu. 77 00:04:02,600 --> 00:04:04,840 Dan sekarang saya akan pergi hadapan dan jenis berjalan. 78 00:04:04,840 --> 00:04:07,370 Dan apabila saya berbuat demikian, apa-apa notis seolah-olah berlaku. 79 00:04:07,370 --> 00:04:08,120 >> Tiada sehingga pop. 80 00:04:08,120 --> 00:04:09,790 Tiada grafik antara muka pengguna yet. 81 00:04:09,790 --> 00:04:13,340 Tetapi itu difahami kerana saya betul-betul di garisan satu dalam program saya. 82 00:04:13,340 --> 00:04:17,110 Dan notis bahawa saya telah cepat dikemukakan, khusus sekarang untuk 62, kerana semua 83 00:04:17,110 --> 00:04:20,600 barangan di bahagian atas fail ini perkara-perkara seperti komen dan pemalar dan 84 00:04:20,600 --> 00:04:22,460 tidak menarik barangan untuk sekarang. 85 00:04:22,460 --> 00:04:25,840 >> Jadi sekarang saya dalam utama, ia seolah-olah, di garisan 62. 86 00:04:25,840 --> 00:04:27,960 Dan ini hanyalah pengagihan kod, ingat. 87 00:04:27,960 --> 00:04:33,810 Jika saya membuka ini dengan pergi, begitu juga, ke dalam direktori kotak drop saya ke Pst4, 88 00:04:33,810 --> 00:04:35,450 ke breakout.c. 89 00:04:35,450 --> 00:04:40,670 Dan jika saya tatal ke bawah dan ke bawah dan ke bawah, dan biarlah saya pergi ke hadapan dan menghidupkan 90 00:04:40,670 --> 00:04:44,990 nombor baris saya. 91 00:04:44,990 --> 00:04:50,300 >> Apa yang saya akan lihat, jika saya tatal ke bawah ke line 62, adalah betul-betul baris yang 92 00:04:50,300 --> 00:04:50,910 kami telah berhenti di. 93 00:04:50,910 --> 00:04:53,720 Jadi garis ini di sini, 62, adalah di mana kita berada kira-kira untuk menjadi. 94 00:04:53,720 --> 00:04:57,470 Jadi sekarang dalam GDB, jika saya pergi ke hadapan dan menaip kini seterusnya, masukkan ia akan 95 00:04:57,470 --> 00:04:58,450 melaksanakan garis itu. 96 00:04:58,450 --> 00:05:00,610 Dan VoilĂ , kita mempunyai yang dipanggil tingkap g. 97 00:05:00,610 --> 00:05:02,800 Jika tidak biasa dengan apa yang GWindow adalah, tidak perlu bimbang. 98 00:05:02,800 --> 00:05:05,740 Spec ini akan memperkenalkan anda kepada, kerana serta beberapa video Walkthrough 99 00:05:05,740 --> 00:05:06,830 tertanam dalam spesifikasi. 100 00:05:06,830 --> 00:05:08,610 >> Tetapi sekarang mari kita membuat ini sedikit lebih menarik. 101 00:05:08,610 --> 00:05:10,960 Biar saya menggerakkan tetingkap ini lebih ke tepi sedikit. 102 00:05:10,960 --> 00:05:13,480 Izinkan saya membuat tingkap sedikit besar jadi saya boleh melihat lebih banyak. 103 00:05:13,480 --> 00:05:16,140 >> Dan kini izinkan saya pergi ke hadapan dan lakukan seterusnya lagi. 104 00:05:16,140 --> 00:05:17,550 Dan terdapat bata saya. 105 00:05:17,550 --> 00:05:20,490 Jika saya menaip seterusnya lagi sekarang saya melihat bola. 106 00:05:20,490 --> 00:05:23,520 Dan jika saya menaip datang lagi sekarang saya lihat dayung. 107 00:05:23,520 --> 00:05:26,690 >> Dan nasib baik gedit ini tidak benar-benar bekerjasama dengan menunjukkan saya 108 00:05:26,690 --> 00:05:27,660 semua yang saya mahu. 109 00:05:27,660 --> 00:05:30,820 Tetapi sekarang jika saya lakukan seterusnya lagi, datang lagi, saya hanya 110 00:05:30,820 --> 00:05:32,260 mengisytiharkan beberapa pembolehubah. 111 00:05:32,260 --> 00:05:34,750 Dan saya boleh mencetak mana-mana satu daripada lelaki di luar. 112 00:05:34,750 --> 00:05:37,170 Bata cetak, cetakan nyawa. 113 00:05:37,170 --> 00:05:39,910 >> Dan kini jika saya terus berbuat seterusnya, notis bahawa saya akan 114 00:05:39,910 --> 00:05:40,870 dalam gelung itu. 115 00:05:40,870 --> 00:05:43,380 Tetapi kod akan melaksanakan betul-betul seperti yang saya harapkan. 116 00:05:43,380 --> 00:05:45,810 Oleh itu, apabila saya mencecah fungsi ini, Tunggu Klik untuk, ia akan melakukan 117 00:05:45,810 --> 00:05:46,830 ia benar-benar itu. 118 00:05:46,830 --> 00:05:48,870 Jadi, saya seolah-olah telah hilang kawalan sepanjang program ini. 119 00:05:48,870 --> 00:05:50,480 >> GDB tidak memberi saya satu lagi segera. 120 00:05:50,480 --> 00:05:51,500 Tetapi tidak perlu bimbang. 121 00:05:51,500 --> 00:05:53,720 Pergi ke permainan saya, klik di suatu tempat. 122 00:05:53,720 --> 00:05:56,270 >> Dan VoilĂ , kini ia bertindak untuk line 86. 123 00:05:56,270 --> 00:05:59,460 Jadi sekali lagi, ia adalah tidak ternilai, akhirnya, bagi masalah debugging. 124 00:05:59,460 --> 00:06:03,050 Kerana anda benar-benar boleh melangkah melalui kod anda, perkara-perkara mencetak dan banyak, 125 00:06:03,050 --> 00:06:03,640 banyak, banyak lagi. 126 00:06:03,640 --> 00:06:07,210 Tetapi untuk sekarang, orang-alat sahaja perlu mendapatkan anda cukup jauh. 127 00:06:07,210 --> 00:06:10,050 >> Jadi kita, sudah tentu, mengambil lihat Grafik pada sekarang, tiba-tiba. 128 00:06:10,050 --> 00:06:12,350 Dan kini dunia kita mendapat sedikit lebih menarik. 129 00:06:12,350 --> 00:06:15,680 Dan anda tahu, mungkin, dari beberapa video dalam talian yang kita ada ini 130 00:06:15,680 --> 00:06:18,280 seluar pendek bahawa anda telah menonton sebagai sebahagian daripada set masalah. 131 00:06:18,280 --> 00:06:20,460 >> Dan mereka telah ditembak, sengaja, berlatarbelakangkan putih. 132 00:06:20,460 --> 00:06:23,380 Dan sebahagian daripada mereka mempunyai pengajaran Felo melukis beberapa teks pada 133 00:06:23,380 --> 00:06:25,490 skrin itu dilapisi di sebelah mereka. 134 00:06:25,490 --> 00:06:27,760 Tetapi sudah tentu, ini tidak semua yang menarik di dunia sebenar. 135 00:06:27,760 --> 00:06:30,520 Ini hanyalah satu dewan kuliah dengan skrin putih besar dan latar belakang. 136 00:06:30,520 --> 00:06:33,330 Dan pasukan pengeluaran menakjubkan apapun kami daripada membuat segala-galanya kelihatan cantik 137 00:06:33,330 --> 00:06:36,620 selepas fakta oleh tanaman daripada atau melapisi apa-apa 138 00:06:36,620 --> 00:06:37,840 kita lakukan atau tidak mahu. 139 00:06:37,840 --> 00:06:41,560 >> Sekarang hanya untuk memberi motivasi kepada minggu ini dan benar-benar, di mana anda boleh pergi, akhirnya, 140 00:06:41,560 --> 00:06:42,560 dengan sains komputer. 141 00:06:42,560 --> 00:06:44,260 Bukan hanya selepas masalah menetapkan empat. 142 00:06:44,260 --> 00:06:48,240 Tetapi selepas satu lagi kursus atau keseluruhan kurikulum ia menakjubkan apa yang anda boleh 143 00:06:48,240 --> 00:06:51,090 lakukan pada hari ini dari segi grafik khususnya. 144 00:06:51,090 --> 00:06:53,440 >> Sebahagian daripada anda mungkin telah melihat ini mengalir di dalam talian. 145 00:06:53,440 --> 00:06:56,240 Tetapi saya fikir saya akan menunjukkan kepada anda, hanya untuk beberapa minit, gambaran tentang apa 146 00:06:56,240 --> 00:07:01,890 teknologi komputer dan apa CGI, grafik komputer boleh lakukan hari ini 147 00:07:01,890 --> 00:07:04,510 dengan lagu biasa dan mungkin filem. 148 00:07:04,510 --> 00:07:05,760 >> [MUSIC - Lana Del RAY, "MUDA DAN CANTIK] 149 00:07:05,760 --> 00:10:50,270 150 00:10:50,270 --> 00:10:52,470 >> SPEAKER 1: Ia hanya sedikit menakjubkan, mungkin, betapa 151 00:10:52,470 --> 00:10:52,857 kehadiran - 152 00:10:52,857 --> 00:10:57,040 >> [Tepuk tangan] 153 00:10:57,040 --> 00:10:59,230 >> SPEAKER 1: Saya hanya turun ia. 154 00:10:59,230 --> 00:11:02,920 Tetapi ia adalah benar-benar menakjubkan, saya fikir, hanya bagaimana perisian kehadiran dan kod dan 155 00:11:02,920 --> 00:11:04,230 alat-alat seperti ini benar-benar adalah. 156 00:11:04,230 --> 00:11:07,685 Itulah rasa arah di mana anda boleh pergi. 157 00:11:07,685 --> 00:11:10,620 Oh, tidak Appliance lebih hari ini. 158 00:11:10,620 --> 00:11:14,640 Nah, itu sebenarnya masa tragis diberikan titik saya cuba untuk membuat. 159 00:11:14,640 --> 00:11:18,670 >> Baiklah, jadi mari kita melancarkan Fusion lagi. 160 00:11:18,670 --> 00:11:20,800 Ingatkan saya kemudian. 161 00:11:20,800 --> 00:11:24,190 Semua betul, dan anda sepatutnya mendapat e-mel sebagai diketepikan jika anda tidak mendapat 162 00:11:24,190 --> 00:11:25,460 notis seperti itu. 163 00:11:25,460 --> 00:11:29,940 Baiklah, jadi ingat bahawa minggu lepas kami mula mengupas kembali ini 164 00:11:29,940 --> 00:11:31,380 kemudiannya dikenali sebagai tali. 165 00:11:31,380 --> 00:11:34,700 >> mengimbas kembali rentetan jenis data itu diisytiharkan di perpustakaan CS50. 166 00:11:34,700 --> 00:11:37,740 Dan ia adalah sebahagian daripada roda latihan yang kini akan mula berlepas. 167 00:11:37,740 --> 00:11:41,280 Ia adalah satu konsep yang berguna awal. 168 00:11:41,280 --> 00:11:43,750 Tetapi sekarang ia akan mendapatkan lebih banyak menarik dan lebih kuat untuk 169 00:11:43,750 --> 00:11:48,330 benar-benar melihat bahawa di bawah hud, rentetan hanya apa, adakah kita katakan? 170 00:11:48,330 --> 00:11:50,500 >> Ya, jadi ia adalah yang dipanggil char *. 171 00:11:50,500 --> 00:11:53,860 Dan * ada menunjukkan bahawa terdapat beberapa jenis alamat yang terlibat. 172 00:11:53,860 --> 00:11:58,690 Dan supaya apabila anda mengatakan char * anda hanya bermakna berubah-ubah yang jenis data adalah 173 00:11:58,690 --> 00:11:59,290 penunjuk sekarang. 174 00:11:59,290 --> 00:12:01,770 Hakikat bahawa terdapat bintang yang terdapat hanya bermaksud bahawa anda mengisytiharkan 175 00:12:01,770 --> 00:12:03,020 dipanggil penunjuk. 176 00:12:03,020 --> 00:12:06,220 Dan penunjuk yang akan nampaknya menyimpan alamat, di 177 00:12:06,220 --> 00:12:07,810 Sudah tentu, char. 178 00:12:07,810 --> 00:12:08,960 >> Sekarang mengapa ini masuk akal? 179 00:12:08,960 --> 00:12:11,200 Nah, apa yang adalah rentetan di bawah hood? 180 00:12:11,200 --> 00:12:15,130 Nah, untuk beberapa lama kita telah mengatakan bahawa rentetan bawah hud adalah 181 00:12:15,130 --> 00:12:18,460 hanya h-e-l-l-o, misalnya. 182 00:12:18,460 --> 00:12:21,585 >> Tetapi kita telah bercakap tentang perkara ini yang, pada dasarnya, array. 183 00:12:21,585 --> 00:12:25,410 Dan array kemudian akan kelihatan sedikit lebih seperti ini, dengan masing-masing 184 00:12:25,410 --> 00:12:26,460 mengambil menggigit. 185 00:12:26,460 --> 00:12:28,710 Dan kemudian kita telah berkata bahawa ada sesuatu yang istimewa kembali di sini, 186 00:12:28,710 --> 00:12:31,270 backslash 0, atau null. 187 00:12:31,270 --> 00:12:35,230 >> Jadi semua masa ini, ini di sini telah rentetan. 188 00:12:35,230 --> 00:12:38,320 Tetapi benar-benar, tali adalah sebenarnya alamat. 189 00:12:38,320 --> 00:12:43,210 Dan alamat, seperti yang kita akan lihat, sering awalan 0x oleh konvensyen. 190 00:12:43,210 --> 00:12:44,540 Apakah 0x menunjukkan? 191 00:12:44,540 --> 00:12:45,970 Adakah sesiapa yang tahu? 192 00:12:45,970 --> 00:12:47,320 >> Jadi ia hanya bermakna perenambelasan. 193 00:12:47,320 --> 00:12:52,360 Jadi, anda mungkin ingat, sebenarnya, dari Pst 1, saya percaya, salah satu daripada memanaskan badan 194 00:12:52,360 --> 00:12:55,740 soalan sebenarnya ditanya mengenai notasi perenambelasan di samping 195 00:12:55,740 --> 00:12:57,100 binari dan perpuluhan. 196 00:12:57,100 --> 00:13:00,460 Dan motivasi di sini adalah bahawa dengan perenambelasan anda mempunyai 16 197 00:13:00,460 --> 00:13:01,770 digit pada pelupusan anda. 198 00:13:01,770 --> 00:13:07,900 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, diikuti dengan a, b, c, d, e, f. 199 00:13:07,900 --> 00:13:10,430 >> Dan jika anda mengira semua orang-orang ke atas, anda akan mendapat sejumlah 16. 200 00:13:10,430 --> 00:13:13,200 Jadi ini adalah berbeza dengan perpuluhan, di mana kita mempunyai 10 201 00:13:13,200 --> 00:13:14,690 digit, 0 hingga sembilan. 202 00:13:14,690 --> 00:13:17,750 Ia adalah berbeza dengan binari di mana kita hanya perlu 0 dan 1. 203 00:13:17,750 --> 00:13:21,450 >> Tetapi pada akhir hari, anda boleh hanya mewakili nombor yang sama, tetapi 204 00:13:21,450 --> 00:13:22,500 agak berbeza. 205 00:13:22,500 --> 00:13:25,840 Dan perenambelasan adalah perkara biasa kerana sebagai Ternyata - dan kita akan melihat ini 206 00:13:25,840 --> 00:13:28,790 kemudian dalam perjalanan - walaupun kita akan mendapat kepada pengaturcaraan web dalam konteks 207 00:13:28,790 --> 00:13:32,100 HTML dan kod warna, perenambelasan baik. 208 00:13:32,100 --> 00:13:36,390 Kerana setiap angka, ternyata, mewakili empat bit dengan sempurna. 209 00:13:36,390 --> 00:13:39,280 Jadi ia hanya jenis garisan sehingga baik kerana akhirnya kita akan melihat. 210 00:13:39,280 --> 00:13:44,720 Jadi ini mungkin Ox123 atau sesuatu seperti itu, yang melambangkan alamat 123 211 00:13:44,720 --> 00:13:47,050 di suatu tempat di dalam saya memori komputer. 212 00:13:47,050 --> 00:13:50,600 >> Tetapi sudah tentu, beberapa masalah timbul kerana ini asas 213 00:13:50,600 --> 00:13:51,520 pelaksanaan. 214 00:13:51,520 --> 00:13:55,930 Dan ingat bahawa saya mengambil tikaman di melaksanakan fungsi seperti ini - 215 00:13:55,930 --> 00:14:00,260 bandingkan melontarkan 0 dot c minggu lepas, bahawa walaupun ia kelihatan seperti ia adalah 216 00:14:00,260 --> 00:14:04,270 betul, ia hanya tidak membandingkan dua tali dengan betul. 217 00:14:04,270 --> 00:14:07,470 >> Saya telah dibuang utama, dan saya telah dibuang jauh komen hanya memberi tumpuan di atas 218 00:14:07,470 --> 00:14:08,970 kod itu kepentingan di sini. 219 00:14:08,970 --> 00:14:10,660 Dan ia adalah dalam warna merah kerana ia adalah kereta. 220 00:14:10,660 --> 00:14:11,670 Atas sebab apa? 221 00:14:11,670 --> 00:14:15,890 >> Nah, di atas sana apabila saya diisytiharkan tali, apa yang benar-benar berlaku 222 00:14:15,890 --> 00:14:17,260 di bawah hood? 223 00:14:17,260 --> 00:14:19,530 Baiklah, biar saya pergi lebih ke skrin di sini dan menarik itu. 224 00:14:19,530 --> 00:14:23,230 Jadi saya mengisytiharkan, sekali lagi, GetString tali s. 225 00:14:23,230 --> 00:14:26,640 >> Jadi saya akan pergi ke hadapan sekarang dan menarik s untuk apa yang ia benar-benar adalah. 226 00:14:26,640 --> 00:14:28,590 Ia akan menjadi persegi di sini. 227 00:14:28,590 --> 00:14:30,490 Dan saya akan menuntut bahawa adalah 32 bit. 228 00:14:30,490 --> 00:14:32,890 Sekurang-kurangnya ia biasanya adalah, sekurang-kurangnya pada CS50 229 00:14:32,890 --> 00:14:34,520 perkakas dalam banyak komputer. 230 00:14:34,520 --> 00:14:35,980 Saya akan memanggilnya s. 231 00:14:35,980 --> 00:14:39,070 >> Tetapi sekarang ingat bahawa kita dipanggil GetString. 232 00:14:39,070 --> 00:14:41,430 Pulangan Jadi GetString, sudah tentu, rentetan. 233 00:14:41,430 --> 00:14:45,790 Jika jenis pengguna dalam h-e-l-l-o masuk rentetan hello akan dikembalikan. 234 00:14:45,790 --> 00:14:51,010 Dan rentetan itu, seperti yang kita hanya berkata, berakhir di suatu tempat di dalam memori komputer anda 235 00:14:51,010 --> 00:14:53,240 dengan 0 garis sendeng terbalik di akhir. 236 00:14:53,240 --> 00:14:56,650 Saya akan menarik ini seperti pelbagai - atau blok berdampingan aksara - 237 00:14:56,650 --> 00:14:58,330 yang sebenarnya. 238 00:14:58,330 --> 00:15:01,790 >> Dan kini, apa yang GetString sebenarnya kembali? 239 00:15:01,790 --> 00:15:04,340 Apa yang telah GetString telah kembali semua masa ini? 240 00:15:04,340 --> 00:15:07,520 Nah, kita katakan, dalam beberapa minggu lepas, ia kembali rentetan. 241 00:15:07,520 --> 00:15:10,250 Tetapi yang lebih teknikal, apakah GetString pulangan nampaknya? 242 00:15:10,250 --> 00:15:11,610 >> PENONTON: Alamat An. 243 00:15:11,610 --> 00:15:12,600 >> SPEAKER 1: Alamat An. 244 00:15:12,600 --> 00:15:16,630 Khususnya ia kembali alamat gigitan pertama, apa sahaja ia. 245 00:15:16,630 --> 00:15:18,830 Saya hanya terus menggunakan satu, dua, tiga kerana ia adalah mudah. 246 00:15:18,830 --> 00:15:21,380 >> Ia akan kembali alamat yang pertama watak dalam tali. 247 00:15:21,380 --> 00:15:23,510 Dan kita berkata minggu lepas bahawa yang mencukupi. 248 00:15:23,510 --> 00:15:26,710 Kerana kita sentiasa boleh mengetahui di mana akhir rentetan hanya dengan 249 00:15:26,710 --> 00:15:30,150 iterating ke atasnya, mungkin, dengan untuk gelung atau gelung sementara atau sesuatu seperti 250 00:15:30,150 --> 00:15:34,990 itu, hanya mencari "backslash 0", watak sentinel khas. 251 00:15:34,990 --> 00:15:37,220 >> Dan kemudian kita tahu bahawa rentetan berlaku untuk menjadi panjang - 252 00:15:37,220 --> 00:15:37,980 dalam kes ini - 253 00:15:37,980 --> 00:15:38,670 lima. 254 00:15:38,670 --> 00:15:43,800 Jadi secara teknikal apa GetString tidak ia kembali Ox123 dalam kes ini. 255 00:15:43,800 --> 00:15:53,670 Dan teknikal maka apa yang berlaku ialah yang kita simpan, dalam s, Ox123. 256 00:15:53,670 --> 00:15:56,460 Pada akhir hari ini, walaupun ini adalah konsep baru, petunjuk, mereka 257 00:15:56,460 --> 00:15:57,350 hanya pembolehubah. 258 00:15:57,350 --> 00:16:00,440 Tetapi ia berlaku untuk menyimpan bit yang secara kolektif mewakili alamat. 259 00:16:00,440 --> 00:16:03,700 Jadi secara teknikal semua mereka mendapat disimpan di dalam s adalah Ox123. 260 00:16:03,700 --> 00:16:04,680 >> Tetapi kita sebagai manusia - 261 00:16:04,680 --> 00:16:06,020 termasuk seterusnya hari ini - 262 00:16:06,020 --> 00:16:09,290 benar-benar tidak akan peduli, biasanya, apa alamat sebenar 263 00:16:09,290 --> 00:16:10,520 beberapa sebahagian memori. 264 00:16:10,520 --> 00:16:14,040 Ia hanya ke tahap rendah terperinci untuk secara intelektual yang menarik. 265 00:16:14,040 --> 00:16:15,440 Jadi saya akan membatalkan ini. 266 00:16:15,440 --> 00:16:19,810 Dan sebaliknya, tahap yang lebih tinggi, hanya mengatakan bahawa apabila kita berbicara tentang petunjuk 267 00:16:19,810 --> 00:16:22,170 Saya akan hanya menarik lebih arrow mesra pengguna yang menyampaikan 268 00:16:22,170 --> 00:16:26,060 Idea yang sama dan abstrak jauh butir-butir mengenai apa yang sebenar 269 00:16:26,060 --> 00:16:27,700 alamat asas adalah. 270 00:16:27,700 --> 00:16:33,290 >> Sekarang jika kita kembali kepada kod, apa berlaku minggu lepas jika kita mempunyai tali t 271 00:16:33,290 --> 00:16:34,510 sama GetString? 272 00:16:34,510 --> 00:16:38,630 Nah, jika saya sekali lagi, taip hello kali ini saya akan mendapatkan 273 00:16:38,630 --> 00:16:40,460 lagi sebahagian memori. 274 00:16:40,460 --> 00:16:44,820 h-e-l-l-o backslash 0. 275 00:16:44,820 --> 00:16:48,320 >> Tetapi kerana saya dipanggil GetString kali kedua - 276 00:16:48,320 --> 00:16:51,100 dan saya tahu ini dari melihat Kod sumber untuk GetString - walaupun 277 00:16:51,100 --> 00:16:54,350 walaupun ia adalah kebetulan bahawa hello adalah ditaip dalam dua kali, GetString tidak 278 00:16:54,350 --> 00:16:55,890 akan cuba untuk mengoptimumkan dan bijak. 279 00:16:55,890 --> 00:16:58,550 Ia hanya akan mendapat satu lagi sebahagian daripada memori daripada komputer, yang merupakan 280 00:16:58,550 --> 00:16:59,640 akan berada di alamat yang lain. 281 00:16:59,640 --> 00:17:02,330 Mari kita sewenang-wenangnya hanya mengatakan 456. 282 00:17:02,330 --> 00:17:04,079 >> Dan kemudian apa yang ia akan kembali? 283 00:17:04,079 --> 00:17:08,030 Ia akan kembali 456 dan menyimpannya dalam t. 284 00:17:08,030 --> 00:17:12,010 Jadi apa yang benar-benar berlaku, pada sebelah kiri adalah saya mempunyai sebahagian yang lain 285 00:17:12,010 --> 00:17:14,260 ingatan, 32 bit biasanya. 286 00:17:14,260 --> 00:17:16,720 Dan di sana akan pergi Ox456. 287 00:17:16,720 --> 00:17:20,140 Tetapi sekali lagi, saya tidak berminat dalam nombor tertentu lagi. 288 00:17:20,140 --> 00:17:23,069 Saya hanya akan abstrak menarik sebagai anak panah. 289 00:17:23,069 --> 00:17:25,202 >> Jadi ini kini merupakan penjelasan baru. 290 00:17:25,202 --> 00:17:28,735 Tetapi ia adalah idea yang sama yang tepat itu telah berlaku sepanjang masa ini. 291 00:17:28,735 --> 00:17:33,150 Dan sebagainya sebab itu, yang pertama ini versi membandingkan adalah kereta 292 00:17:33,150 --> 00:17:34,480 minggu lepas ialah, mengapa? 293 00:17:34,480 --> 00:17:38,000 Apabila anda lakukan jika s sama sama t apa yang anda benar-benar 294 00:17:38,000 --> 00:17:40,550 di bawah hood membandingkan? 295 00:17:40,550 --> 00:17:41,910 >> Anda membandingkan alamat. 296 00:17:41,910 --> 00:17:47,950 Dan hanya intuitif, jelas, Ox123 tidak akan sama Ox456. 297 00:17:47,950 --> 00:17:49,380 Nombor-nombor tersebut, orang-orang bit hanya berbeza. 298 00:17:49,380 --> 00:17:53,220 >> Dan begitu konsisten, minggu lepas katanya anda menaip perkara yang berbeza, walaupun 299 00:17:53,220 --> 00:17:55,360 kata-kata itu kata demi kata yang sama. 300 00:17:55,360 --> 00:17:58,770 Oleh itu, kita menetapkan ini. 301 00:17:58,770 --> 00:18:00,120 Dari segi orang biasa itu, apa yang menetapkan? 302 00:18:00,120 --> 00:18:02,110 >> PENONTON: Gunakan fungsi. 303 00:18:02,110 --> 00:18:02,870 >> SPEAKER 1: Gunakan fungsi. 304 00:18:02,870 --> 00:18:05,190 Atau bintang pasti terlibat, tetapi menggunakan fungsi untuk melakukan apa? 305 00:18:05,190 --> 00:18:05,962 >> PENONTON: Untuk membandingkan tali. 306 00:18:05,962 --> 00:18:07,390 >> SPEAKER 1: Untuk membandingkan tali. 307 00:18:07,390 --> 00:18:11,030 Jadi masalah asas di sini adalah bahawa saya hanya menimbangkan 308 00:18:11,030 --> 00:18:15,870 kualiti tali untuk ditakrifkan oleh perbandingan alamat mereka. 309 00:18:15,870 --> 00:18:18,540 Dan jelas bahawa hanya bisu kini sekali anda memahami apa yang berlaku di 310 00:18:18,540 --> 00:18:19,510 di bawah hood. 311 00:18:19,510 --> 00:18:23,270 Untuk benar-benar membandingkan tali untuk melihat jika mereka yang sama dalam cara yang manusia 312 00:18:23,270 --> 00:18:26,680 akan mempertimbangkan dua tali untuk sama kita perlu membandingkan mereka watak untuk 313 00:18:26,680 --> 00:18:28,070 watak untuk watak. 314 00:18:28,070 --> 00:18:30,020 >> Sekarang saya boleh dilakukan ini sangat tediously. 315 00:18:30,020 --> 00:18:32,240 Tetapi akrab, kami menggunakan untuk gelung. 316 00:18:32,240 --> 00:18:36,050 Dan hanya membandingkan s kurungan i terhadap t kurungan i. 317 00:18:36,050 --> 00:18:39,590 s kurungan i campur 1 terhadap t kurungan i campur 1, dan sebagainya, di dalam 318 00:18:39,590 --> 00:18:40,580 beberapa jenis gelung. 319 00:18:40,580 --> 00:18:44,950 Dan jika saya melihat mana-mana dua watak-watak yang berbeza, atau jika saya menyedari bahawa aduh, s adalah 320 00:18:44,950 --> 00:18:48,410 pendek daripada t atau lebih lama daripada t Saya segera boleh mengatakan palsu, 321 00:18:48,410 --> 00:18:49,390 mereka tidak sama. 322 00:18:49,390 --> 00:18:55,370 >> Tetapi jika saya mendapatkan melalui s dan t dan berkata sama, sama, sama, sama, sama, akhir 323 00:18:55,370 --> 00:18:58,520 kedua-dua rentetan, saya boleh mengatakan benar, mereka adalah sama. 324 00:18:58,520 --> 00:19:01,040 Well, bersyukur, tahun lalu seseorang menulis kod yang bagi kami. 325 00:19:01,040 --> 00:19:03,790 >> Dan mereka memanggilnya StrComp untuk tali utama. 326 00:19:03,790 --> 00:19:11,900 Dan walaupun ia adalah kaunter sedikit intuitif, StrComp mengembalikan 0 jika orang-orang 327 00:19:11,900 --> 00:19:14,520 dua tali, s dan t yang sama. 328 00:19:14,520 --> 00:19:18,090 Tetapi ia mengembalikan nilai negatif jika s harus datang sebelum t abjad atau 329 00:19:18,090 --> 00:19:20,610 nilai positif jika ia sepatutnya selepas t abjad. 330 00:19:20,610 --> 00:19:24,030 >> Jadi jika anda pernah mahu menyelesaikan sesuatu, ternyata bahawa StrComp berguna. 331 00:19:24,030 --> 00:19:26,660 Kerana ia tidak hanya mengatakan ya atau tidak, sama atau tidak. 332 00:19:26,660 --> 00:19:30,440 Ia memberikan rasa pesanan suka kekuatan kamus. 333 00:19:30,440 --> 00:19:33,770 Jadi StrComp, s koma t sama sama dengan 0 bermakna bahawa 334 00:19:33,770 --> 00:19:35,200 tali yang benar-benar sama. 335 00:19:35,200 --> 00:19:38,680 Kerana sesiapa yang menulis fungsi ini tahun lalu mungkin digunakan untuk gelung 336 00:19:38,680 --> 00:19:42,840 atau gelung semasa atau sesuatu seperti itu untuk mengintegrasikan lebih watak-watak lagi 337 00:19:42,840 --> 00:19:45,270 dan lagi dan lagi. 338 00:19:45,270 --> 00:19:47,300 >> Tetapi dua masalah timbul di sini. 339 00:19:47,300 --> 00:19:48,750 Ini adalah copy0.c. 340 00:19:48,750 --> 00:19:51,680 Dan kedua-dua dalam merah kerana ia adalah cacat. 341 00:19:51,680 --> 00:19:52,800 Dan apa yang kita lakukan di sini? 342 00:19:52,800 --> 00:19:54,310 Well, pertama saya dipanggil GetString. 343 00:19:54,310 --> 00:19:56,255 Dan saya disimpan nilai pulangan dalam s. 344 00:19:56,255 --> 00:20:00,260 Jadi yang cukup banyak yang sama seperti ini bahagian atas gambar. 345 00:20:00,260 --> 00:20:01,490 >> Tetapi apa yang berlaku selepas itu? 346 00:20:01,490 --> 00:20:04,980 Baiklah, biar saya pergi ke hadapan dan menghilangkan daripada sejumlah besar ini. 347 00:20:04,980 --> 00:20:09,650 Kami akan memundurkan dalam masa di mana kita hanya mempunyai s, yang kini selaras dengan 348 00:20:09,650 --> 00:20:10,940 line satu di sana. 349 00:20:10,940 --> 00:20:11,400 >> Saya menyemak. 350 00:20:11,400 --> 00:20:13,450 Jika s sama sama dengan 0. 351 00:20:13,450 --> 00:20:18,670 Sekarang, nota sampingan yang cepat, apabila GetString mungkin kembali 0? 352 00:20:18,670 --> 00:20:19,580 Tidak ada memori yang cukup. 353 00:20:19,580 --> 00:20:19,880 Betul? 354 00:20:19,880 --> 00:20:22,310 >> Ia jarang berlaku bahawa ini akan berlaku, pasti pada komputer itu 355 00:20:22,310 --> 00:20:24,740 mendapat beratus-ratus Megs atau walaupun gig RAM. 356 00:20:24,740 --> 00:20:27,080 Tetapi ia boleh, dalam teori, kembali 0, terutamanya jika 357 00:20:27,080 --> 00:20:28,080 pengguna tidak bekerjasama. 358 00:20:28,080 --> 00:20:31,640 Terdapat cara-cara untuk berpura-pura seperti anda tidak mempunyai apa-apa yang dimasukkan dan silap mata 359 00:20:31,640 --> 00:20:34,100 GetString kembali ke 0 berkesan. 360 00:20:34,100 --> 00:20:35,470 >> Jadi ia akan menyemak untuk itu. 361 00:20:35,470 --> 00:20:39,430 Kerana jika mana-mana anda telah mula mendapatkan, sudah, kerosakan segmentasi - 362 00:20:39,430 --> 00:20:42,280 yang mungkin telah menjadi sumber yang kekecewaan beberapa - 363 00:20:42,280 --> 00:20:46,150 mereka adalah hampir sentiasa hasil memori yang berkaitan dengan kesilapan. 364 00:20:46,150 --> 00:20:50,440 Entah bagaimana anda sehingga merosakkan berkenaan dengan sesuatu penunjuk, walaupun anda tidak sedar 365 00:20:50,440 --> 00:20:51,530 terdapat penunjuk. 366 00:20:51,530 --> 00:20:55,260 Jadi anda mungkin telah mendorong segmentasi kesilapan seawal satu minggu menggunakan 367 00:20:55,260 --> 00:21:02,100 sesuatu seperti untuk gelung atau sementara gelung dan array dengan pergi terlalu jauh 368 00:21:02,100 --> 00:21:05,900 lalu sempadan beberapa array yang anda diisytiharkan, dalam seminggu dua 369 00:21:05,900 --> 00:21:06,690 tertentu. 370 00:21:06,690 --> 00:21:09,220 >> Anda mungkin telah dilakukan walaupun dalam masalah menetapkan empat dengan Breakout. 371 00:21:09,220 --> 00:21:12,910 Walaupun anda mungkin tidak pernah melihat mana-mana bintang dalam kod taburan 372 00:21:12,910 --> 00:21:17,410 Breakout, ternyata bahawa mereka GRect dan GOval dan lain-lain perkara-perkara seperti, 373 00:21:17,410 --> 00:21:19,650 orang-orang yang benar-benar petunjuk di bawah hood. 374 00:21:19,650 --> 00:21:23,430 >> Tetapi Stanford, seperti kita, jenis menyembunyikan yang terperinci sekurang-kurangnya untuk perpustakaan 375 00:21:23,430 --> 00:21:26,540 tujuan, banyak seperti yang kita lakukan untuk tali dan char *. 376 00:21:26,540 --> 00:21:30,060 Tetapi GRect dan GOval dan semua orang-orang perkara yang anda lelaki atau akan menggunakan 377 00:21:30,060 --> 00:21:32,630 minggu ini adalah akhirnya alamat ingatan. 378 00:21:32,630 --> 00:21:33,650 Anda hanya tidak tahu. 379 00:21:33,650 --> 00:21:37,240 >> Jadi ia tidak mengejutkan, mungkin, yang anda mungkin perjalanan ke beberapa 380 00:21:37,240 --> 00:21:38,580 kesalahan segmentasi. 381 00:21:38,580 --> 00:21:41,290 Tetapi apa yang menarik di sini sekarang, jika selepas kita memeriksa 0 yang kita lakukan 382 00:21:41,290 --> 00:21:43,460 tali t mendapat s. 383 00:21:43,460 --> 00:21:44,690 Baiklah, biar saya mengisytiharkan t. 384 00:21:44,690 --> 00:21:47,730 Saya akan menarik sebagai persegi, 32 bit, memanggilnya t. 385 00:21:47,730 --> 00:21:49,740 Dan kemudian saya akan lakukan mendapat s. 386 00:21:49,740 --> 00:21:51,130 >> Nah, apa maksudnya? 387 00:21:51,130 --> 00:21:53,280 Nah, ia sedikit sukar untuk memikirkan tentang gambar bijak. 388 00:21:53,280 --> 00:21:55,025 Tetapi mari kita berfikir tentang apa yang di dalam x? 389 00:21:55,025 --> 00:21:59,430 Apa yang benar-benar berubah-ubah di dalam ini? 390 00:21:59,430 --> 00:22:01,500 The Ox123 nilai. 391 00:22:01,500 --> 00:22:05,815 >> Oleh itu, apabila saya katakan tali t mendapat s, yang hanya bermaksud mengambil bilangan 392 00:22:05,815 --> 00:22:10,070 dalam s, yang Ox123 dan meletakkannya Ox123. 393 00:22:10,070 --> 00:22:13,740 Atau bergambar, jika saya jenis abstrak dari detail bahawa ia mempunyai 394 00:22:13,740 --> 00:22:16,600 kesan literal melakukan ini juga. 395 00:22:16,600 --> 00:22:22,110 >> Jadi sekarang, berfikir kembali ke minggu lalu apabila kami menuju ke kapitalis T. Saya 396 00:22:22,110 --> 00:22:23,800 lakukan T kurungan 0. 397 00:22:23,800 --> 00:22:27,150 Nah, T kurungan 0, walaupun ia adalah satu penunjuk, anda boleh merawat ia seolah-olah 398 00:22:27,150 --> 00:22:29,220 ia adalah pelbagai, dengan persegi notasi kurungan. 399 00:22:29,220 --> 00:22:31,550 >> Jadi di mana T kurungan 0? 400 00:22:31,550 --> 00:22:32,990 Nah, itu h. 401 00:22:32,990 --> 00:22:36,800 Dan sebagainya apabila kita menggunakan garis kod, dua bahagian atas, yang berada dalam c yang type.h 402 00:22:36,800 --> 00:22:38,460 file kepala, itu di mana ia diisytiharkan. 403 00:22:38,460 --> 00:22:44,410 Anda mengambil kesempatan ini H. Tetapi tentu, itu h yang sama itu 404 00:22:44,410 --> 00:22:46,540 dalam s, jadi untuk bercakap. 405 00:22:46,540 --> 00:22:51,930 Dan sekarang anda telah menukar atau modal kedua-dua asal dan 406 00:22:51,930 --> 00:22:53,120 dipanggil salinan. 407 00:22:53,120 --> 00:22:56,620 Kerana anda tidak membuat salinan di cara yang manusia mahu ia menjadi. 408 00:22:56,620 --> 00:22:59,710 >> Jadi apa yang telah menetapkan di sini, dalam copy1.c minggu lepas? 409 00:22:59,710 --> 00:23:03,070 410 00:23:03,070 --> 00:23:05,580 Fungsi, supaya kita boleh benar-benar menyalin tali. 411 00:23:05,580 --> 00:23:08,700 Dan asasnya, apa yang kita perlu lakukan untuk menyalin rentetan? 412 00:23:08,700 --> 00:23:12,070 >> Nah, dalam versi ini hijau di sini saya akan melakukannya tahap yang agak rendah. 413 00:23:12,070 --> 00:23:14,260 Sebenarnya ada fungsi mereka boleh membantu dengan ini. 414 00:23:14,260 --> 00:23:17,710 Tetapi yang paling asas, dan yang paling satu biasa, sekurang-kurangnya, tidak lama lagi akan 415 00:23:17,710 --> 00:23:19,600 biasa kepada kita, adalah seperti berikut - 416 00:23:19,600 --> 00:23:21,910 jadi satu pada baris pertama kod warna hijau sekarang. 417 00:23:21,910 --> 00:23:23,970 >> Saya hanya menulis semula s sebagai char *. 418 00:23:23,970 --> 00:23:25,250 Tiada fungsi perbezaan di sana. 419 00:23:25,250 --> 00:23:28,790 Saya hanya melemparkan perpustakaan CS50 dan Saya memanggil apa yang ada, a * char. 420 00:23:28,790 --> 00:23:31,640 >> Sekarang dot, dot, dot, kerana terdapat beberapa semakan ralat yang tidak 421 00:23:31,640 --> 00:23:33,200 menarik untuk bercakap tentang lagi. 422 00:23:33,200 --> 00:23:34,710 Jadi sekarang t diisytiharkan. 423 00:23:34,710 --> 00:23:35,780 Ia juga adalah * char. 424 00:23:35,780 --> 00:23:38,280 Jadi saya menarik persegi sedikit pada skrin seperti sebelum ini. 425 00:23:38,280 --> 00:23:41,870 >> Tetapi pada sebelah kanan, malloc, kita kata adalah memori memperuntukkan. 426 00:23:41,870 --> 00:23:44,130 Jadi memperuntukkan beberapa sebahagian memori. 427 00:23:44,130 --> 00:23:48,830 Dan berapa banyak bait kita sebenarnya mahu memperuntukkan, ia seolah-olah? 428 00:23:48,830 --> 00:23:50,340 >> Well, panjang rentetan s. 429 00:23:50,340 --> 00:23:52,310 Jadi, jika ia adalah khabar itu akan menjadi lima. 430 00:23:52,310 --> 00:23:53,950 Kami akan mengatakan h-e-l-l-o. 431 00:23:53,950 --> 00:23:55,090 Jadi lima bait. 432 00:23:55,090 --> 00:23:57,960 >> Tetapi campur 1, mengapa 1? 433 00:23:57,960 --> 00:23:58,830 The 0 watak. 434 00:23:58,830 --> 00:24:03,640 Jika kita tidak meninggalkan ruang untuk lelaki ini kita sengaja mungkin mewujudkan keadaan yang 435 00:24:03,640 --> 00:24:05,600 di mana tali adalah h-e-l-l-o. 436 00:24:05,600 --> 00:24:08,470 Dan kemudian GetString masa akan datang adalah dipanggil dan saya menaip, misalnya, 437 00:24:08,470 --> 00:24:14,020 David, D-a-v-i-d, komputer akan untuk berfikir bahawa s sebenarnya 438 00:24:14,020 --> 00:24:18,900 h-e-l-l-o-d-a-v-i-d kerana ada tidak memecahkan di antara kata-kata. 439 00:24:18,900 --> 00:24:19,810 >> Oleh itu, kita perlu berehat itu. 440 00:24:19,810 --> 00:24:20,720 Oleh itu, kita tidak mahu lima. 441 00:24:20,720 --> 00:24:22,100 Kami mahu enam bait. 442 00:24:22,100 --> 00:24:23,110 >> Dan bait yang saya katakan. 443 00:24:23,110 --> 00:24:25,220 Tetapi ia adalah benar-benar masa saiz char. 444 00:24:25,220 --> 00:24:28,040 Teknikal char hampir sentiasa bait tunggal. 445 00:24:28,040 --> 00:24:31,030 >> Tetapi hanya untuk membuat kod kita mudah alih, jadi untuk bercakap, supaya ia berfungsi pada 446 00:24:31,030 --> 00:24:33,750 komputer yang berbeza walaupun mereka mungkin agak berbeza di bawah 447 00:24:33,750 --> 00:24:36,590 hud, saya akan umum mengatakan saiz char supaya 448 00:24:36,590 --> 00:24:37,660 kod saya selalu bekerja. 449 00:24:37,660 --> 00:24:40,610 Dan saya tidak perlu susun semula ia hanya kerana saya menaik taraf komputer saya atau menggunakan 450 00:24:40,610 --> 00:24:42,140 beberapa platform yang berbeza. 451 00:24:42,140 --> 00:24:45,300 >> Jadi saya telah mendapat 6 kali saiz a char, yang berlaku sebagai 1. 452 00:24:45,300 --> 00:24:47,440 Jadi cara malloc boleh memberikan saya enam bait. 453 00:24:47,440 --> 00:24:49,140 Apa yang benar-benar buat? 454 00:24:49,140 --> 00:24:52,810 Baiklah, biar saya melancarkan kembali dalam masa di sini di mana kita berada dalam cerita. 455 00:24:52,810 --> 00:24:57,620 >> Jadi, jika saya kembali di sini, saya telah diisytiharkan a * char dipanggil t. 456 00:24:57,620 --> 00:25:00,280 Saya kini telah dipanggil malloc selama enam bait. 457 00:25:00,280 --> 00:25:06,400 Dan sekarang saya akan menarik orang-orang enam bait seperti pelbagai yang lebih awal. 458 00:25:06,400 --> 00:25:10,570 Tetapi saya sebenarnya tidak tahu apa yang dalam pelbagai ini. 459 00:25:10,570 --> 00:25:14,640 >> Jika anda memperuntukkan memori ternyata bahawa anda tidak boleh mempercayai bahawa terdapat beberapa 460 00:25:14,640 --> 00:25:15,810 nilai dikenali di sana. 461 00:25:15,810 --> 00:25:18,400 Ia boleh digunakan oleh sesuatu lain, beberapa fungsi lain, yang lain 462 00:25:18,400 --> 00:25:19,630 baris kod yang anda menulis. 463 00:25:19,630 --> 00:25:22,870 Oleh itu, kita biasanya akan memanggil sampah ini nilai dan menarik mereka, mungkin, sebagai 464 00:25:22,870 --> 00:25:26,170 tanda tanya, hanya menunjukkan bahawa kita tidak tahu apa yang sebenarnya di sana. 465 00:25:26,170 --> 00:25:30,390 Dan itu tidak ada masalah besar selagi kita cukup bijak untuk menimpa mereka 466 00:25:30,390 --> 00:25:34,550 nilai-nilai sampah dengan nombor atau aksara yang kita sayangi. 467 00:25:34,550 --> 00:25:36,340 >> Jadi dalam kes ini apa yang saya akan lakukan? 468 00:25:36,340 --> 00:25:38,670 Nah, talian saya kod seterusnya, saya mempunyai empat. 469 00:25:38,670 --> 00:25:41,350 int i mendapatkan 0, n mendapat panjang rentetan s. 470 00:25:41,350 --> 00:25:42,750 Jadi biasa bagi gelung. 471 00:25:42,750 --> 00:25:45,875 Saya adalah kurang daripada atau sama dengan n, yang biasanya adalah di atas. 472 00:25:45,875 --> 00:25:47,500 >> Tetapi kali ini ia sengaja. 473 00:25:47,500 --> 00:25:51,890 I + +, dan kemudian saya hanya melakukan t kurungan i mendapat s. 474 00:25:51,890 --> 00:25:56,320 Kerana gambar saya kelihatan seperti ini di masa ini, yang disimpan di dalam t adalah 475 00:25:56,320 --> 00:25:59,530 alamat yang sebahagian rawak ingatan nilai-nilai yang tidak diketahui. 476 00:25:59,530 --> 00:26:03,030 Tetapi sebaik sahaja saya lakukan t kurungan 0 yang meletakkan saya di sini. 477 00:26:03,030 --> 00:26:07,430 >> Dan apa yang akhirnya mendapat disediakan di sana? 478 00:26:07,430 --> 00:26:08,740 Kami akhirnya meletakkan h. 479 00:26:08,740 --> 00:26:11,170 Kerana itulah apa yang di s kurungan 0. 480 00:26:11,170 --> 00:26:14,300 Dan kemudian perkara yang sama untuk e, dan saya, dan saya, dan o. 481 00:26:14,300 --> 00:26:17,930 >> n, mengapa saya pergi ke atas melalui yang bersamaan dengan n? 482 00:26:17,930 --> 00:26:19,200 Kerana watak 0. 483 00:26:19,200 --> 00:26:23,580 Jadi jelas, maka, jika saya benar-benar memadam apa-apa sampah ini 484 00:26:23,580 --> 00:26:28,870 nilai-nilai dan kemudian benar-benar menarik dalam apa yang saya harapkan, ini adalah s kurungan 1, 2, 485 00:26:28,870 --> 00:26:32,440 3, 4, ditambah itu ketinggalan watak baru. 486 00:26:32,440 --> 00:26:36,080 >> Dan sekarang jika kita terus lalu titik, dot, dot dalam versi ini betul 487 00:26:36,080 --> 00:26:41,930 dan huruf t kurungan 0 saya akan, daripada Sudah tentu, akan mengambil kesempatan hanya ini 488 00:26:41,930 --> 00:26:47,050 lelaki di sini, yang konsep, akhirnya matlamat. 489 00:26:47,050 --> 00:26:48,040 Jadi, itu semua penunjuk itu. 490 00:26:48,040 --> 00:26:51,430 >> Dan anda telah menggunakan mereka untuk minggu kini dalam konteks tali. 491 00:26:51,430 --> 00:26:53,530 Tetapi di bawah hood mereka sedikit lebih kompleks. 492 00:26:53,530 --> 00:26:57,520 Tetapi jika anda berfikir tentang mereka dalam bentuk bergambar saya mencadangkan bahawa mereka 493 00:26:57,520 --> 00:27:01,720 mungkin tidak semua yang menakutkan kerana mereka pertama mungkin kelihatan pada pandangan pertama, 494 00:27:01,720 --> 00:27:04,730 terutamanya dengan sintaks baru itu. 495 00:27:04,730 --> 00:27:07,290 Sebarang pertanyaan mengenai petunjuk, tali, atau aksara? 496 00:27:07,290 --> 00:27:07,580 Ya? 497 00:27:07,580 --> 00:27:09,252 >> PENONTON: Bolehkah anda kembali kepada [didengar] 498 00:27:09,252 --> 00:27:10,502 >> SPEAKER 1: Pasti. 499 00:27:10,502 --> 00:27:14,058 500 00:27:14,058 --> 00:27:19,525 >> PENONTON: Jadi bagaimana datang kekal anda talian, anda tidak mempunyai * t talian 501 00:27:19,525 --> 00:27:21,513 dan * s dalam baris? 502 00:27:21,513 --> 00:27:23,004 Jangan anda mempunyai rujukan kepada - 503 00:27:23,004 --> 00:27:24,640 >> SPEAKER 1: Ah, soalan yang benar-benar baik. 504 00:27:24,640 --> 00:27:26,800 Kenapa saya tidak mempunyai * t dan a * s? 505 00:27:26,800 --> 00:27:30,340 Kerana secara ringkas, minggu lalu, seperti dalam kami menukar fungsi, saya mengatakan bahawa apabila 506 00:27:30,340 --> 00:27:33,350 anda telah mendapat penunjuk cara dengan yang anda pergi ke sana seperti yang kita lakukan 507 00:27:33,350 --> 00:27:36,590 fizikal di atas pentas, adalah untuk benar-benar menggunakan operator bintang. 508 00:27:36,590 --> 00:27:40,570 >> Ia ternyata bahawa ini kurungan persegi notasi adalah apa yang kita akan memanggil sintaktik 509 00:27:40,570 --> 00:27:44,190 gula, yang hanya satu cara yang seksi berkata ia notasi singkatan untuk 510 00:27:44,190 --> 00:27:45,950 apa yang anda menggambarkan. 511 00:27:45,950 --> 00:27:49,385 Tetapi ia adalah sedikit lebih intuitif. 512 00:27:49,385 --> 00:27:53,510 Dan pada risiko membuat ini kelihatan lebih rumit daripada ia perlu, 513 00:27:53,510 --> 00:27:56,990 apa yang benar-benar berlaku di sini adalah seperti berikut - 514 00:27:56,990 --> 00:28:01,450 Jika saya katakan * t bermakna pergi ke alamat yang disimpan di dalam t. 515 00:28:01,450 --> 00:28:04,350 >> Jadi benar-benar, jika t adalah menyimpan alamat yang h 516 00:28:04,350 --> 00:28:07,300 pada mulanya, * t cara pergi sini. 517 00:28:07,300 --> 00:28:10,730 Kini, apa yang t kurungan 0 maksudkan? 518 00:28:10,730 --> 00:28:11,560 Perkara yang sama yang tepat. 519 00:28:11,560 --> 00:28:13,510 Ia hanya turun sedikit lebih mesra untuk menulis. 520 00:28:13,510 --> 00:28:14,430 >> Tetapi saya tidak dilakukan lagi. 521 00:28:14,430 --> 00:28:17,800 Saya tidak boleh hanya mengatakan * t mendapat * s. 522 00:28:17,800 --> 00:28:19,440 Kerana apa yang saya akan lakukan itu? 523 00:28:19,440 --> 00:28:22,950 Saya akan meletakkan h, h, h, h, h sepanjang segala-galanya. 524 00:28:22,950 --> 00:28:22,995 Betul? 525 00:28:22,995 --> 00:28:26,020 >> Kerana * t ialah pergi ke alamat dalam t. 526 00:28:26,020 --> 00:28:27,580 Tetapi kita di dalam gelung. 527 00:28:27,580 --> 00:28:32,150 Dan apa yang nilai saya menokok, sudah tentu, pada setiap lelaran? 528 00:28:32,150 --> 00:28:32,690 i. 529 00:28:32,690 --> 00:28:34,590 >> Tetapi ada peluang di sini, bukan? 530 00:28:34,590 --> 00:28:37,870 Walaupun ini berasa seperti ia semakin sedikit lebih canggih 531 00:28:37,870 --> 00:28:40,730 daripada notasi persegi kurungan kita telah digunakan untuk beberapa kali - 532 00:28:40,730 --> 00:28:43,840 biarlah saya membatalkan perubahan h saya di sana - 533 00:28:43,840 --> 00:28:48,870 walaupun ini kini mendapat sedikit penjaga, idea asas, jika * t 534 00:28:48,870 --> 00:28:53,630 bermakna di sini dan * t hanya pergi ke alamat dalam t. 535 00:28:53,630 --> 00:28:54,990 >> Tetapi apa yang alamat dalam t? 536 00:28:54,990 --> 00:28:56,850 Bilangan kita terus menggunakan? 537 00:28:56,850 --> 00:29:00,540 Seperti Ox456, mari kita membawa yang kembali hanya demi perbincangan. 538 00:29:00,540 --> 00:29:05,380 Nah, jika saya mahu mendapatkan di e di t tali, saya hanya mahu pergi ke, 539 00:29:05,380 --> 00:29:06,460 pada dasarnya, 456. 540 00:29:06,460 --> 00:29:09,230 >> Atau sebaliknya, 457. 541 00:29:09,230 --> 00:29:10,590 Saya hanya perlu untuk menambah satu. 542 00:29:10,590 --> 00:29:11,790 Tetapi saya boleh berbuat demikian, bukan? 543 00:29:11,790 --> 00:29:14,680 Kerana t, walaupun saya menjaga lukisan sekarang seperti anak panah, ia hanya 544 00:29:14,680 --> 00:29:16,570 nombor, Ox456. 545 00:29:16,570 --> 00:29:21,400 Dan jika saya menambah satu itu, atau lebih secara amnya, jika saya boleh menambah saya ke yang saya boleh 546 00:29:21,400 --> 00:29:24,350 benar-benar mendapatkan tepat di mana saya mahu. 547 00:29:24,350 --> 00:29:26,260 Jadi, jika saya benar-benar melakukan ini - 548 00:29:26,260 --> 00:29:28,970 dan ini adalah apa yang kini dikenali sebagai aritmetik penunjuk - 549 00:29:28,970 --> 00:29:30,375 Saya boleh mengeluarkan baris ini. 550 00:29:30,375 --> 00:29:33,550 Yang, terus-terang, saya rasa lebih jelas dan mesra pengguna lebih sedikit untuk membaca. 551 00:29:33,550 --> 00:29:35,970 Tetapi ini adalah tidak kurang betul. 552 00:29:35,970 --> 00:29:38,570 >> Ini sejajar kod kini menggunakan aritmetik penunjuk. 553 00:29:38,570 --> 00:29:40,920 Ia mengatakan pergi ke alamat berikut - 554 00:29:40,920 --> 00:29:44,670 apa permulaan t ialah, yang t plus i, yang pada mulanya 555 00:29:44,670 --> 00:29:45,730 adalah 0, yang besar. 556 00:29:45,730 --> 00:29:49,280 Kerana itu bermakna permulaan t campur 1, ditambah 2, plus 3, dan sebagainya. 557 00:29:49,280 --> 00:29:51,030 Dan perjanjian yang sama dengan s. 558 00:29:51,030 --> 00:29:52,750 >> Gula Jadi sintaksis untuk ini. 559 00:29:52,750 --> 00:29:55,900 Tetapi memahami apa yang benar-benar berlaku di bawah hood, saya akan berhujah, 560 00:29:55,900 --> 00:29:57,410 sebenarnya berguna dalam dan dengan sendirinya. 561 00:29:57,410 --> 00:30:00,620 Kerana ia bermakna kini tidak ada banyak lagi keajaiban berlaku 562 00:30:00,620 --> 00:30:01,620 di bawah hood. 563 00:30:01,620 --> 00:30:03,920 Terdapat tidak akan menjadi lebih banyak lapisan yang kita kulit boleh membuat sandaran untuk anda. 564 00:30:03,920 --> 00:30:04,810 Ini adalah c. 565 00:30:04,810 --> 00:30:06,410 Dan ini adalah pengaturcaraan. 566 00:30:06,410 --> 00:30:08,002 Really good soalan. 567 00:30:08,002 --> 00:30:11,570 >> Baiklah, jadi ini adalah kereta yang program saya telah merujuk kepada awal. 568 00:30:11,570 --> 00:30:12,650 swap adalah cacat. 569 00:30:12,650 --> 00:30:14,070 Jika tidak kelihatan untuk bekerja. 570 00:30:14,070 --> 00:30:17,390 Ingat bahawa sama seperti dengan susu dan jus oren - yang saya mula 571 00:30:17,390 --> 00:30:18,660 minum demonstrasi hari ini. 572 00:30:18,660 --> 00:30:22,220 Jadi sama seperti dengan jus dan oren susu, kita perlu menggunakan 573 00:30:22,220 --> 00:30:26,200 ubah sementara, tmp, untuk mengadakan buat sementara waktu supaya kita boleh kemudian 574 00:30:26,200 --> 00:30:28,820 menukar nilai dan kemudian mengemas kini b. 575 00:30:28,820 --> 00:30:32,870 >> Tetapi fungsi ini, kita berkata, atau ini program di mana majlis ini ialah 576 00:30:32,870 --> 00:30:35,670 bertulis itu adalah salah dan cacat, mengapa? 577 00:30:35,670 --> 00:30:38,870 578 00:30:38,870 --> 00:30:39,090 Ya? 579 00:30:39,090 --> 00:30:42,471 >> PENONTON: [didengar]. 580 00:30:42,471 --> 00:30:44,940 >> SPEAKER 1: Tepat sekali, apabila anda memanggil swap - 581 00:30:44,940 --> 00:30:47,820 atau lebih secara amnya, apabila anda panggilan yang paling apa-apa fungsi - 582 00:30:47,820 --> 00:30:51,210 jika hujah untuk fungsi yang primitif, jadi untuk bercakap, dan aksara Ints 583 00:30:51,210 --> 00:30:56,740 dan beregu dan terapung, perkara-perkara tanpa bintang, anda lulus dalam satu salinan 584 00:30:56,740 --> 00:30:57,540 hujah. 585 00:30:57,540 --> 00:31:01,580 Jadi, jika x adalah 1 dan y adalah 2, akan menjadi 1 dan b akan menjadi 2. 586 00:31:01,580 --> 00:31:05,250 Tetapi mereka akan menjadi ketulan yang berbeza bit, ketulan berbeza 587 00:31:05,250 --> 00:31:07,540 memori yang berlaku untuk menyimpan nilai-nilai yang sama. 588 00:31:07,540 --> 00:31:12,160 >> Jadi kod ini adalah super sempurna bertukar-tukar pada a dan b. 589 00:31:12,160 --> 00:31:13,850 Ia tidak baik bertukar-tukar - 590 00:31:13,850 --> 00:31:15,290 dalam contoh minggu lepas - 591 00:31:15,290 --> 00:31:16,390 x dan y. 592 00:31:16,390 --> 00:31:18,780 Kerana sekali lagi, mereka dalam skop yang salah. 593 00:31:18,780 --> 00:31:21,310 >> Sekarang, bagaimana kita pergi tentang penetapan ini? 594 00:31:21,310 --> 00:31:23,140 Kami terpaksa membuat fungsi kelihatan uglier sedikit. 595 00:31:23,140 --> 00:31:25,250 Tetapi sekali lagi, pertimbangkan apa ini hanya bermakna. 596 00:31:25,250 --> 00:31:27,840 597 00:31:27,840 --> 00:31:31,500 >> Dan sebenarnya, izinkan saya, bagi konsisten, mengubah satu perkara jadi ia sama dengan 598 00:31:31,500 --> 00:31:33,200 apa yang kita lakukan. 599 00:31:33,200 --> 00:31:35,690 Seperti yang saya sebutkan pada minggu lepas, ia tidak kira di mana ia pergi. 600 00:31:35,690 --> 00:31:38,120 Malah, biasanya anda akan meletakkan bintang di sebelah nama berubah-ubah. 601 00:31:38,120 --> 00:31:40,750 Tetapi saya fikir ia akan menjadi sedikit lebih mudah mempertimbangkan * di sebelah 602 00:31:40,750 --> 00:31:44,910 Jenis data yang bermakna ia adalah penunjuk kepada int dalam kes ini. 603 00:31:44,910 --> 00:31:46,270 >> Jadi apa yang saya lakukan di sini? 604 00:31:46,270 --> 00:31:49,590 Saya katakan tidak memberi saya int diikuti oleh int lain, 605 00:31:49,590 --> 00:31:50,810 memanggil mereka dan b. 606 00:31:50,810 --> 00:31:52,460 Berikan saya alamat int an. 607 00:31:52,460 --> 00:31:53,960 Berikan saya alamat int lain. 608 00:31:53,960 --> 00:31:56,330 Memanggil mereka menangani dan b. 609 00:31:56,330 --> 00:32:00,860 >> Dan kemudian menggunakan * notasi turun di bawah, pergi ke setiap orang alamat 610 00:32:00,860 --> 00:32:05,290 seperti yang diperlukan sama ada untuk mendapatkan atau menetapkan nilainya. 611 00:32:05,290 --> 00:32:07,400 Tetapi ada pengecualian di sini. 612 00:32:07,400 --> 00:32:11,130 Mengapa saya tidak mempunyai * di sebelah tmp? 613 00:32:11,130 --> 00:32:15,070 Kenapa saya tidak melakukan ini, misalnya? 614 00:32:15,070 --> 00:32:19,370 Rasanya seperti saya hanya perlu pergi semua keluar dan membetulkan segala-galanya. 615 00:32:19,370 --> 00:32:19,752 Ya? 616 00:32:19,752 --> 00:32:21,002 >> PENONTON: [didengar]. 617 00:32:21,002 --> 00:32:23,280 618 00:32:23,280 --> 00:32:25,480 >> SPEAKER 1: Saya telah tidak diisytiharkan tmp sebagai rentetan. 619 00:32:25,480 --> 00:32:28,830 620 00:32:28,830 --> 00:32:34,950 Jadi ini akan mengisytiharkan, dalam kes ini, tmp untuk menjadi alamat int an. 621 00:32:34,950 --> 00:32:37,380 Tetapi itu tidak cukup apa yang saya mahu, untuk beberapa sebab. 622 00:32:37,380 --> 00:32:38,616 >> PENONTON: Anda tidak mahu untuk menukar mereka. 623 00:32:38,616 --> 00:32:41,800 >> SPEAKER 1: Tepat sekali, saya tidak mahu untuk menukar apa-apa dengan tmp. tmp hanya 624 00:32:41,800 --> 00:32:42,790 minggu-satu barangan. 625 00:32:42,790 --> 00:32:45,150 Apa yang saya mahu adalah pembolehubah untuk menyimpan nombor tertentu. 626 00:32:45,150 --> 00:32:47,330 Saya tidak mengambil berat tentang alamat pada masa ini. 627 00:32:47,330 --> 00:32:50,530 >> Saya hanya perlu 32 bit atau jadi untuk menyimpan int an. 628 00:32:50,530 --> 00:32:56,690 Dan saya mahu untuk dimasukkan ke dalam orang-orang 32 bit apa yang tidak ada di dalam, jadi untuk bercakap, tetapi 629 00:32:56,690 --> 00:33:01,260 apa yang di, hanya untuk menjadi lebih tepat. 630 00:33:01,260 --> 00:33:06,420 Kerana jika adalah alamat, * bermakna pergi ke sana dan mendapat nilai 1. 631 00:33:06,420 --> 00:33:10,560 Sebagai contoh, dalam contoh minggu lepas atau dalam kes b, mendapat nilai 2. 632 00:33:10,560 --> 00:33:11,750 >> Jadi apa yang benar-benar berlaku? 633 00:33:11,750 --> 00:33:15,070 Izinkan saya menarik gambar di sini yang akan hanya mengusik selain sebahagian daripada hari ini. 634 00:33:15,070 --> 00:33:18,580 Tetapi ini akan terus muncul untuk sekian lama. 635 00:33:18,580 --> 00:33:22,430 >> Ini, saya menuntut, adalah apa yang komputer anda memori kelihatan seperti apabila anda menjalankan 636 00:33:22,430 --> 00:33:24,060 program, apa-apa program. 637 00:33:24,060 --> 00:33:28,340 Apabila anda menjalankan program di bahagian paling atas RAM komputer anda - jadi berfikir 638 00:33:28,340 --> 00:33:33,530 segi empat ini, benar-benar, seperti yang anda RAM atau memori komputer, semua 101 639 00:33:33,530 --> 00:33:36,920 bilion bait itu, semua dua bilion bait, semua dua gigabait itu, 640 00:33:36,920 --> 00:33:39,910 apa jua kuantiti yang anda perlu adalah, mari kita menarik sebagai segi empat tepat. 641 00:33:39,910 --> 00:33:43,260 Dan saya mendakwa bahawa apabila anda menjalankan program seperti Microsoft Word atau Chrome 642 00:33:43,260 --> 00:33:49,220 atau apa-apa seperti itu, bit yang Microsoft atau Google menulis - 643 00:33:49,220 --> 00:33:50,910 dalam kes-kes program-program - 644 00:33:50,910 --> 00:33:54,490 dimuatkan ke dalam memori komputer anda di mana mereka boleh dilaksanakan lebih 645 00:33:54,490 --> 00:33:57,520 cepat dan makan ke dalam CPU, yang adalah otak komputer. 646 00:33:57,520 --> 00:34:00,940 >> Dan dalam TAM ia disimpan sekurang- atas program anda, jadi untuk bercakap. 647 00:34:00,940 --> 00:34:03,300 Dalam erti kata lain, jika ini adalah sebahagian daripada ingatan, apabila anda klik dua kali pada 648 00:34:03,300 --> 00:34:05,740 Microsoft Word, bit datang luar cakera keras. 649 00:34:05,740 --> 00:34:06,680 Mereka mendapat dimuatkan ke dalam RAM. 650 00:34:06,680 --> 00:34:10,330 Dan kita akan mendorong mereka di bahagian paling atas segi empat konsep ini. 651 00:34:10,330 --> 00:34:13,010 >> Well, seluruh memori anda digunakan untuk perkara-perkara yang berbeza. 652 00:34:13,010 --> 00:34:16,460 Di bahagian paling atas yang anda lihat memulakan data dan uninitialize data. 653 00:34:16,460 --> 00:34:20,500 Ini telah lakukan, sebahagian besar, dengan pemalar atau pembolehubah global 654 00:34:20,500 --> 00:34:21,340 yang mempunyai nilai-nilai. 655 00:34:21,340 --> 00:34:22,980 Tetapi yang lebih kepada orang-orang masa yang lain. 656 00:34:22,980 --> 00:34:25,150 >> Kemudian anda mempunyai timbunan itu, yang kita akan kembali kepada. 657 00:34:25,150 --> 00:34:28,420 Tetapi di bawah adalah sebahagian itulah terutamanya yg sekarang. 658 00:34:28,420 --> 00:34:30,210 Ia adalah timbunan kononnya. 659 00:34:30,210 --> 00:34:33,850 Jadi sama seperti dalam kebanyakan mana-mana dewan D di sini kampus, anda mempunyai orang-orang yang dulang 660 00:34:33,850 --> 00:34:37,210 hanya timbunan di atas satu sama lain di mana anda boleh meletakkan makanan dan barang kecil. 661 00:34:37,210 --> 00:34:40,139 Timbunan dalam sistem komputer adalah sangat serupa. 662 00:34:40,139 --> 00:34:42,679 Kecuali manakala dulang, seperti yang kita gunakan dalam dewan makan, sudah tentu, yang dimaksudkan 663 00:34:42,679 --> 00:34:45,710 untuk menjalankan perkara-perkara dulang atau bingkai - 664 00:34:45,710 --> 00:34:49,469 seperti yang kita akan memanggil mereka - dalam komputer memori yang digunakan untuk memegang 665 00:34:49,469 --> 00:34:51,610 pembolehubah dan nilai-nilai. 666 00:34:51,610 --> 00:34:53,929 >> Jadi apa yang benar-benar berlaku di di bawah hood? 667 00:34:53,929 --> 00:34:55,820 Baiklah, biar saya terbalik ke skrin di sini. 668 00:34:55,820 --> 00:34:58,370 Dan mari memberi tumpuan hanya pada Bahagian bawah untuk seketika. 669 00:34:58,370 --> 00:35:02,770 Jika ini adalah bahagian bawah saya memori komputer ternyata apabila saya 670 00:35:02,770 --> 00:35:05,350 memanggil fungsi utama - yang berlaku, terus-terang, 671 00:35:05,350 --> 00:35:06,950 secara automatik bagi saya - 672 00:35:06,950 --> 00:35:10,510 Saya mendapat sebahagian memori pada bawah RAM saya supaya untuk bercakap. 673 00:35:10,510 --> 00:35:13,390 Dan ini adalah di mana utama adalah pembolehubah tempatan pergi. 674 00:35:13,390 --> 00:35:16,770 Ia adalah di mana argc dan argv mungkin pergi, dan apa-apa pembolehubah saya 675 00:35:16,770 --> 00:35:18,170 mengisytiharkan dalam utama. 676 00:35:18,170 --> 00:35:20,260 Mereka akhirnya di bahagian bawah RAM komputer saya. 677 00:35:20,260 --> 00:35:25,040 >> Sekarang andaikan bahawa panggilan utama fungsi seperti swap, seperti yang berlaku minggu lepas? 678 00:35:25,040 --> 00:35:30,620 Nah, kita pada dasarnya meletakkan dulang baru, bingkai baru, saya ke sebahagian memori. 679 00:35:30,620 --> 00:35:34,160 Dan saya akan menerangkan ini sebagai kepunyaan fungsi swap. 680 00:35:34,160 --> 00:35:35,770 >> Sekarang apa yang di dalam swap? 681 00:35:35,770 --> 00:35:39,240 Nah, berdasarkan program minggu lepas dan yang kita hanya melihat petikan dari, 682 00:35:39,240 --> 00:35:46,590 dalam rangka swap, atau daripada pertukaran ini dulang, adalah apa pembolehubah? 683 00:35:46,590 --> 00:35:47,970 Well, a dan b. 684 00:35:47,970 --> 00:35:51,850 Kerana mereka adalah hujah tempatan, ditambah ketiga, tmp. 685 00:35:51,850 --> 00:35:54,470 Jadi benar-benar, saya boleh menarik ini sedikit lebih bersih. 686 00:35:54,470 --> 00:35:56,680 Biar saya pergi ke hadapan dan membatalkan label. 687 00:35:56,680 --> 00:35:58,520 Dan biarlah saya mengatakan bahawa anda tahu apa? 688 00:35:58,520 --> 00:36:00,560 >> yang mungkin akan berakhir di sini. 689 00:36:00,560 --> 00:36:02,160 B akan berakhir di sini. 690 00:36:02,160 --> 00:36:03,810 Dan tmp akan berakhir di sini. 691 00:36:03,810 --> 00:36:05,160 Kini, pesanan itu mungkin menjadi sedikit berbeza. 692 00:36:05,160 --> 00:36:06,840 Tetapi konsep ini adalah idea. 693 00:36:06,840 --> 00:36:11,490 >> Dan hanya secara kolektif, ini adalah apa kami akan memanggil bingkai swap, atau 694 00:36:11,490 --> 00:36:12,136 dulang makan-dewan. 695 00:36:12,136 --> 00:36:13,150 Dan perjanjian yang sama dengan utama. 696 00:36:13,150 --> 00:36:14,040 Tetapi saya tidak akan melukis itu. 697 00:36:14,040 --> 00:36:17,810 Tetapi itu di mana argc dan argv dan mana-mana pembolehubah tempatan seperti x dan y 698 00:36:17,810 --> 00:36:18,940 mungkin juga. 699 00:36:18,940 --> 00:36:22,170 >> Jadi sekarang mengambil kira apa yang benar-benar berlaku apabila anda memanggil swap. 700 00:36:22,170 --> 00:36:26,370 Apabila anda memanggil swap, kod melaksanakan seperti ini, anda lulus dalam, dalam 701 00:36:26,370 --> 00:36:30,670 versi kereta, a dan b sebagai salinan x dan y. 702 00:36:30,670 --> 00:36:34,300 Jadi jika saya kini menarik ini pada skrin - 703 00:36:34,300 --> 00:36:36,700 mendapat untuk mendapatkan yang lebih baik pada ini - 704 00:36:36,700 --> 00:36:40,850 jadi cerita yang saya telah memberitahu kepada diri saya sendiri adalah dalam versi ini kereta, apabila kita 705 00:36:40,850 --> 00:36:46,130 memanggil menukar lulus dalam literal dan b sebagai integer, apa yang benar-benar berlaku? 706 00:36:46,130 --> 00:36:48,250 >> Nah, apa yang benar-benar berlaku adalah ini. 707 00:36:48,250 --> 00:36:52,850 Biar saya pergi ke hadapan dan batal hanya untuk mengosongkan sedikit ruang di sini. 708 00:36:52,850 --> 00:36:54,720 Jadi ini adalah memori komputer saya. 709 00:36:54,720 --> 00:36:57,510 >> Jadi jika saya mempunyai, misalnya - 710 00:36:57,510 --> 00:36:58,910 sebenarnya mari kita melakukannya dengan cara ini - 711 00:36:58,910 --> 00:37:02,690 jika saya mendakwa bahawa ini adalah x, menyimpan nilai 1 sama seperti minggu lepas. 712 00:37:02,690 --> 00:37:05,930 Dan ini adalah y, menyimpan nilai 2 sama seperti minggu lepas. 713 00:37:05,930 --> 00:37:11,370 Dan ini adalah utama, apabila saya panggil swap, sekali gus memberikan saya akses kepada dan 714 00:37:11,370 --> 00:37:15,150 b dan tmp, saya akan mendakwa bahawa ini dan ini adalah 1. 715 00:37:15,150 --> 00:37:16,080 >> Ini adalah b. 716 00:37:16,080 --> 00:37:17,010 Ini adalah 2. 717 00:37:17,010 --> 00:37:18,370 Ini dipanggil tmp. 718 00:37:18,370 --> 00:37:23,360 >> Dan pada mulanya, ia mempunyai beberapa nilai sampah sehingga saya benar-benar menyimpan di dalamnya, 719 00:37:23,360 --> 00:37:24,450 yang 1. 720 00:37:24,450 --> 00:37:28,320 Kemudian saya pergi ke hadapan dan mengubah untuk menjadi apa? 721 00:37:28,320 --> 00:37:29,720 Nilai B. 722 00:37:29,720 --> 00:37:31,980 >> Dan sehingga kini saya mempunyai dua di sini. 723 00:37:31,980 --> 00:37:34,050 Dan kemudian kita berkata b mendapat tmp. 724 00:37:34,050 --> 00:37:37,670 Sekali lagi, hanya kerana kewarasan cek, ketiga baris kod di sini adalah semata-mata ini 725 00:37:37,670 --> 00:37:39,440 satu, b mendapat tmp. 726 00:37:39,440 --> 00:37:41,730 >> Dan supaya akhirnya, apa yang saya lakukan? 727 00:37:41,730 --> 00:37:46,800 Saya pergi ke hadapan dan mengubah b untuk menjadi apa sahaja nilai tmp adalah, yang 1. 728 00:37:46,800 --> 00:37:48,390 Saya tidak menyentuh tmp lagi. 729 00:37:48,390 --> 00:37:54,100 >> Tetapi kini, masalah ini secepat swap pulangan, kerana ia tidak menyerahkan 730 00:37:54,100 --> 00:37:57,540 kembali beberapa nilai, tidak ada pulangan pernyataan jelas di dalamnya. 731 00:37:57,540 --> 00:37:59,080 Apa yang sebenarnya berlaku? 732 00:37:59,080 --> 00:38:03,480 Nah, pada dasarnya semua memori ini - 733 00:38:03,480 --> 00:38:07,410 OK, nampaknya pemadam suka hanya satu jari pada satu masa - 734 00:38:07,410 --> 00:38:08,180 hanya hilang. 735 00:38:08,180 --> 00:38:10,070 >> Sekarang dalam realiti, ia tidak ke mana-mana. 736 00:38:10,070 --> 00:38:11,810 Tetapi, anda boleh memikirkan ia kini sebagai tanda tanya. 737 00:38:11,810 --> 00:38:14,040 Kerana ia tidak lagi sebenarnya digunakan. 738 00:38:14,040 --> 00:38:17,470 Dan tiada apa yang dilakukan dengan nilai-nilai. 739 00:38:17,470 --> 00:38:21,920 >> Jadi dalam kes versi hijau kod ini, dan bukannya apa yang sedang 740 00:38:21,920 --> 00:38:24,640 berlalu ke swap? 741 00:38:24,640 --> 00:38:25,770 Jadi menangani. 742 00:38:25,770 --> 00:38:28,520 Jadi, alamat x dan alamat y. 743 00:38:28,520 --> 00:38:35,790 Jadi, jika kita semula memberitahu cerita ini yang terakhir masa, dan saya benar-benar menarik swap lagi, 744 00:38:35,790 --> 00:38:44,620 tetapi dengan petunjuk, ini menjadi, ini menjadi b, dan ini tmp menjadi, apakah 745 00:38:44,620 --> 00:38:49,080 sebenarnya disimpan di dalam hijau versi kod saya di mana saya lulus 746 00:38:49,080 --> 00:38:52,110 di alamat? 747 00:38:52,110 --> 00:38:53,780 >> Ia akan menjadi penunjuk kepada x. 748 00:38:53,780 --> 00:38:54,890 Jadi saya boleh menarik anak panah. 749 00:38:54,890 --> 00:38:57,310 Tetapi mari kita menggunakan sewenang-wenangnya sama contoh seperti sebelum ini. 750 00:38:57,310 --> 00:39:01,220 Mari kita mengatakan bahawa ini adalah sesuatu seperti Ox123. 751 00:39:01,220 --> 00:39:04,970 Dan ini akan menjadi Ox127 kerana ia adalah empat bait jauh kerana ia merupakan 752 00:39:04,970 --> 00:39:07,370 int, jadi Ox127. 753 00:39:07,370 --> 00:39:09,080 >> Dan sekali lagi, saya mengambil beberapa kebebasan dengan nombor. 754 00:39:09,080 --> 00:39:11,430 Mereka lebih kecil daripada mereka akan sebenarnya dan dalam susunan yang berbeza. 755 00:39:11,430 --> 00:39:14,350 Tetapi itulah bagaimana gambar kini berbeza. 756 00:39:14,350 --> 00:39:19,060 >> Tetapi apabila saya menggunakan kod hijau dan saya int tmp mendapatkan * a. 757 00:39:19,060 --> 00:39:25,010 * Satu cara untuk melakukan yang berikut, mengambil menangani yang dalam dan pergi untuk itu, 758 00:39:25,010 --> 00:39:26,190 yang 1. 759 00:39:26,190 --> 00:39:28,480 Dan itulah yang kemudian saya meletakkan di tmp. 760 00:39:28,480 --> 00:39:32,480 Sementara itu, di baris berikutnya kod di sini, * mendapat b, apa maksudnya? 761 00:39:32,480 --> 00:39:36,910 >> Nah, *, jadi pergi di sini mendapat * b, yang bermaksud pergi ke sana. 762 00:39:36,910 --> 00:39:39,310 Dan itu bererti meletakkan nilai ke sana. 763 00:39:39,310 --> 00:39:43,670 Akhirnya, barisan terakhir kod hanya berkata * b mendapat tmp. 764 00:39:43,670 --> 00:39:48,900 >> Jadi b berkata pergi ke sana dan menulis dengan tmp yang, dalam kes ini, akan 765 00:39:48,900 --> 00:39:51,520 menjadi, sekali lagi, 1. 766 00:39:51,520 --> 00:39:54,920 Dan ini adalah mengapa versi hijau kerja-kerja kod kita, manakala merah 767 00:39:54,920 --> 00:39:56,010 versi tidak pernah. 768 00:39:56,010 --> 00:39:59,020 Ia semua hanya bisul ke bagaimana memori diuruskan dan di mana ia 769 00:39:59,020 --> 00:40:02,580 sebenarnya diletakkan di dalam anda RAM komputer. 770 00:40:02,580 --> 00:40:07,270 Dan buat masa ini, adalah salah satu daripada perkara-perkara yang timbunan itu sedang digunakan untuk. 771 00:40:07,270 --> 00:40:09,225 >> Soalan pada susun atur? 772 00:40:09,225 --> 00:40:10,380 Pada petunjuk? 773 00:40:10,380 --> 00:40:11,630 Atau swap? 774 00:40:11,630 --> 00:40:13,740 775 00:40:13,740 --> 00:40:17,043 >> Baiklah, jadi malloc, ingat, melakukan sesuatu seperti ini. 776 00:40:17,043 --> 00:40:18,260 Ini adalah satu contoh yang sangat mudah. 777 00:40:18,260 --> 00:40:20,550 Dan ini adalah salah satu yang Binky memperkenalkan kami kepada, walaupun agak 778 00:40:20,550 --> 00:40:21,870 dengan cepat, pada akhir kelas. 779 00:40:21,870 --> 00:40:24,480 Keparat, di sana kami pergi lagi. 780 00:40:24,480 --> 00:40:28,780 >> Jadi ingat bahawa ini adalah contoh yang Binky memperkenalkan kami kepada, walaupun 781 00:40:28,780 --> 00:40:30,360 agak cepat pada akhir kelas. 782 00:40:30,360 --> 00:40:33,640 Dan di sini kita benar-benar digunakan malloc untuk kali kedua. 783 00:40:33,640 --> 00:40:37,330 Kerana kali pertama kita menggunakannya untuk mewujudkan RAM cukup, memperuntukkan RAM cukup 784 00:40:37,330 --> 00:40:38,340 untuk menyimpan rentetan. 785 00:40:38,340 --> 00:40:40,250 >> Kali ini Binky disimpan ia mudah. 786 00:40:40,250 --> 00:40:42,465 Jadi ia hanya untuk menyimpan int an, nampaknya. 787 00:40:42,465 --> 00:40:43,510 Dan yang benar-benar baik. 788 00:40:43,510 --> 00:40:46,560 Ia adalah sedikit pelik, terus-terang, untuk menggunakan malloc untuk memperuntukkan satu int. 789 00:40:46,560 --> 00:40:50,650 Tetapi titik claymation Nick adalah benar-benar hanya menceritakan kisah apa 790 00:40:50,650 --> 00:40:53,830 berlaku atau tidak berlaku apabila anda menganiaya ingatan. 791 00:40:53,830 --> 00:40:56,520 >> Jadi dalam kes ini, program ini melakukan beberapa perkara. 792 00:40:56,520 --> 00:41:01,580 Dalam kes pertama di sini, ia mengisytiharkan penunjuk yang dipanggil x untuk int an. 793 00:41:01,580 --> 00:41:04,480 Ia kemudian mengisytiharkan penunjuk y dipanggil untuk int an. 794 00:41:04,480 --> 00:41:06,150 Ia kemudiannya menyimpan dalam x, apa? 795 00:41:06,150 --> 00:41:07,110 Orang lain sekarang. 796 00:41:07,110 --> 00:41:09,685 Apa yang akan disimpan di dalam x mengikut barisan ketiga program ini? 797 00:41:09,685 --> 00:41:12,380 >> PENONTON: [didengar]. 798 00:41:12,380 --> 00:41:14,130 >> SPEAKER 1: Nah, tidak cukup bait, setiap katakan. 799 00:41:14,130 --> 00:41:16,760 Lebih tepat sekarang. 800 00:41:16,760 --> 00:41:18,325 Apa yang akan disimpan di dalam x? 801 00:41:18,325 --> 00:41:21,000 802 00:41:21,000 --> 00:41:22,060 Alamat, saya fikir saya mendengar ia. 803 00:41:22,060 --> 00:41:23,570 >> Jadi apakah malloc kembali? 804 00:41:23,570 --> 00:41:26,030 malloc behaviorally memperuntukkan sebahagian memori. 805 00:41:26,030 --> 00:41:27,850 Tetapi bagaimana ia memberi anda akses kepada ia? 806 00:41:27,850 --> 00:41:29,460 Ia akan kembali apa? 807 00:41:29,460 --> 00:41:32,000 Alamat bait yang pertama dalam sebahagian memori. 808 00:41:32,000 --> 00:41:33,020 >> Sekarang, ini adalah mudah super. 809 00:41:33,020 --> 00:41:35,380 Ia hanya satu bait, yang bermaksud menangani kita saling adalah 810 00:41:35,380 --> 00:41:37,300 alamat segala-galanya. 811 00:41:37,300 --> 00:41:42,070 Jadi yang disimpan di dalam x kemudian, adalah alamat itu sebahagian memori. 812 00:41:42,070 --> 00:41:43,400 Sementara itu, apa yang berlaku seterusnya? 813 00:41:43,400 --> 00:41:45,890 Jadi sebenarnya, mari kita pergi ke hadapan dan cepat menarik keluar sebenar ini. 814 00:41:45,890 --> 00:41:52,490 >> Jadi, jika kita pergi ke skrin di sini dan kita bermain keluar ini int * x dan int * y 815 00:41:52,490 --> 00:41:53,740 akan melakukan apa untuk saya? 816 00:41:53,740 --> 00:41:58,280 Saya mendakwa bahawa ia hanya akan melakukan sesuatu seperti ini dan memanggilnya x, dan 817 00:41:58,280 --> 00:42:00,010 ini dan memanggilnya y. 818 00:42:00,010 --> 00:42:03,110 Sementara itu, barisan ketiga kod adalah akan memperuntukkan saiz int an, 819 00:42:03,110 --> 00:42:06,160 yang berlaku kepada - maaf jika saya katakan satu sebelum saya maksudkan satu int - 820 00:42:06,160 --> 00:42:08,280 empat bait pada komputer biasa. 821 00:42:08,280 --> 00:42:09,720 Sekurang-kurangnya dengan perkakas CS50. 822 00:42:09,720 --> 00:42:11,490 >> Jadi ini akan memperuntukkan ia, siapa tahu? 823 00:42:11,490 --> 00:42:12,800 Suatu tempat di sini. 824 00:42:12,800 --> 00:42:15,780 Dan ini disimpan di beberapa alamat Ox, siapa tahu? 825 00:42:15,780 --> 00:42:18,330 Tetapi apa yang berlaku untuk mendapatkan kembali adalah alamat itu. 826 00:42:18,330 --> 00:42:22,270 Tetapi kita akan menarik ini bergambar sebagai hanya anak panah seperti itu. 827 00:42:22,270 --> 00:42:25,430 >> Sekarang di baris berikutnya * x mendapat 42. 828 00:42:25,430 --> 00:42:29,400 Apakah * x bermakna dari segi orang biasa itu? 829 00:42:29,400 --> 00:42:30,040 Hanya pergi ke sana. 830 00:42:30,040 --> 00:42:30,960 Pergi ke alamat itu. 831 00:42:30,960 --> 00:42:35,900 Atau dalam erti kata lain, ikut arrow dan meletakkan 42 di sana. 832 00:42:35,900 --> 00:42:38,140 Tetapi sesuatu yang buruk berlaku untuk Binky, bukan? 833 00:42:38,140 --> 00:42:43,950 >> Ingat garis yang lima di sini, * y mendapat 13, memang nombor malang, 834 00:42:43,950 --> 00:42:44,760 melakukan apa untuk kita? 835 00:42:44,760 --> 00:42:47,320 Nah, * y cara pergi ke sana. 836 00:42:47,320 --> 00:42:50,460 Nah, ini tidak diberi nilai lagi, betul? 837 00:42:50,460 --> 00:42:54,090 Kod ini tidak mempunyai y menjadi dimulakan apa-apa. 838 00:42:54,090 --> 00:42:56,120 Kami x yang dimulakan untuk alamat. 839 00:42:56,120 --> 00:42:57,640 Tetapi y telah diisytiharkan top up. 840 00:42:57,640 --> 00:43:00,250 Tetapi koma bertitik, tiada nilai sebenarnya meletakkan di dalamnya. 841 00:43:00,250 --> 00:43:02,330 Jadi ia adil untuk memanggil ini nilai sampah. 842 00:43:02,330 --> 00:43:03,430 Siapa tahu apa yang ada? 843 00:43:03,430 --> 00:43:07,160 Ia adalah sisa-sisa bit yang digunakan oleh beberapa baris sebelumnya kod dalam 844 00:43:07,160 --> 00:43:08,300 program saya. 845 00:43:08,300 --> 00:43:13,250 >> Jadi, jika saya katakan pergi ke sana, ini adalah seperti, Saya tidak tahu di mana anak panah ini adalah 846 00:43:13,250 --> 00:43:14,490 akan berakhir. 847 00:43:14,490 --> 00:43:17,720 Dan itulah apabila anda biasanya mendapatkan kesalahan segmentasi. 848 00:43:17,720 --> 00:43:22,430 Jika anda secara tidak sengaja dereference, jadi untuk bercakap, atau pergi ke alamat yang tidak 849 00:43:22,430 --> 00:43:25,400 sebenarnya adalah alamat yang sah, perkara-perkara buruk berlaku. 850 00:43:25,400 --> 00:43:27,550 >> Dan itulah apa yang berlaku untuk berfikir Binky. 851 00:43:27,550 --> 00:43:31,060 Jadi ingat bahawa cerita yang Nick adalah memberitahu di sini adalah idea yang sama seperti apa yang 852 00:43:31,060 --> 00:43:34,050 Saya tertarik dengan ilusi kapur di atas kapal di sana. 853 00:43:34,050 --> 00:43:35,960 X dan y diisytiharkan. 854 00:43:35,960 --> 00:43:39,690 >> Kemudian kami diperuntukkan saiz an int dan disimpan dalam x. 855 00:43:39,690 --> 00:43:42,130 Kemudian baris seterusnya yang kita lakukan * x. 856 00:43:42,130 --> 00:43:46,070 Ini adalah tongkat sakti Nick daripada penyahrujukan. 857 00:43:46,070 --> 00:43:49,780 Yang meletakkan 42 dalam memori dinyatakan oleh x. 858 00:43:49,780 --> 00:43:51,600 >> Tetapi ini adalah di mana perkara-perkara pergi teruk salah. 859 00:43:51,600 --> 00:43:51,820 Betul? 860 00:43:51,820 --> 00:43:53,550 Kami cuba untuk y dereference. 861 00:43:53,550 --> 00:43:55,620 Tetapi y mempunyai beberapa nilai palsu, betul? 862 00:43:55,620 --> 00:43:57,720 >> Arrow yang di bahagian bawah sebelah kiri sudut, tidak 863 00:43:57,720 --> 00:43:58,950 sebenarnya menunjuk kepada apa-apa. 864 00:43:58,950 --> 00:44:01,520 Ia adalah jenis melakukan apa yang saya lakukan di sini di atas kapal. 865 00:44:01,520 --> 00:44:05,900 Jadi perkara-perkara buruk berlaku, segmentasi bersalah atau Binky bersalah, dalam kes ini. 866 00:44:05,900 --> 00:44:10,800 >> Tetapi jika kita kemudian menetapkan bahawa dengan melakukan x mendapat y bagaimana perubahan cerita? 867 00:44:10,800 --> 00:44:15,760 Nah, jika saya x mendapat y, itu berkesan yang sama sebagai berkata 868 00:44:15,760 --> 00:44:19,235 apa ini, Ox-sesuatu akan menjadi yang sama di sini, 869 00:44:19,235 --> 00:44:20,080 Ox-sesuatu. 870 00:44:20,080 --> 00:44:22,970 Atau bergambar kami akan menarik anak panah. 871 00:44:22,970 --> 00:44:25,530 >> Jadi di sini pada papan permainan dengan Binky, dengan baris seterusnya 872 00:44:25,530 --> 00:44:28,350 kod, * y bermakna pergi ke sana. 873 00:44:28,350 --> 00:44:29,400 Di mana ada? 874 00:44:29,400 --> 00:44:30,820 Ini bermakna di sini. 875 00:44:30,820 --> 00:44:36,050 >> Dan apabila kita kini bahawa untuk menjadi 13 ia hanya melibatkan berterusan dan 876 00:44:36,050 --> 00:44:39,470 menulis 13 di sini sekarang. 877 00:44:39,470 --> 00:44:44,130 Jadi mungkin tidak sepenuhnya mudah pada pandangan pertama. 878 00:44:44,130 --> 00:44:47,740 Tetapi untuk menggulung dan menggunakan istilah yang sama Binky yang telah menggunakan di sini, jadi 879 00:44:47,740 --> 00:44:50,485 dua pertama memperuntukkan petunjuk, x dan y, tetapi tidak pointees. 880 00:44:50,485 --> 00:44:54,750 Dan pointees bukan umumnya digunakan panjang. 881 00:44:54,750 --> 00:44:56,120 Tetapi penunjuk benar-benar adalah. 882 00:44:56,120 --> 00:44:59,200 Tetapi ia adalah apa yang sedang berkata di dalam tatanama Binky ini. 883 00:44:59,200 --> 00:45:01,660 >> Ini sejajar akan datang, sudah tentu, memperuntukkan pointee int. 884 00:45:01,660 --> 00:45:04,840 Jadi sebahagian memori - seperti yang saya menarik lebih pada sebelah kanan ada - dan set 885 00:45:04,840 --> 00:45:06,470 x sama dengan menunjukkan kepadanya. 886 00:45:06,470 --> 00:45:11,350 Ini dereferences x untuk menyimpan 42 memori yang ia menghala ke arah. 887 00:45:11,350 --> 00:45:13,380 Dan kemudian ini, sudah tentu, adalah satu perkara yang buruk. 888 00:45:13,380 --> 00:45:15,600 Kerana y tidak menunjuk pada apa-apa lagi. 889 00:45:15,600 --> 00:45:16,530 Ini membetulkan ia. 890 00:45:16,530 --> 00:45:18,240 Jadi ini adalah masih program kereta. 891 00:45:18,240 --> 00:45:21,580 Hanya kerana kita sedang bertiup melalui baris demi baris kod dan berkata, oh baik, 892 00:45:21,580 --> 00:45:22,690 biarkan ia kemalangan di sana. 893 00:45:22,690 --> 00:45:23,420 Itu satu perkara yang buruk. 894 00:45:23,420 --> 00:45:26,790 Kemungkinan adalah program yang hanya akan membatalkan sama sekali di garisan itu. 895 00:45:26,790 --> 00:45:30,550 Tetapi jika anda adalah untuk menghapuskan terhempas beratur dan menggantikannya dengan dua lepas 896 00:45:30,550 --> 00:45:32,470 garis-garis di sana anda menetapkan - 897 00:45:32,470 --> 00:45:35,310 menggunakan tugasan penunjuk - y untuk menunjukkan x sebagai titik t. 898 00:45:35,310 --> 00:45:39,280 Dan kemudian anda dereference y dengan cara yang sangat selamat. 899 00:45:39,280 --> 00:45:41,520 >> Oleh itu, bagaimana ini meninggalkan kami? 900 00:45:41,520 --> 00:45:45,350 Nah, ternyata bahawa di bawah hud di perpustakaan CS50, petunjuk adalah 901 00:45:45,350 --> 00:45:46,320 digunakan di seluruh. 902 00:45:46,320 --> 00:45:48,910 Dan kita sebenarnya akan mula mengupas kembali lapisan yang tidak lama lagi. 903 00:45:48,910 --> 00:45:51,740 Tetapi ternyata juga, suatu ungkapan yang sebahagian daripada anda mungkin biasa dengan, 904 00:45:51,740 --> 00:45:54,580 terutamanya mereka yang lebih selesa, sebenarnya adalah bahawa sangat popular 905 00:45:54,580 --> 00:45:56,390 laman web, atau limpahan timbunan, hari ini. 906 00:45:56,390 --> 00:45:58,720 >> Tetapi ini sebenarnya mempunyai sangat makna teknikal. 907 00:45:58,720 --> 00:46:00,160 Sekarang kita tahu apa timbunan adalah. 908 00:46:00,160 --> 00:46:02,550 Ia seperti timbunan dulang di dalam dewan makan. 909 00:46:02,550 --> 00:46:05,140 >> Atau di dalam komputer anda ingatan orang-orang bingkai 910 00:46:05,140 --> 00:46:06,900 yang digunakan oleh fungsi. 911 00:46:06,900 --> 00:46:10,760 Nah, ternyata bahawa kerana itu pelaksanaan yang sangat mudah 912 00:46:10,760 --> 00:46:14,970 memori dan bingkai pada apa yang dipanggil timbunan, anda sebenarnya boleh mengawal 913 00:46:14,970 --> 00:46:17,050 sistem komputer agak mudah. 914 00:46:17,050 --> 00:46:22,180 Anda boleh hack ke dalam sistem jika orang seperti kita telah tidak ditulis kod kami 915 00:46:22,180 --> 00:46:23,300 terutamanya dengan baik. 916 00:46:23,300 --> 00:46:26,670 >> Jika orang-orang seperti kita menggunakan ketulan memori atau penggunaan array - 917 00:46:26,670 --> 00:46:27,810 lebih biasa - 918 00:46:27,810 --> 00:46:31,800 tetapi kadang-kadang lupa untuk memeriksa sempadan pelbagai kami kerana anda mungkin 919 00:46:31,800 --> 00:46:38,470 mempunyai diri anda kadang-kadang, dan terlelar terlalu jauh lepas akhir array. 920 00:46:38,470 --> 00:46:40,520 Dalam kes ini, program anda hanya mungkin kemalangan. 921 00:46:40,520 --> 00:46:42,280 Segmentasi kesalahan, jenis memalukan. 922 00:46:42,280 --> 00:46:45,480 Tidak besar, tetapi ia tidak semestinya satu perkara yang sangat buruk. 923 00:46:45,480 --> 00:46:49,480 >> Tetapi jika program anda sebenarnya pada sebenar komputer pengguna ', jika ia berjalan 924 00:46:49,480 --> 00:46:53,070 di laman web bahawa orang-orang rawak sebenar di internet yang memukul, membiarkan 925 00:46:53,070 --> 00:46:56,690 orang mendorong perkara-perkara buruk pada kod anda adalah amnya tidak satu perkara yang baik kerana 926 00:46:56,690 --> 00:46:59,930 ia bermakna peluang untuk mengambil kawalan komputer. 927 00:46:59,930 --> 00:47:01,350 Dan ini akan kelihatan sedikit samar. 928 00:47:01,350 --> 00:47:04,570 Tetapi saya fikir saya akan menakutkan anda dengan contoh terakhir ini di sini. 929 00:47:04,570 --> 00:47:05,650 >> Ini adalah contoh kod. 930 00:47:05,650 --> 00:47:07,370 Dan ada Wikipedia baik artikel yang berjalan melalui 931 00:47:07,370 --> 00:47:08,530 ini dengan lebih terperinci. 932 00:47:08,530 --> 00:47:13,890 Saya mempunyai utama di bawah panggilan foo, lulus dalam argv daripada 1. 933 00:47:13,890 --> 00:47:15,750 Dan itu hanya supaya anda boleh menjalankan program dan lulus 934 00:47:15,750 --> 00:47:17,080 input sewenang-wenangnya. 935 00:47:17,080 --> 00:47:20,180 >> Dan kemudian foo diisytiharkan top up seperti menerima tali, atau lebih 936 00:47:20,180 --> 00:47:21,700 tepat, a * char. 937 00:47:21,700 --> 00:47:23,860 Ia kemudian mengisytiharkan pelbagai aksara. 938 00:47:23,860 --> 00:47:27,130 Memanggilnya penampan lebih amnya, saiz 12. 939 00:47:27,130 --> 00:47:30,900 Jadi 12 aksara boleh dimuatkan di dalam array yang dipanggil c. 940 00:47:30,900 --> 00:47:33,510 >> Dan kemudian ia menggunakan fungsi baru ini, yang baru tetapi tidak sukar untuk 941 00:47:33,510 --> 00:47:34,930 memahami, salinan ingatan. 942 00:47:34,930 --> 00:47:39,290 Ia salinan ingatan dari bar, yang merupakan n lalu berubah-ubah, apa jua 943 00:47:39,290 --> 00:47:42,080 pengguna ditaip ke argv 1 ke dalam c. 944 00:47:42,080 --> 00:47:43,090 Berapa banyak bait? 945 00:47:43,090 --> 00:47:44,260 Panjang rentetan bar. 946 00:47:44,260 --> 00:47:48,380 >> Jadi, dalam erti kata lain, jika jenis pengguna dalam h-e-l-l-o masuk, panjang rentetan 947 00:47:48,380 --> 00:47:49,260 daripada hello ialah lima. 948 00:47:49,260 --> 00:47:52,790 Jadi lima daripada bait akan mendapat disalin ke dalam pelbagai yang dipanggil c, yang 949 00:47:52,790 --> 00:47:54,110 adalah saiz 12. 950 00:47:54,110 --> 00:47:58,710 Tetapi apa jenis pengguna dalam yang lebih lama perkataan itu adalah 13 huruf atau 14 951 00:47:58,710 --> 00:48:01,250 watak atau 100 aksara atau lebih? 952 00:48:01,250 --> 00:48:02,660 >> Di mana mereka akan pergi? 953 00:48:02,660 --> 00:48:06,090 Nah, rangka itu, bahawa dulang dalam timbunan makan-dewan, 954 00:48:06,090 --> 00:48:06,930 mereka akan pergi ke sana. 955 00:48:06,930 --> 00:48:10,080 Dan ia hanya akan mula penggantian barangan lain yang sudah 956 00:48:10,080 --> 00:48:12,880 pada timbunan itu, melimpah timbunan, jadi untuk bercakap. 957 00:48:12,880 --> 00:48:14,780 >> Jadi bergambar, berfikir dengan cara ini. 958 00:48:14,780 --> 00:48:17,970 Ini adalah versi yang berwarna-warni gambar kita telah melukis. 959 00:48:17,970 --> 00:48:20,060 Di bahagian bawah, katakan, adalah utama. 960 00:48:20,060 --> 00:48:24,690 Dan di atas, apa yang anda lihat sekarang adalah bingkai, kod warna sekarang, untuk 961 00:48:24,690 --> 00:48:26,090 fungsi dipanggil foo. 962 00:48:26,090 --> 00:48:30,170 Tetapi apa yang menarik di sini kira-kira foo adalah bahawa di sini adalah bingkai. 963 00:48:30,170 --> 00:48:32,860 Jadi ia disediakan seperti saya lakukan tetapi dalam berwarna biru muda. 964 00:48:32,860 --> 00:48:35,220 Dan sekarang ini adalah di mana c kurungan 0 pergi. 965 00:48:35,220 --> 00:48:37,410 Dan ini adalah di mana c kurungan 11 akan berakhir. 966 00:48:37,410 --> 00:48:39,670 >> Dalam erti kata lain, ia berlaku digambarkan sebagai segiempat. 967 00:48:39,670 --> 00:48:42,320 Tetapi jika anda hanya menyimpan plopping bytes bawah - atau aksara - mereka akan berakhir 968 00:48:42,320 --> 00:48:46,070 up di lokasi 0 sepanjang jalan sehingga 11 kerana ia 0 diindeks. 969 00:48:46,070 --> 00:48:49,170 >> Tetapi di mana adalah watak-13 akan berakhir? 970 00:48:49,170 --> 00:48:50,310 Di mana ke-14? 971 00:48:50,310 --> 00:48:52,430 Di mana watak-50 akan berakhir? 972 00:48:52,430 --> 00:48:54,070 >> Ia akan terus pergi ke bawah. 973 00:48:54,070 --> 00:48:57,350 Kerana walaupun kita telah dilukis gambar dengan timbunan yang semakin meningkat naik, 974 00:48:57,350 --> 00:48:59,920 alamat, ternyata, pergi dari alamat kecil, kecil 975 00:48:59,920 --> 00:49:01,830 petunjuk, ke alamat yang besar. 976 00:49:01,830 --> 00:49:03,540 Jadi ia hanya menyimpan naik dan ke atas. 977 00:49:03,540 --> 00:49:05,660 >> Jadi, jika jenis pengguna dalam hello, yang hebat. 978 00:49:05,660 --> 00:49:08,650 Tiada bug, tidak ada masalah, selamat semua orang. 979 00:49:08,650 --> 00:49:11,940 Tetapi jika jenis pengguna dalam apa yang kita akan panggil kod pertentangan, yang diwakili 980 00:49:11,940 --> 00:49:16,040 umum sebagai, serangan, serangan, serangan, serangan, apa yang boleh berlaku? 981 00:49:16,040 --> 00:49:19,760 >> Nah, jika semua input pengguna yang ditaip tidak hanya beberapa mesra 982 00:49:19,760 --> 00:49:21,540 atau tali serangan watak. 983 00:49:21,540 --> 00:49:24,050 Ia sebenarnya satu jujukan aksara bahawa jika anda disusun itu, 984 00:49:24,050 --> 00:49:26,050 ia sebenarnya adalah kod. 985 00:49:26,050 --> 00:49:29,570 Mungkin ia adalah kod yang memadam semua fail pada cakera keras anda atau menghantar spam 986 00:49:29,570 --> 00:49:30,810 atau sesuatu seperti itu. 987 00:49:30,810 --> 00:49:35,110 Perhatikan bahawa apa yang penting di sini ialah bahawa jika seorang lelaki yang buruk mendapat cukup bertuah kerana 988 00:49:35,110 --> 00:49:37,830 menulis semula sebahagian merah memori - 989 00:49:37,830 --> 00:49:41,080 yang saya tidak menarik pada gambar saya tetapi gambar Wikipedia ini di sini telah - 990 00:49:41,080 --> 00:49:42,890 alamat kembali dipanggil itu. 991 00:49:42,890 --> 00:49:47,470 >> Apabila pulangan makanan, apabila swap penyata, bagaimana komputer tahu untuk pergi dari 992 00:49:47,470 --> 00:49:49,790 di sini untuk turun di sini? 993 00:49:49,790 --> 00:49:52,920 Atau dalam segmen teknologi sehingga di atas, bagaimana ia tahu untuk pergi dari swap 994 00:49:52,920 --> 00:49:54,870 kod - 0 yang dan 1 yang mengarang swap - 995 00:49:54,870 --> 00:49:56,020 kembali ke utama? 996 00:49:56,020 --> 00:50:00,450 Ada satu alamat kembali yang dipanggil disimpan dalam bingkai tindanan yang sama, pada 997 00:50:00,450 --> 00:50:02,140 dulang kafeteria sama. 998 00:50:02,140 --> 00:50:06,080 >> Jadi, jika seorang lelaki yang buruk adalah cukup bijak untuk meletakkan kod serangan, kod serangan, serangan 999 00:50:06,080 --> 00:50:07,960 kod, dan mendapatkan cukup bertuah - 1000 00:50:07,960 --> 00:50:11,630 sering melalui percubaan dan kesilapan - untuk menulis bahawa alamat kembali merah, 1001 00:50:11,630 --> 00:50:14,360 dengan alamat dan notis bahagian paling atas. 1002 00:50:14,360 --> 00:50:16,830 Notis 0835C080. 1003 00:50:16,830 --> 00:50:20,650 Ia ditulis belakang top up untuk sebab kita mungkin akan mengkaji semula. 1004 00:50:20,650 --> 00:50:22,050 Ini adalah nombor itu. 1005 00:50:22,050 --> 00:50:25,790 >> Jadi, jika lelaki yang buruk mendapat cukup bertuah atau cukup bijak untuk menulis ganti merah 1006 00:50:25,790 --> 00:50:29,480 jalur memori dengan alamat kod yang dia mempunyai entah bagaimana 1007 00:50:29,480 --> 00:50:34,980 disuntik ke dalam komputer anda, rasa yang kod akan dikembalikan kepada 1008 00:50:34,980 --> 00:50:38,260 secepat foo dilakukan melaksanakan? 1009 00:50:38,260 --> 00:50:39,440 >> Kod lelaki yang tidak baik itu. 1010 00:50:39,440 --> 00:50:43,610 Jadi kod serangan ini, AAA, sekali lagi, mungkin menghantar spam, mungkin memadam semua fail 1011 00:50:43,610 --> 00:50:44,500 pada pemacu keras anda. 1012 00:50:44,500 --> 00:50:48,740 Tetapi itu adalah apa yang benar-benar limpahan timbunan adalah, atau ditakluki penimbal, atau 1013 00:50:48,740 --> 00:50:51,060 penampan serangan melimpah. 1014 00:50:51,060 --> 00:50:54,400 >> Dan ia adalah sangat, sangat biasa hingga ke hari ini dengan program-program yang ditulis dalam 1015 00:50:54,400 --> 00:50:58,220 C, C + +, dan juga beberapa bahasa lain. 1016 00:50:58,220 --> 00:51:02,275 Pada nota yang menakutkan, kami akan berakhir dengan jenaka. 1017 00:51:02,275 --> 00:51:03,230 >> [Ketawa] 1018 00:51:03,230 --> 00:51:04,550 >> Jumpa anda pada hari Rabu. 1019 00:51:04,550 --> 00:51:07,920 1020 00:51:07,920 --> 00:51:10,310 Pada CS50 seterusnya - 1021 00:51:10,310 --> 00:51:15,920 Jadi saya semua keluar lampu cakera hari ini tetapi tunggu, lemak susu, separuh telefon 1022 00:51:15,920 --> 00:51:17,850 buku, jus oren yang saya minum hari ini. 1023 00:51:17,850 --> 00:51:20,370 1024 00:51:20,370 --> 00:51:22,780 Kabel USB, kunci a. 1025 00:51:22,780 --> 00:51:24,800 >> [Bermain muzik]