[Bermain muzik] DAVID J. MALAN: Baiklah ini adalah CS50 dan ini adalah permulaan lima minggu. Jadi hari ini, di bawah kusyen tempat duduk anda, anda tidak akan menemui apa-apa. Tetapi di atas, anda perlu mencari ini, satu tanda kecil penghargaan terhadap semua kerja-kerja yang anda meletakkan ke dalam Permainan Lima belas. Hanya membuang bulatan kecil pada bawah untuk mula bermain untuk baki kelas. Jadi ingat bahawa, atau tahu bahawa masalah yang ditetapkan empat, yang keluar hujung minggu ini, melibatkan bertulis permainan lain. Tetapi kali ini ia melibatkan menggunakan antara muka pengguna grafik yang sebenar, bukan muka teks seperti Permainan Lima belas itu. Dan permainan yang terletak di hadapan anda, jika anda belum lagi melihat ini datang, kelihatan sesuatu yang kecil seperti ini. Saya akan pergi ke terminal saya tingkap di sini di GDB. Dan saya akan pergi ke hadapan dan menjalankan penyelesaian kakitangan, yang anda boleh mengakses selepas menjalankan update 50 seperti biasa. Tetapi saya akan meletakkan ia ke dalam sedikit mod rahsia, Paskah sedikit telur, dipanggil mod Allah, dengan meletakkan Allah dalam argv1. Dan saya perlu ikut arahan saya sendiri, berjalan dalam saya sendiri masalah menetapkan direktori. Jadi sekarang anda melihat versi lengkap daripada permainan Breakout. Malah, ini adalah cara tidak tangan. Jadi ia sebenarnya - wowed walaupun anda mungkin - agak remeh untuk melaksanakan mod Tuhan dalam Breakout, tidak seperti Permainan Lima belas, yang sebahagian daripada anda mungkin telah ditangani untuk edisi penggodam. Dalam Breakout ia mencukupi kepada Tuhan mod dengan hanya melakukan apa yang, intuitif dengan dayung? Hanya membuat ia sama dengan apa jua kedudukan mendatar adalah bola. Dan selagi anda melakukan ini dalam lockstep dengan bola bergerak permainan ini akan tidak pernah, pernah, pernah terlepas bola dan anda akan memenangi setiap masa. Tetapi dalam edisi penggodam minggu ini terdapat lebih daripada sekadar mod Allah. Terdapat beberapa ciri-ciri lain. Antaranya, laser. Jadi jika anda benar-benar tidak sabar mendapatkan anda boleh mula menembak jatuh batu bata dan beberapa yang lain. Dan bagi mereka yang ingin menentukur standard berbanding hacker edisi, saya dapat melihat bahawa minggu ini edisi penggodam sengaja adalah sedikit lebih boleh dilakukan, berkata, daripada Allah mod adalah dengan Permainan Lima belas. Jadi, jika anda sedang mencari untuk menghulurkan dan anda sedang mencari untuk berseronok tambahan ciri-ciri melakukan menyelam dalam jika kepentingan. Sekarang, lebih praktikal, izinkan saya menunjukkan keluar satu perkara juga. GDB, yang sebahagian daripada anda mungkin tidak mempunyai lagi menyentuh peribadi, yang halus. Tetapi sekarang adalah benar-benar masa untuk mendapatkan digunakan ini dan selesa dengan alat ini kerana ia akan menjadikan kehidupan anda lebih mudah, benar-benar. Per kuliah Rob pada GDB pasangan minggu lalu, ingat GDB yang penyahpepijat. Ia adalah satu alat yang membolehkan anda menjalankan anda program tetapi berjalan langkah demi langkah, garis demi baris, supaya anda boleh mencucuk di sekitar, supaya anda melihat perkara yang berlaku, jadi bahawa anda boleh mencetak nilai-nilai pembolehubah. Secara ringkas, ia memberikan anda lebih banyak lagi kuasa daripada printDef tidak. Sekarang diakui, antara muka agak sukar difahami. Muka teks hitam dan putih bagi sebahagian besar. Arahan yang agak sukar ingat pada mulanya. Tetapi walaupun ia mungkin mengambil masa anda separuh satu jam, satu jam, untuk meletakkan terlebih dahulu bahawa pelaburan masa ke dalamnya, amanah saya. Sudah tentu pada akhir semester ini ia akan menjimatkan anda suatu perintah magnitud lebih masa daripada itu. Jadi pada awal minggu menyelam masuk Dan dari segi Breakout, tahu bahawa anda boleh melakukan ini selagi anda mempunyai kod pengedaran atau kod anda sendiri dijalankan di dalam direktori Pst4 anda. Tahu bahawa anda boleh menjalankan Pra-Pemasangan. / Pelarian. Ini akan membuka Windows seperti ini. Izinkan saya memberikan diri saya lebih tetingkap terminal. Dan kemudian apa yang saya akan pergi ke hadapan dan lakukan, ia tidak hanya menjalankan ia. Saya akan mula-mula titik rehat ingat, yang membolehkan anda untuk berhenti pelaksanaan di tempat tertentu. Hanya untuk memastikan perkara-perkara yang mudah saya akan untuk memecahkan di garisan satu hanya dengan menaip nombor satu. Biar saya sebenarnya membuka semula tetingkap ini kerana ia mendapat sedikit kecil di sana. Jadi apa yang saya kini akan lakukan di sini adalah jika saya membuka tetingkap terminal saya. Ayuh, ada kita pergi. Jadi sekarang jika saya kembali ke dropbox, Pst4 dan menjalankan Pra-Pemasangan. / pelarian memasuki, notis Saya akan memecahkan satu untuk menetap titik rehat di garisan satu. Dan sekarang saya akan pergi hadapan dan jenis berjalan. Dan apabila saya berbuat demikian, apa-apa notis seolah-olah berlaku. Tiada sehingga pop. Tiada grafik antara muka pengguna yet. Tetapi itu difahami kerana saya betul-betul di garisan satu dalam program saya. Dan notis bahawa saya telah cepat dikemukakan, khusus sekarang untuk 62, kerana semua barangan di bahagian atas fail ini perkara-perkara seperti komen dan pemalar dan tidak menarik barangan untuk sekarang. Jadi sekarang saya dalam utama, ia seolah-olah, di garisan 62. Dan ini hanyalah pengagihan kod, ingat. Jika saya membuka ini dengan pergi, begitu juga, ke dalam direktori kotak drop saya ke Pst4, ke breakout.c. Dan jika saya tatal ke bawah dan ke bawah dan ke bawah, dan biarlah saya pergi ke hadapan dan menghidupkan nombor baris saya. Apa yang saya akan lihat, jika saya tatal ke bawah ke line 62, adalah betul-betul baris yang kami telah berhenti di. Jadi garis ini di sini, 62, adalah di mana kita berada kira-kira untuk menjadi. Jadi sekarang dalam GDB, jika saya pergi ke hadapan dan menaip kini seterusnya, masukkan ia akan melaksanakan garis itu. Dan Voilà, kita mempunyai yang dipanggil tingkap g. Jika tidak biasa dengan apa yang GWindow adalah, tidak perlu bimbang. Spec ini akan memperkenalkan anda kepada, kerana serta beberapa video Walkthrough tertanam dalam spesifikasi. Tetapi sekarang mari kita membuat ini sedikit lebih menarik. Biar saya menggerakkan tetingkap ini lebih ke tepi sedikit. Izinkan saya membuat tingkap sedikit besar jadi saya boleh melihat lebih banyak. Dan kini izinkan saya pergi ke hadapan dan lakukan seterusnya lagi. Dan terdapat bata saya. Jika saya menaip seterusnya lagi sekarang saya melihat bola. Dan jika saya menaip datang lagi sekarang saya lihat dayung. Dan nasib baik gedit ini tidak benar-benar bekerjasama dengan menunjukkan saya semua yang saya mahu. Tetapi sekarang jika saya lakukan seterusnya lagi, datang lagi, saya hanya mengisytiharkan beberapa pembolehubah. Dan saya boleh mencetak mana-mana satu daripada lelaki di luar. Bata cetak, cetakan nyawa. Dan kini jika saya terus berbuat seterusnya, notis bahawa saya akan dalam gelung itu. Tetapi kod akan melaksanakan betul-betul seperti yang saya harapkan. Oleh itu, apabila saya mencecah fungsi ini, Tunggu Klik untuk, ia akan melakukan ia benar-benar itu. Jadi, saya seolah-olah telah hilang kawalan sepanjang program ini. GDB tidak memberi saya satu lagi segera. Tetapi tidak perlu bimbang. Pergi ke permainan saya, klik di suatu tempat. Dan Voilà, kini ia bertindak untuk line 86. Jadi sekali lagi, ia adalah tidak ternilai, akhirnya, bagi masalah debugging. Kerana anda benar-benar boleh melangkah melalui kod anda, perkara-perkara mencetak dan banyak, banyak, banyak lagi. Tetapi untuk sekarang, orang-alat sahaja perlu mendapatkan anda cukup jauh. Jadi kita, sudah tentu, mengambil lihat Grafik pada sekarang, tiba-tiba. Dan kini dunia kita mendapat sedikit lebih menarik. Dan anda tahu, mungkin, dari beberapa video dalam talian yang kita ada ini seluar pendek bahawa anda telah menonton sebagai sebahagian daripada set masalah. Dan mereka telah ditembak, sengaja, berlatarbelakangkan putih. Dan sebahagian daripada mereka mempunyai pengajaran Felo melukis beberapa teks pada skrin itu dilapisi di sebelah mereka. Tetapi sudah tentu, ini tidak semua yang menarik di dunia sebenar. Ini hanyalah satu dewan kuliah dengan skrin putih besar dan latar belakang. Dan pasukan pengeluaran menakjubkan apapun kami daripada membuat segala-galanya kelihatan cantik selepas fakta oleh tanaman daripada atau melapisi apa-apa kita lakukan atau tidak mahu. Sekarang hanya untuk memberi motivasi kepada minggu ini dan benar-benar, di mana anda boleh pergi, akhirnya, dengan sains komputer. Bukan hanya selepas masalah menetapkan empat. Tetapi selepas satu lagi kursus atau keseluruhan kurikulum ia menakjubkan apa yang anda boleh lakukan pada hari ini dari segi grafik khususnya. Sebahagian daripada anda mungkin telah melihat ini mengalir di dalam talian. Tetapi saya fikir saya akan menunjukkan kepada anda, hanya untuk beberapa minit, gambaran tentang apa teknologi komputer dan apa CGI, grafik komputer boleh lakukan hari ini dengan lagu biasa dan mungkin filem. [MUSIC - Lana Del RAY, "MUDA DAN CANTIK] SPEAKER 1: Ia hanya sedikit menakjubkan, mungkin, betapa kehadiran - [Tepuk tangan] SPEAKER 1: Saya hanya turun ia. Tetapi ia adalah benar-benar menakjubkan, saya fikir, hanya bagaimana perisian kehadiran dan kod dan alat-alat seperti ini benar-benar adalah. Itulah rasa arah di mana anda boleh pergi. Oh, tidak Appliance lebih hari ini. Nah, itu sebenarnya masa tragis diberikan titik saya cuba untuk membuat. Baiklah, jadi mari kita melancarkan Fusion lagi. Ingatkan saya kemudian. Semua betul, dan anda sepatutnya mendapat e-mel sebagai diketepikan jika anda tidak mendapat notis seperti itu. Baiklah, jadi ingat bahawa minggu lepas kami mula mengupas kembali ini kemudiannya dikenali sebagai tali. mengimbas kembali rentetan jenis data itu diisytiharkan di perpustakaan CS50. Dan ia adalah sebahagian daripada roda latihan yang kini akan mula berlepas. Ia adalah satu konsep yang berguna awal. Tetapi sekarang ia akan mendapatkan lebih banyak menarik dan lebih kuat untuk benar-benar melihat bahawa di bawah hud, rentetan hanya apa, adakah kita katakan? Ya, jadi ia adalah yang dipanggil char *. Dan * ada menunjukkan bahawa terdapat beberapa jenis alamat yang terlibat. Dan supaya apabila anda mengatakan char * anda hanya bermakna berubah-ubah yang jenis data adalah penunjuk sekarang. Hakikat bahawa terdapat bintang yang terdapat hanya bermaksud bahawa anda mengisytiharkan dipanggil penunjuk. Dan penunjuk yang akan nampaknya menyimpan alamat, di Sudah tentu, char. Sekarang mengapa ini masuk akal? Nah, apa yang adalah rentetan di bawah hood? Nah, untuk beberapa lama kita telah mengatakan bahawa rentetan bawah hud adalah hanya h-e-l-l-o, misalnya. Tetapi kita telah bercakap tentang perkara ini yang, pada dasarnya, array. Dan array kemudian akan kelihatan sedikit lebih seperti ini, dengan masing-masing mengambil menggigit. Dan kemudian kita telah berkata bahawa ada sesuatu yang istimewa kembali di sini, backslash 0, atau null. Jadi semua masa ini, ini di sini telah rentetan. Tetapi benar-benar, tali adalah sebenarnya alamat. Dan alamat, seperti yang kita akan lihat, sering awalan 0x oleh konvensyen. Apakah 0x menunjukkan? Adakah sesiapa yang tahu? Jadi ia hanya bermakna perenambelasan. Jadi, anda mungkin ingat, sebenarnya, dari Pst 1, saya percaya, salah satu daripada memanaskan badan soalan sebenarnya ditanya mengenai notasi perenambelasan di samping binari dan perpuluhan. Dan motivasi di sini adalah bahawa dengan perenambelasan anda mempunyai 16 digit pada pelupusan anda. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, diikuti dengan a, b, c, d, e, f. Dan jika anda mengira semua orang-orang ke atas, anda akan mendapat sejumlah 16. Jadi ini adalah berbeza dengan perpuluhan, di mana kita mempunyai 10 digit, 0 hingga sembilan. Ia adalah berbeza dengan binari di mana kita hanya perlu 0 dan 1. Tetapi pada akhir hari, anda boleh hanya mewakili nombor yang sama, tetapi agak berbeza. Dan perenambelasan adalah perkara biasa kerana sebagai Ternyata - dan kita akan melihat ini kemudian dalam perjalanan - walaupun kita akan mendapat kepada pengaturcaraan web dalam konteks HTML dan kod warna, perenambelasan baik. Kerana setiap angka, ternyata, mewakili empat bit dengan sempurna. Jadi ia hanya jenis garisan sehingga baik kerana akhirnya kita akan melihat. Jadi ini mungkin Ox123 atau sesuatu seperti itu, yang melambangkan alamat 123 di suatu tempat di dalam saya memori komputer. Tetapi sudah tentu, beberapa masalah timbul kerana ini asas pelaksanaan. Dan ingat bahawa saya mengambil tikaman di melaksanakan fungsi seperti ini - bandingkan melontarkan 0 dot c minggu lepas, bahawa walaupun ia kelihatan seperti ia adalah betul, ia hanya tidak membandingkan dua tali dengan betul. Saya telah dibuang utama, dan saya telah dibuang jauh komen hanya memberi tumpuan di atas kod itu kepentingan di sini. Dan ia adalah dalam warna merah kerana ia adalah kereta. Atas sebab apa? Nah, di atas sana apabila saya diisytiharkan tali, apa yang benar-benar berlaku di bawah hood? Baiklah, biar saya pergi lebih ke skrin di sini dan menarik itu. Jadi saya mengisytiharkan, sekali lagi, GetString tali s. Jadi saya akan pergi ke hadapan sekarang dan menarik s untuk apa yang ia benar-benar adalah. Ia akan menjadi persegi di sini. Dan saya akan menuntut bahawa adalah 32 bit. Sekurang-kurangnya ia biasanya adalah, sekurang-kurangnya pada CS50 perkakas dalam banyak komputer. Saya akan memanggilnya s. Tetapi sekarang ingat bahawa kita dipanggil GetString. Pulangan Jadi GetString, sudah tentu, rentetan. Jika jenis pengguna dalam h-e-l-l-o masuk rentetan hello akan dikembalikan. Dan rentetan itu, seperti yang kita hanya berkata, berakhir di suatu tempat di dalam memori komputer anda dengan 0 garis sendeng terbalik di akhir. Saya akan menarik ini seperti pelbagai - atau blok berdampingan aksara - yang sebenarnya. Dan kini, apa yang GetString sebenarnya kembali? Apa yang telah GetString telah kembali semua masa ini? Nah, kita katakan, dalam beberapa minggu lepas, ia kembali rentetan. Tetapi yang lebih teknikal, apakah GetString pulangan nampaknya? PENONTON: Alamat An. SPEAKER 1: Alamat An. Khususnya ia kembali alamat gigitan pertama, apa sahaja ia. Saya hanya terus menggunakan satu, dua, tiga kerana ia adalah mudah. Ia akan kembali alamat yang pertama watak dalam tali. Dan kita berkata minggu lepas bahawa yang mencukupi. Kerana kita sentiasa boleh mengetahui di mana akhir rentetan hanya dengan iterating ke atasnya, mungkin, dengan untuk gelung atau gelung sementara atau sesuatu seperti itu, hanya mencari "backslash 0", watak sentinel khas. Dan kemudian kita tahu bahawa rentetan berlaku untuk menjadi panjang - dalam kes ini - lima. Jadi secara teknikal apa GetString tidak ia kembali Ox123 dalam kes ini. Dan teknikal maka apa yang berlaku ialah yang kita simpan, dalam s, Ox123. Pada akhir hari ini, walaupun ini adalah konsep baru, petunjuk, mereka hanya pembolehubah. Tetapi ia berlaku untuk menyimpan bit yang secara kolektif mewakili alamat. Jadi secara teknikal semua mereka mendapat disimpan di dalam s adalah Ox123. Tetapi kita sebagai manusia - termasuk seterusnya hari ini - benar-benar tidak akan peduli, biasanya, apa alamat sebenar beberapa sebahagian memori. Ia hanya ke tahap rendah terperinci untuk secara intelektual yang menarik. Jadi saya akan membatalkan ini. Dan sebaliknya, tahap yang lebih tinggi, hanya mengatakan bahawa apabila kita berbicara tentang petunjuk Saya akan hanya menarik lebih arrow mesra pengguna yang menyampaikan Idea yang sama dan abstrak jauh butir-butir mengenai apa yang sebenar alamat asas adalah. Sekarang jika kita kembali kepada kod, apa berlaku minggu lepas jika kita mempunyai tali t sama GetString? Nah, jika saya sekali lagi, taip hello kali ini saya akan mendapatkan lagi sebahagian memori. h-e-l-l-o backslash 0. Tetapi kerana saya dipanggil GetString kali kedua - dan saya tahu ini dari melihat Kod sumber untuk GetString - walaupun walaupun ia adalah kebetulan bahawa hello adalah ditaip dalam dua kali, GetString tidak akan cuba untuk mengoptimumkan dan bijak. Ia hanya akan mendapat satu lagi sebahagian daripada memori daripada komputer, yang merupakan akan berada di alamat yang lain. Mari kita sewenang-wenangnya hanya mengatakan 456. Dan kemudian apa yang ia akan kembali? Ia akan kembali 456 dan menyimpannya dalam t. Jadi apa yang benar-benar berlaku, pada sebelah kiri adalah saya mempunyai sebahagian yang lain ingatan, 32 bit biasanya. Dan di sana akan pergi Ox456. Tetapi sekali lagi, saya tidak berminat dalam nombor tertentu lagi. Saya hanya akan abstrak menarik sebagai anak panah. Jadi ini kini merupakan penjelasan baru. Tetapi ia adalah idea yang sama yang tepat itu telah berlaku sepanjang masa ini. Dan sebagainya sebab itu, yang pertama ini versi membandingkan adalah kereta minggu lepas ialah, mengapa? Apabila anda lakukan jika s sama sama t apa yang anda benar-benar di bawah hood membandingkan? Anda membandingkan alamat. Dan hanya intuitif, jelas, Ox123 tidak akan sama Ox456. Nombor-nombor tersebut, orang-orang bit hanya berbeza. Dan begitu konsisten, minggu lepas katanya anda menaip perkara yang berbeza, walaupun kata-kata itu kata demi kata yang sama. Oleh itu, kita menetapkan ini. Dari segi orang biasa itu, apa yang menetapkan? PENONTON: Gunakan fungsi. SPEAKER 1: Gunakan fungsi. Atau bintang pasti terlibat, tetapi menggunakan fungsi untuk melakukan apa? PENONTON: Untuk membandingkan tali. SPEAKER 1: Untuk membandingkan tali. Jadi masalah asas di sini adalah bahawa saya hanya menimbangkan kualiti tali untuk ditakrifkan oleh perbandingan alamat mereka. Dan jelas bahawa hanya bisu kini sekali anda memahami apa yang berlaku di di bawah hood. Untuk benar-benar membandingkan tali untuk melihat jika mereka yang sama dalam cara yang manusia akan mempertimbangkan dua tali untuk sama kita perlu membandingkan mereka watak untuk watak untuk watak. Sekarang saya boleh dilakukan ini sangat tediously. Tetapi akrab, kami menggunakan untuk gelung. Dan hanya membandingkan s kurungan i terhadap t kurungan i. s kurungan i campur 1 terhadap t kurungan i campur 1, dan sebagainya, di dalam beberapa jenis gelung. Dan jika saya melihat mana-mana dua watak-watak yang berbeza, atau jika saya menyedari bahawa aduh, s adalah pendek daripada t atau lebih lama daripada t Saya segera boleh mengatakan palsu, mereka tidak sama. Tetapi jika saya mendapatkan melalui s dan t dan berkata sama, sama, sama, sama, sama, akhir kedua-dua rentetan, saya boleh mengatakan benar, mereka adalah sama. Well, bersyukur, tahun lalu seseorang menulis kod yang bagi kami. Dan mereka memanggilnya StrComp untuk tali utama. Dan walaupun ia adalah kaunter sedikit intuitif, StrComp mengembalikan 0 jika orang-orang dua tali, s dan t yang sama. Tetapi ia mengembalikan nilai negatif jika s harus datang sebelum t abjad atau nilai positif jika ia sepatutnya selepas t abjad. Jadi jika anda pernah mahu menyelesaikan sesuatu, ternyata bahawa StrComp berguna. Kerana ia tidak hanya mengatakan ya atau tidak, sama atau tidak. Ia memberikan rasa pesanan suka kekuatan kamus. Jadi StrComp, s koma t sama sama dengan 0 bermakna bahawa tali yang benar-benar sama. Kerana sesiapa yang menulis fungsi ini tahun lalu mungkin digunakan untuk gelung atau gelung semasa atau sesuatu seperti itu untuk mengintegrasikan lebih watak-watak lagi dan lagi dan lagi. Tetapi dua masalah timbul di sini. Ini adalah copy0.c. Dan kedua-dua dalam merah kerana ia adalah cacat. Dan apa yang kita lakukan di sini? Well, pertama saya dipanggil GetString. Dan saya disimpan nilai pulangan dalam s. Jadi yang cukup banyak yang sama seperti ini bahagian atas gambar. Tetapi apa yang berlaku selepas itu? Baiklah, biar saya pergi ke hadapan dan menghilangkan daripada sejumlah besar ini. Kami akan memundurkan dalam masa di mana kita hanya mempunyai s, yang kini selaras dengan line satu di sana. Saya menyemak. Jika s sama sama dengan 0. Sekarang, nota sampingan yang cepat, apabila GetString mungkin kembali 0? Tidak ada memori yang cukup. Betul? Ia jarang berlaku bahawa ini akan berlaku, pasti pada komputer itu mendapat beratus-ratus Megs atau walaupun gig RAM. Tetapi ia boleh, dalam teori, kembali 0, terutamanya jika pengguna tidak bekerjasama. Terdapat cara-cara untuk berpura-pura seperti anda tidak mempunyai apa-apa yang dimasukkan dan silap mata GetString kembali ke 0 berkesan. Jadi ia akan menyemak untuk itu. Kerana jika mana-mana anda telah mula mendapatkan, sudah, kerosakan segmentasi - yang mungkin telah menjadi sumber yang kekecewaan beberapa - mereka adalah hampir sentiasa hasil memori yang berkaitan dengan kesilapan. Entah bagaimana anda sehingga merosakkan berkenaan dengan sesuatu penunjuk, walaupun anda tidak sedar terdapat penunjuk. Jadi anda mungkin telah mendorong segmentasi kesilapan seawal satu minggu menggunakan sesuatu seperti untuk gelung atau sementara gelung dan array dengan pergi terlalu jauh lalu sempadan beberapa array yang anda diisytiharkan, dalam seminggu dua tertentu. Anda mungkin telah dilakukan walaupun dalam masalah menetapkan empat dengan Breakout. Walaupun anda mungkin tidak pernah melihat mana-mana bintang dalam kod taburan Breakout, ternyata bahawa mereka GRect dan GOval dan lain-lain perkara-perkara seperti, orang-orang yang benar-benar petunjuk di bawah hood. Tetapi Stanford, seperti kita, jenis menyembunyikan yang terperinci sekurang-kurangnya untuk perpustakaan tujuan, banyak seperti yang kita lakukan untuk tali dan char *. Tetapi GRect dan GOval dan semua orang-orang perkara yang anda lelaki atau akan menggunakan minggu ini adalah akhirnya alamat ingatan. Anda hanya tidak tahu. Jadi ia tidak mengejutkan, mungkin, yang anda mungkin perjalanan ke beberapa kesalahan segmentasi. Tetapi apa yang menarik di sini sekarang, jika selepas kita memeriksa 0 yang kita lakukan tali t mendapat s. Baiklah, biar saya mengisytiharkan t. Saya akan menarik sebagai persegi, 32 bit, memanggilnya t. Dan kemudian saya akan lakukan mendapat s. Nah, apa maksudnya? Nah, ia sedikit sukar untuk memikirkan tentang gambar bijak. Tetapi mari kita berfikir tentang apa yang di dalam x? Apa yang benar-benar berubah-ubah di dalam ini? The Ox123 nilai. Oleh itu, apabila saya katakan tali t mendapat s, yang hanya bermaksud mengambil bilangan dalam s, yang Ox123 dan meletakkannya Ox123. Atau bergambar, jika saya jenis abstrak dari detail bahawa ia mempunyai kesan literal melakukan ini juga. Jadi sekarang, berfikir kembali ke minggu lalu apabila kami menuju ke kapitalis T. Saya lakukan T kurungan 0. Nah, T kurungan 0, walaupun ia adalah satu penunjuk, anda boleh merawat ia seolah-olah ia adalah pelbagai, dengan persegi notasi kurungan. Jadi di mana T kurungan 0? Nah, itu h. Dan sebagainya apabila kita menggunakan garis kod, dua bahagian atas, yang berada dalam c yang type.h file kepala, itu di mana ia diisytiharkan. Anda mengambil kesempatan ini H. Tetapi tentu, itu h yang sama itu dalam s, jadi untuk bercakap. Dan sekarang anda telah menukar atau modal kedua-dua asal dan dipanggil salinan. Kerana anda tidak membuat salinan di cara yang manusia mahu ia menjadi. Jadi apa yang telah menetapkan di sini, dalam copy1.c minggu lepas? Fungsi, supaya kita boleh benar-benar menyalin tali. Dan asasnya, apa yang kita perlu lakukan untuk menyalin rentetan? Nah, dalam versi ini hijau di sini saya akan melakukannya tahap yang agak rendah. Sebenarnya ada fungsi mereka boleh membantu dengan ini. Tetapi yang paling asas, dan yang paling satu biasa, sekurang-kurangnya, tidak lama lagi akan biasa kepada kita, adalah seperti berikut - jadi satu pada baris pertama kod warna hijau sekarang. Saya hanya menulis semula s sebagai char *. Tiada fungsi perbezaan di sana. Saya hanya melemparkan perpustakaan CS50 dan Saya memanggil apa yang ada, a * char. Sekarang dot, dot, dot, kerana terdapat beberapa semakan ralat yang tidak menarik untuk bercakap tentang lagi. Jadi sekarang t diisytiharkan. Ia juga adalah * char. Jadi saya menarik persegi sedikit pada skrin seperti sebelum ini. Tetapi pada sebelah kanan, malloc, kita kata adalah memori memperuntukkan. Jadi memperuntukkan beberapa sebahagian memori. Dan berapa banyak bait kita sebenarnya mahu memperuntukkan, ia seolah-olah? Well, panjang rentetan s. Jadi, jika ia adalah khabar itu akan menjadi lima. Kami akan mengatakan h-e-l-l-o. Jadi lima bait. Tetapi campur 1, mengapa 1? The 0 watak. Jika kita tidak meninggalkan ruang untuk lelaki ini kita sengaja mungkin mewujudkan keadaan yang di mana tali adalah h-e-l-l-o. Dan kemudian GetString masa akan datang adalah dipanggil dan saya menaip, misalnya, David, D-a-v-i-d, komputer akan untuk berfikir bahawa s sebenarnya h-e-l-l-o-d-a-v-i-d kerana ada tidak memecahkan di antara kata-kata. Oleh itu, kita perlu berehat itu. Oleh itu, kita tidak mahu lima. Kami mahu enam bait. Dan bait yang saya katakan. Tetapi ia adalah benar-benar masa saiz char. Teknikal char hampir sentiasa bait tunggal. Tetapi hanya untuk membuat kod kita mudah alih, jadi untuk bercakap, supaya ia berfungsi pada komputer yang berbeza walaupun mereka mungkin agak berbeza di bawah hud, saya akan umum mengatakan saiz char supaya kod saya selalu bekerja. Dan saya tidak perlu susun semula ia hanya kerana saya menaik taraf komputer saya atau menggunakan beberapa platform yang berbeza. Jadi saya telah mendapat 6 kali saiz a char, yang berlaku sebagai 1. Jadi cara malloc boleh memberikan saya enam bait. Apa yang benar-benar buat? Baiklah, biar saya melancarkan kembali dalam masa di sini di mana kita berada dalam cerita. Jadi, jika saya kembali di sini, saya telah diisytiharkan a * char dipanggil t. Saya kini telah dipanggil malloc selama enam bait. Dan sekarang saya akan menarik orang-orang enam bait seperti pelbagai yang lebih awal. Tetapi saya sebenarnya tidak tahu apa yang dalam pelbagai ini. Jika anda memperuntukkan memori ternyata bahawa anda tidak boleh mempercayai bahawa terdapat beberapa nilai dikenali di sana. Ia boleh digunakan oleh sesuatu lain, beberapa fungsi lain, yang lain baris kod yang anda menulis. Oleh itu, kita biasanya akan memanggil sampah ini nilai dan menarik mereka, mungkin, sebagai tanda tanya, hanya menunjukkan bahawa kita tidak tahu apa yang sebenarnya di sana. Dan itu tidak ada masalah besar selagi kita cukup bijak untuk menimpa mereka nilai-nilai sampah dengan nombor atau aksara yang kita sayangi. Jadi dalam kes ini apa yang saya akan lakukan? Nah, talian saya kod seterusnya, saya mempunyai empat. int i mendapatkan 0, n mendapat panjang rentetan s. Jadi biasa bagi gelung. Saya adalah kurang daripada atau sama dengan n, yang biasanya adalah di atas. Tetapi kali ini ia sengaja. I + +, dan kemudian saya hanya melakukan t kurungan i mendapat s. Kerana gambar saya kelihatan seperti ini di masa ini, yang disimpan di dalam t adalah alamat yang sebahagian rawak ingatan nilai-nilai yang tidak diketahui. Tetapi sebaik sahaja saya lakukan t kurungan 0 yang meletakkan saya di sini. Dan apa yang akhirnya mendapat disediakan di sana? Kami akhirnya meletakkan h. Kerana itulah apa yang di s kurungan 0. Dan kemudian perkara yang sama untuk e, dan saya, dan saya, dan o. n, mengapa saya pergi ke atas melalui yang bersamaan dengan n? Kerana watak 0. Jadi jelas, maka, jika saya benar-benar memadam apa-apa sampah ini nilai-nilai dan kemudian benar-benar menarik dalam apa yang saya harapkan, ini adalah s kurungan 1, 2, 3, 4, ditambah itu ketinggalan watak baru. Dan sekarang jika kita terus lalu titik, dot, dot dalam versi ini betul dan huruf t kurungan 0 saya akan, daripada Sudah tentu, akan mengambil kesempatan hanya ini lelaki di sini, yang konsep, akhirnya matlamat. Jadi, itu semua penunjuk itu. Dan anda telah menggunakan mereka untuk minggu kini dalam konteks tali. Tetapi di bawah hood mereka sedikit lebih kompleks. Tetapi jika anda berfikir tentang mereka dalam bentuk bergambar saya mencadangkan bahawa mereka mungkin tidak semua yang menakutkan kerana mereka pertama mungkin kelihatan pada pandangan pertama, terutamanya dengan sintaks baru itu. Sebarang pertanyaan mengenai petunjuk, tali, atau aksara? Ya? PENONTON: Bolehkah anda kembali kepada [didengar] SPEAKER 1: Pasti. PENONTON: Jadi bagaimana datang kekal anda talian, anda tidak mempunyai * t talian dan * s dalam baris? Jangan anda mempunyai rujukan kepada - SPEAKER 1: Ah, soalan yang benar-benar baik. Kenapa saya tidak mempunyai * t dan a * s? Kerana secara ringkas, minggu lalu, seperti dalam kami menukar fungsi, saya mengatakan bahawa apabila anda telah mendapat penunjuk cara dengan yang anda pergi ke sana seperti yang kita lakukan fizikal di atas pentas, adalah untuk benar-benar menggunakan operator bintang. Ia ternyata bahawa ini kurungan persegi notasi adalah apa yang kita akan memanggil sintaktik gula, yang hanya satu cara yang seksi berkata ia notasi singkatan untuk apa yang anda menggambarkan. Tetapi ia adalah sedikit lebih intuitif. Dan pada risiko membuat ini kelihatan lebih rumit daripada ia perlu, apa yang benar-benar berlaku di sini adalah seperti berikut - Jika saya katakan * t bermakna pergi ke alamat yang disimpan di dalam t. Jadi benar-benar, jika t adalah menyimpan alamat yang h pada mulanya, * t cara pergi sini. Kini, apa yang t kurungan 0 maksudkan? Perkara yang sama yang tepat. Ia hanya turun sedikit lebih mesra untuk menulis. Tetapi saya tidak dilakukan lagi. Saya tidak boleh hanya mengatakan * t mendapat * s. Kerana apa yang saya akan lakukan itu? Saya akan meletakkan h, h, h, h, h sepanjang segala-galanya. Betul? Kerana * t ialah pergi ke alamat dalam t. Tetapi kita di dalam gelung. Dan apa yang nilai saya menokok, sudah tentu, pada setiap lelaran? i. Tetapi ada peluang di sini, bukan? Walaupun ini berasa seperti ia semakin sedikit lebih canggih daripada notasi persegi kurungan kita telah digunakan untuk beberapa kali - biarlah saya membatalkan perubahan h saya di sana - walaupun ini kini mendapat sedikit penjaga, idea asas, jika * t bermakna di sini dan * t hanya pergi ke alamat dalam t. Tetapi apa yang alamat dalam t? Bilangan kita terus menggunakan? Seperti Ox456, mari kita membawa yang kembali hanya demi perbincangan. Nah, jika saya mahu mendapatkan di e di t tali, saya hanya mahu pergi ke, pada dasarnya, 456. Atau sebaliknya, 457. Saya hanya perlu untuk menambah satu. Tetapi saya boleh berbuat demikian, bukan? Kerana t, walaupun saya menjaga lukisan sekarang seperti anak panah, ia hanya nombor, Ox456. Dan jika saya menambah satu itu, atau lebih secara amnya, jika saya boleh menambah saya ke yang saya boleh benar-benar mendapatkan tepat di mana saya mahu. Jadi, jika saya benar-benar melakukan ini - dan ini adalah apa yang kini dikenali sebagai aritmetik penunjuk - Saya boleh mengeluarkan baris ini. Yang, terus-terang, saya rasa lebih jelas dan mesra pengguna lebih sedikit untuk membaca. Tetapi ini adalah tidak kurang betul. Ini sejajar kod kini menggunakan aritmetik penunjuk. Ia mengatakan pergi ke alamat berikut - apa permulaan t ialah, yang t plus i, yang pada mulanya adalah 0, yang besar. Kerana itu bermakna permulaan t campur 1, ditambah 2, plus 3, dan sebagainya. Dan perjanjian yang sama dengan s. Gula Jadi sintaksis untuk ini. Tetapi memahami apa yang benar-benar berlaku di bawah hood, saya akan berhujah, sebenarnya berguna dalam dan dengan sendirinya. Kerana ia bermakna kini tidak ada banyak lagi keajaiban berlaku di bawah hood. Terdapat tidak akan menjadi lebih banyak lapisan yang kita kulit boleh membuat sandaran untuk anda. Ini adalah c. Dan ini adalah pengaturcaraan. Really good soalan. Baiklah, jadi ini adalah kereta yang program saya telah merujuk kepada awal. swap adalah cacat. Jika tidak kelihatan untuk bekerja. Ingat bahawa sama seperti dengan susu dan jus oren - yang saya mula minum demonstrasi hari ini. Jadi sama seperti dengan jus dan oren susu, kita perlu menggunakan ubah sementara, tmp, untuk mengadakan buat sementara waktu supaya kita boleh kemudian menukar nilai dan kemudian mengemas kini b. Tetapi fungsi ini, kita berkata, atau ini program di mana majlis ini ialah bertulis itu adalah salah dan cacat, mengapa? Ya? PENONTON: [didengar]. SPEAKER 1: Tepat sekali, apabila anda memanggil swap - atau lebih secara amnya, apabila anda panggilan yang paling apa-apa fungsi - jika hujah untuk fungsi yang primitif, jadi untuk bercakap, dan aksara Ints dan beregu dan terapung, perkara-perkara tanpa bintang, anda lulus dalam satu salinan hujah. Jadi, jika x adalah 1 dan y adalah 2, akan menjadi 1 dan b akan menjadi 2. Tetapi mereka akan menjadi ketulan yang berbeza bit, ketulan berbeza memori yang berlaku untuk menyimpan nilai-nilai yang sama. Jadi kod ini adalah super sempurna bertukar-tukar pada a dan b. Ia tidak baik bertukar-tukar - dalam contoh minggu lepas - x dan y. Kerana sekali lagi, mereka dalam skop yang salah. Sekarang, bagaimana kita pergi tentang penetapan ini? Kami terpaksa membuat fungsi kelihatan uglier sedikit. Tetapi sekali lagi, pertimbangkan apa ini hanya bermakna. Dan sebenarnya, izinkan saya, bagi konsisten, mengubah satu perkara jadi ia sama dengan apa yang kita lakukan. Seperti yang saya sebutkan pada minggu lepas, ia tidak kira di mana ia pergi. Malah, biasanya anda akan meletakkan bintang di sebelah nama berubah-ubah. Tetapi saya fikir ia akan menjadi sedikit lebih mudah mempertimbangkan * di sebelah Jenis data yang bermakna ia adalah penunjuk kepada int dalam kes ini. Jadi apa yang saya lakukan di sini? Saya katakan tidak memberi saya int diikuti oleh int lain, memanggil mereka dan b. Berikan saya alamat int an. Berikan saya alamat int lain. Memanggil mereka menangani dan b. Dan kemudian menggunakan * notasi turun di bawah, pergi ke setiap orang alamat seperti yang diperlukan sama ada untuk mendapatkan atau menetapkan nilainya. Tetapi ada pengecualian di sini. Mengapa saya tidak mempunyai * di sebelah tmp? Kenapa saya tidak melakukan ini, misalnya? Rasanya seperti saya hanya perlu pergi semua keluar dan membetulkan segala-galanya. Ya? PENONTON: [didengar]. SPEAKER 1: Saya telah tidak diisytiharkan tmp sebagai rentetan. Jadi ini akan mengisytiharkan, dalam kes ini, tmp untuk menjadi alamat int an. Tetapi itu tidak cukup apa yang saya mahu, untuk beberapa sebab. PENONTON: Anda tidak mahu untuk menukar mereka. SPEAKER 1: Tepat sekali, saya tidak mahu untuk menukar apa-apa dengan tmp. tmp hanya minggu-satu barangan. Apa yang saya mahu adalah pembolehubah untuk menyimpan nombor tertentu. Saya tidak mengambil berat tentang alamat pada masa ini. Saya hanya perlu 32 bit atau jadi untuk menyimpan int an. Dan saya mahu untuk dimasukkan ke dalam orang-orang 32 bit apa yang tidak ada di dalam, jadi untuk bercakap, tetapi apa yang di, hanya untuk menjadi lebih tepat. Kerana jika adalah alamat, * bermakna pergi ke sana dan mendapat nilai 1. Sebagai contoh, dalam contoh minggu lepas atau dalam kes b, mendapat nilai 2. Jadi apa yang benar-benar berlaku? Izinkan saya menarik gambar di sini yang akan hanya mengusik selain sebahagian daripada hari ini. Tetapi ini akan terus muncul untuk sekian lama. Ini, saya menuntut, adalah apa yang komputer anda memori kelihatan seperti apabila anda menjalankan program, apa-apa program. Apabila anda menjalankan program di bahagian paling atas RAM komputer anda - jadi berfikir segi empat ini, benar-benar, seperti yang anda RAM atau memori komputer, semua 101 bilion bait itu, semua dua bilion bait, semua dua gigabait itu, apa jua kuantiti yang anda perlu adalah, mari kita menarik sebagai segi empat tepat. Dan saya mendakwa bahawa apabila anda menjalankan program seperti Microsoft Word atau Chrome atau apa-apa seperti itu, bit yang Microsoft atau Google menulis - dalam kes-kes program-program - dimuatkan ke dalam memori komputer anda di mana mereka boleh dilaksanakan lebih cepat dan makan ke dalam CPU, yang adalah otak komputer. Dan dalam TAM ia disimpan sekurang- atas program anda, jadi untuk bercakap. Dalam erti kata lain, jika ini adalah sebahagian daripada ingatan, apabila anda klik dua kali pada Microsoft Word, bit datang luar cakera keras. Mereka mendapat dimuatkan ke dalam RAM. Dan kita akan mendorong mereka di bahagian paling atas segi empat konsep ini. Well, seluruh memori anda digunakan untuk perkara-perkara yang berbeza. Di bahagian paling atas yang anda lihat memulakan data dan uninitialize data. Ini telah lakukan, sebahagian besar, dengan pemalar atau pembolehubah global yang mempunyai nilai-nilai. Tetapi yang lebih kepada orang-orang masa yang lain. Kemudian anda mempunyai timbunan itu, yang kita akan kembali kepada. Tetapi di bawah adalah sebahagian itulah terutamanya yg sekarang. Ia adalah timbunan kononnya. Jadi sama seperti dalam kebanyakan mana-mana dewan D di sini kampus, anda mempunyai orang-orang yang dulang hanya timbunan di atas satu sama lain di mana anda boleh meletakkan makanan dan barang kecil. Timbunan dalam sistem komputer adalah sangat serupa. Kecuali manakala dulang, seperti yang kita gunakan dalam dewan makan, sudah tentu, yang dimaksudkan untuk menjalankan perkara-perkara dulang atau bingkai - seperti yang kita akan memanggil mereka - dalam komputer memori yang digunakan untuk memegang pembolehubah dan nilai-nilai. Jadi apa yang benar-benar berlaku di di bawah hood? Baiklah, biar saya terbalik ke skrin di sini. Dan mari memberi tumpuan hanya pada Bahagian bawah untuk seketika. Jika ini adalah bahagian bawah saya memori komputer ternyata apabila saya memanggil fungsi utama - yang berlaku, terus-terang, secara automatik bagi saya - Saya mendapat sebahagian memori pada bawah RAM saya supaya untuk bercakap. Dan ini adalah di mana utama adalah pembolehubah tempatan pergi. Ia adalah di mana argc dan argv mungkin pergi, dan apa-apa pembolehubah saya mengisytiharkan dalam utama. Mereka akhirnya di bahagian bawah RAM komputer saya. Sekarang andaikan bahawa panggilan utama fungsi seperti swap, seperti yang berlaku minggu lepas? Nah, kita pada dasarnya meletakkan dulang baru, bingkai baru, saya ke sebahagian memori. Dan saya akan menerangkan ini sebagai kepunyaan fungsi swap. Sekarang apa yang di dalam swap? Nah, berdasarkan program minggu lepas dan yang kita hanya melihat petikan dari, dalam rangka swap, atau daripada pertukaran ini dulang, adalah apa pembolehubah? Well, a dan b. Kerana mereka adalah hujah tempatan, ditambah ketiga, tmp. Jadi benar-benar, saya boleh menarik ini sedikit lebih bersih. Biar saya pergi ke hadapan dan membatalkan label. Dan biarlah saya mengatakan bahawa anda tahu apa? yang mungkin akan berakhir di sini. B akan berakhir di sini. Dan tmp akan berakhir di sini. Kini, pesanan itu mungkin menjadi sedikit berbeza. Tetapi konsep ini adalah idea. Dan hanya secara kolektif, ini adalah apa kami akan memanggil bingkai swap, atau dulang makan-dewan. Dan perjanjian yang sama dengan utama. Tetapi saya tidak akan melukis itu. Tetapi itu di mana argc dan argv dan mana-mana pembolehubah tempatan seperti x dan y mungkin juga. Jadi sekarang mengambil kira apa yang benar-benar berlaku apabila anda memanggil swap. Apabila anda memanggil swap, kod melaksanakan seperti ini, anda lulus dalam, dalam versi kereta, a dan b sebagai salinan x dan y. Jadi jika saya kini menarik ini pada skrin - mendapat untuk mendapatkan yang lebih baik pada ini - jadi cerita yang saya telah memberitahu kepada diri saya sendiri adalah dalam versi ini kereta, apabila kita memanggil menukar lulus dalam literal dan b sebagai integer, apa yang benar-benar berlaku? Nah, apa yang benar-benar berlaku adalah ini. Biar saya pergi ke hadapan dan batal hanya untuk mengosongkan sedikit ruang di sini. Jadi ini adalah memori komputer saya. Jadi jika saya mempunyai, misalnya - sebenarnya mari kita melakukannya dengan cara ini - jika saya mendakwa bahawa ini adalah x, menyimpan nilai 1 sama seperti minggu lepas. Dan ini adalah y, menyimpan nilai 2 sama seperti minggu lepas. Dan ini adalah utama, apabila saya panggil swap, sekali gus memberikan saya akses kepada dan b dan tmp, saya akan mendakwa bahawa ini dan ini adalah 1. Ini adalah b. Ini adalah 2. Ini dipanggil tmp. Dan pada mulanya, ia mempunyai beberapa nilai sampah sehingga saya benar-benar menyimpan di dalamnya, yang 1. Kemudian saya pergi ke hadapan dan mengubah untuk menjadi apa? Nilai B. Dan sehingga kini saya mempunyai dua di sini. Dan kemudian kita berkata b mendapat tmp. Sekali lagi, hanya kerana kewarasan cek, ketiga baris kod di sini adalah semata-mata ini satu, b mendapat tmp. Dan supaya akhirnya, apa yang saya lakukan? Saya pergi ke hadapan dan mengubah b untuk menjadi apa sahaja nilai tmp adalah, yang 1. Saya tidak menyentuh tmp lagi. Tetapi kini, masalah ini secepat swap pulangan, kerana ia tidak menyerahkan kembali beberapa nilai, tidak ada pulangan pernyataan jelas di dalamnya. Apa yang sebenarnya berlaku? Nah, pada dasarnya semua memori ini - OK, nampaknya pemadam suka hanya satu jari pada satu masa - hanya hilang. Sekarang dalam realiti, ia tidak ke mana-mana. Tetapi, anda boleh memikirkan ia kini sebagai tanda tanya. Kerana ia tidak lagi sebenarnya digunakan. Dan tiada apa yang dilakukan dengan nilai-nilai. Jadi dalam kes versi hijau kod ini, dan bukannya apa yang sedang berlalu ke swap? Jadi menangani. Jadi, alamat x dan alamat y. Jadi, jika kita semula memberitahu cerita ini yang terakhir masa, dan saya benar-benar menarik swap lagi, tetapi dengan petunjuk, ini menjadi, ini menjadi b, dan ini tmp menjadi, apakah sebenarnya disimpan di dalam hijau versi kod saya di mana saya lulus di alamat? Ia akan menjadi penunjuk kepada x. Jadi saya boleh menarik anak panah. Tetapi mari kita menggunakan sewenang-wenangnya sama contoh seperti sebelum ini. Mari kita mengatakan bahawa ini adalah sesuatu seperti Ox123. Dan ini akan menjadi Ox127 kerana ia adalah empat bait jauh kerana ia merupakan int, jadi Ox127. Dan sekali lagi, saya mengambil beberapa kebebasan dengan nombor. Mereka lebih kecil daripada mereka akan sebenarnya dan dalam susunan yang berbeza. Tetapi itulah bagaimana gambar kini berbeza. Tetapi apabila saya menggunakan kod hijau dan saya int tmp mendapatkan * a. * Satu cara untuk melakukan yang berikut, mengambil menangani yang dalam dan pergi untuk itu, yang 1. Dan itulah yang kemudian saya meletakkan di tmp. Sementara itu, di baris berikutnya kod di sini, * mendapat b, apa maksudnya? Nah, *, jadi pergi di sini mendapat * b, yang bermaksud pergi ke sana. Dan itu bererti meletakkan nilai ke sana. Akhirnya, barisan terakhir kod hanya berkata * b mendapat tmp. Jadi b berkata pergi ke sana dan menulis dengan tmp yang, dalam kes ini, akan menjadi, sekali lagi, 1. Dan ini adalah mengapa versi hijau kerja-kerja kod kita, manakala merah versi tidak pernah. Ia semua hanya bisul ke bagaimana memori diuruskan dan di mana ia sebenarnya diletakkan di dalam anda RAM komputer. Dan buat masa ini, adalah salah satu daripada perkara-perkara yang timbunan itu sedang digunakan untuk. Soalan pada susun atur? Pada petunjuk? Atau swap? Baiklah, jadi malloc, ingat, melakukan sesuatu seperti ini. Ini adalah satu contoh yang sangat mudah. Dan ini adalah salah satu yang Binky memperkenalkan kami kepada, walaupun agak dengan cepat, pada akhir kelas. Keparat, di sana kami pergi lagi. Jadi ingat bahawa ini adalah contoh yang Binky memperkenalkan kami kepada, walaupun agak cepat pada akhir kelas. Dan di sini kita benar-benar digunakan malloc untuk kali kedua. Kerana kali pertama kita menggunakannya untuk mewujudkan RAM cukup, memperuntukkan RAM cukup untuk menyimpan rentetan. Kali ini Binky disimpan ia mudah. Jadi ia hanya untuk menyimpan int an, nampaknya. Dan yang benar-benar baik. Ia adalah sedikit pelik, terus-terang, untuk menggunakan malloc untuk memperuntukkan satu int. Tetapi titik claymation Nick adalah benar-benar hanya menceritakan kisah apa berlaku atau tidak berlaku apabila anda menganiaya ingatan. Jadi dalam kes ini, program ini melakukan beberapa perkara. Dalam kes pertama di sini, ia mengisytiharkan penunjuk yang dipanggil x untuk int an. Ia kemudian mengisytiharkan penunjuk y dipanggil untuk int an. Ia kemudiannya menyimpan dalam x, apa? Orang lain sekarang. Apa yang akan disimpan di dalam x mengikut barisan ketiga program ini? PENONTON: [didengar]. SPEAKER 1: Nah, tidak cukup bait, setiap katakan. Lebih tepat sekarang. Apa yang akan disimpan di dalam x? Alamat, saya fikir saya mendengar ia. Jadi apakah malloc kembali? malloc behaviorally memperuntukkan sebahagian memori. Tetapi bagaimana ia memberi anda akses kepada ia? Ia akan kembali apa? Alamat bait yang pertama dalam sebahagian memori. Sekarang, ini adalah mudah super. Ia hanya satu bait, yang bermaksud menangani kita saling adalah alamat segala-galanya. Jadi yang disimpan di dalam x kemudian, adalah alamat itu sebahagian memori. Sementara itu, apa yang berlaku seterusnya? Jadi sebenarnya, mari kita pergi ke hadapan dan cepat menarik keluar sebenar ini. Jadi, jika kita pergi ke skrin di sini dan kita bermain keluar ini int * x dan int * y akan melakukan apa untuk saya? Saya mendakwa bahawa ia hanya akan melakukan sesuatu seperti ini dan memanggilnya x, dan ini dan memanggilnya y. Sementara itu, barisan ketiga kod adalah akan memperuntukkan saiz int an, yang berlaku kepada - maaf jika saya katakan satu sebelum saya maksudkan satu int - empat bait pada komputer biasa. Sekurang-kurangnya dengan perkakas CS50. Jadi ini akan memperuntukkan ia, siapa tahu? Suatu tempat di sini. Dan ini disimpan di beberapa alamat Ox, siapa tahu? Tetapi apa yang berlaku untuk mendapatkan kembali adalah alamat itu. Tetapi kita akan menarik ini bergambar sebagai hanya anak panah seperti itu. Sekarang di baris berikutnya * x mendapat 42. Apakah * x bermakna dari segi orang biasa itu? Hanya pergi ke sana. Pergi ke alamat itu. Atau dalam erti kata lain, ikut arrow dan meletakkan 42 di sana. Tetapi sesuatu yang buruk berlaku untuk Binky, bukan? Ingat garis yang lima di sini, * y mendapat 13, memang nombor malang, melakukan apa untuk kita? Nah, * y cara pergi ke sana. Nah, ini tidak diberi nilai lagi, betul? Kod ini tidak mempunyai y menjadi dimulakan apa-apa. Kami x yang dimulakan untuk alamat. Tetapi y telah diisytiharkan top up. Tetapi koma bertitik, tiada nilai sebenarnya meletakkan di dalamnya. Jadi ia adil untuk memanggil ini nilai sampah. Siapa tahu apa yang ada? Ia adalah sisa-sisa bit yang digunakan oleh beberapa baris sebelumnya kod dalam program saya. Jadi, jika saya katakan pergi ke sana, ini adalah seperti, Saya tidak tahu di mana anak panah ini adalah akan berakhir. Dan itulah apabila anda biasanya mendapatkan kesalahan segmentasi. Jika anda secara tidak sengaja dereference, jadi untuk bercakap, atau pergi ke alamat yang tidak sebenarnya adalah alamat yang sah, perkara-perkara buruk berlaku. Dan itulah apa yang berlaku untuk berfikir Binky. Jadi ingat bahawa cerita yang Nick adalah memberitahu di sini adalah idea yang sama seperti apa yang Saya tertarik dengan ilusi kapur di atas kapal di sana. X dan y diisytiharkan. Kemudian kami diperuntukkan saiz an int dan disimpan dalam x. Kemudian baris seterusnya yang kita lakukan * x. Ini adalah tongkat sakti Nick daripada penyahrujukan. Yang meletakkan 42 dalam memori dinyatakan oleh x. Tetapi ini adalah di mana perkara-perkara pergi teruk salah. Betul? Kami cuba untuk y dereference. Tetapi y mempunyai beberapa nilai palsu, betul? Arrow yang di bahagian bawah sebelah kiri sudut, tidak sebenarnya menunjuk kepada apa-apa. Ia adalah jenis melakukan apa yang saya lakukan di sini di atas kapal. Jadi perkara-perkara buruk berlaku, segmentasi bersalah atau Binky bersalah, dalam kes ini. Tetapi jika kita kemudian menetapkan bahawa dengan melakukan x mendapat y bagaimana perubahan cerita? Nah, jika saya x mendapat y, itu berkesan yang sama sebagai berkata apa ini, Ox-sesuatu akan menjadi yang sama di sini, Ox-sesuatu. Atau bergambar kami akan menarik anak panah. Jadi di sini pada papan permainan dengan Binky, dengan baris seterusnya kod, * y bermakna pergi ke sana. Di mana ada? Ini bermakna di sini. Dan apabila kita kini bahawa untuk menjadi 13 ia hanya melibatkan berterusan dan menulis 13 di sini sekarang. Jadi mungkin tidak sepenuhnya mudah pada pandangan pertama. Tetapi untuk menggulung dan menggunakan istilah yang sama Binky yang telah menggunakan di sini, jadi dua pertama memperuntukkan petunjuk, x dan y, tetapi tidak pointees. Dan pointees bukan umumnya digunakan panjang. Tetapi penunjuk benar-benar adalah. Tetapi ia adalah apa yang sedang berkata di dalam tatanama Binky ini. Ini sejajar akan datang, sudah tentu, memperuntukkan pointee int. Jadi sebahagian memori - seperti yang saya menarik lebih pada sebelah kanan ada - dan set x sama dengan menunjukkan kepadanya. Ini dereferences x untuk menyimpan 42 memori yang ia menghala ke arah. Dan kemudian ini, sudah tentu, adalah satu perkara yang buruk. Kerana y tidak menunjuk pada apa-apa lagi. Ini membetulkan ia. Jadi ini adalah masih program kereta. Hanya kerana kita sedang bertiup melalui baris demi baris kod dan berkata, oh baik, biarkan ia kemalangan di sana. Itu satu perkara yang buruk. Kemungkinan adalah program yang hanya akan membatalkan sama sekali di garisan itu. Tetapi jika anda adalah untuk menghapuskan terhempas beratur dan menggantikannya dengan dua lepas garis-garis di sana anda menetapkan - menggunakan tugasan penunjuk - y untuk menunjukkan x sebagai titik t. Dan kemudian anda dereference y dengan cara yang sangat selamat. Oleh itu, bagaimana ini meninggalkan kami? Nah, ternyata bahawa di bawah hud di perpustakaan CS50, petunjuk adalah digunakan di seluruh. Dan kita sebenarnya akan mula mengupas kembali lapisan yang tidak lama lagi. Tetapi ternyata juga, suatu ungkapan yang sebahagian daripada anda mungkin biasa dengan, terutamanya mereka yang lebih selesa, sebenarnya adalah bahawa sangat popular laman web, atau limpahan timbunan, hari ini. Tetapi ini sebenarnya mempunyai sangat makna teknikal. Sekarang kita tahu apa timbunan adalah. Ia seperti timbunan dulang di dalam dewan makan. Atau di dalam komputer anda ingatan orang-orang bingkai yang digunakan oleh fungsi. Nah, ternyata bahawa kerana itu pelaksanaan yang sangat mudah memori dan bingkai pada apa yang dipanggil timbunan, anda sebenarnya boleh mengawal sistem komputer agak mudah. Anda boleh hack ke dalam sistem jika orang seperti kita telah tidak ditulis kod kami terutamanya dengan baik. Jika orang-orang seperti kita menggunakan ketulan memori atau penggunaan array - lebih biasa - tetapi kadang-kadang lupa untuk memeriksa sempadan pelbagai kami kerana anda mungkin mempunyai diri anda kadang-kadang, dan terlelar terlalu jauh lepas akhir array. Dalam kes ini, program anda hanya mungkin kemalangan. Segmentasi kesalahan, jenis memalukan. Tidak besar, tetapi ia tidak semestinya satu perkara yang sangat buruk. Tetapi jika program anda sebenarnya pada sebenar komputer pengguna ', jika ia berjalan di laman web bahawa orang-orang rawak sebenar di internet yang memukul, membiarkan orang mendorong perkara-perkara buruk pada kod anda adalah amnya tidak satu perkara yang baik kerana ia bermakna peluang untuk mengambil kawalan komputer. Dan ini akan kelihatan sedikit samar. Tetapi saya fikir saya akan menakutkan anda dengan contoh terakhir ini di sini. Ini adalah contoh kod. Dan ada Wikipedia baik artikel yang berjalan melalui ini dengan lebih terperinci. Saya mempunyai utama di bawah panggilan foo, lulus dalam argv daripada 1. Dan itu hanya supaya anda boleh menjalankan program dan lulus input sewenang-wenangnya. Dan kemudian foo diisytiharkan top up seperti menerima tali, atau lebih tepat, a * char. Ia kemudian mengisytiharkan pelbagai aksara. Memanggilnya penampan lebih amnya, saiz 12. Jadi 12 aksara boleh dimuatkan di dalam array yang dipanggil c. Dan kemudian ia menggunakan fungsi baru ini, yang baru tetapi tidak sukar untuk memahami, salinan ingatan. Ia salinan ingatan dari bar, yang merupakan n lalu berubah-ubah, apa jua pengguna ditaip ke argv 1 ke dalam c. Berapa banyak bait? Panjang rentetan bar. Jadi, dalam erti kata lain, jika jenis pengguna dalam h-e-l-l-o masuk, panjang rentetan daripada hello ialah lima. Jadi lima daripada bait akan mendapat disalin ke dalam pelbagai yang dipanggil c, yang adalah saiz 12. Tetapi apa jenis pengguna dalam yang lebih lama perkataan itu adalah 13 huruf atau 14 watak atau 100 aksara atau lebih? Di mana mereka akan pergi? Nah, rangka itu, bahawa dulang dalam timbunan makan-dewan, mereka akan pergi ke sana. Dan ia hanya akan mula penggantian barangan lain yang sudah pada timbunan itu, melimpah timbunan, jadi untuk bercakap. Jadi bergambar, berfikir dengan cara ini. Ini adalah versi yang berwarna-warni gambar kita telah melukis. Di bahagian bawah, katakan, adalah utama. Dan di atas, apa yang anda lihat sekarang adalah bingkai, kod warna sekarang, untuk fungsi dipanggil foo. Tetapi apa yang menarik di sini kira-kira foo adalah bahawa di sini adalah bingkai. Jadi ia disediakan seperti saya lakukan tetapi dalam berwarna biru muda. Dan sekarang ini adalah di mana c kurungan 0 pergi. Dan ini adalah di mana c kurungan 11 akan berakhir. Dalam erti kata lain, ia berlaku digambarkan sebagai segiempat. Tetapi jika anda hanya menyimpan plopping bytes bawah - atau aksara - mereka akan berakhir up di lokasi 0 sepanjang jalan sehingga 11 kerana ia 0 diindeks. Tetapi di mana adalah watak-13 akan berakhir? Di mana ke-14? Di mana watak-50 akan berakhir? Ia akan terus pergi ke bawah. Kerana walaupun kita telah dilukis gambar dengan timbunan yang semakin meningkat naik, alamat, ternyata, pergi dari alamat kecil, kecil petunjuk, ke alamat yang besar. Jadi ia hanya menyimpan naik dan ke atas. Jadi, jika jenis pengguna dalam hello, yang hebat. Tiada bug, tidak ada masalah, selamat semua orang. Tetapi jika jenis pengguna dalam apa yang kita akan panggil kod pertentangan, yang diwakili umum sebagai, serangan, serangan, serangan, serangan, apa yang boleh berlaku? Nah, jika semua input pengguna yang ditaip tidak hanya beberapa mesra atau tali serangan watak. Ia sebenarnya satu jujukan aksara bahawa jika anda disusun itu, ia sebenarnya adalah kod. Mungkin ia adalah kod yang memadam semua fail pada cakera keras anda atau menghantar spam atau sesuatu seperti itu. Perhatikan bahawa apa yang penting di sini ialah bahawa jika seorang lelaki yang buruk mendapat cukup bertuah kerana menulis semula sebahagian merah memori - yang saya tidak menarik pada gambar saya tetapi gambar Wikipedia ini di sini telah - alamat kembali dipanggil itu. Apabila pulangan makanan, apabila swap penyata, bagaimana komputer tahu untuk pergi dari di sini untuk turun di sini? Atau dalam segmen teknologi sehingga di atas, bagaimana ia tahu untuk pergi dari swap kod - 0 yang dan 1 yang mengarang swap - kembali ke utama? Ada satu alamat kembali yang dipanggil disimpan dalam bingkai tindanan yang sama, pada dulang kafeteria sama. Jadi, jika seorang lelaki yang buruk adalah cukup bijak untuk meletakkan kod serangan, kod serangan, serangan kod, dan mendapatkan cukup bertuah - sering melalui percubaan dan kesilapan - untuk menulis bahawa alamat kembali merah, dengan alamat dan notis bahagian paling atas. Notis 0835C080. Ia ditulis belakang top up untuk sebab kita mungkin akan mengkaji semula. Ini adalah nombor itu. Jadi, jika lelaki yang buruk mendapat cukup bertuah atau cukup bijak untuk menulis ganti merah jalur memori dengan alamat kod yang dia mempunyai entah bagaimana disuntik ke dalam komputer anda, rasa yang kod akan dikembalikan kepada secepat foo dilakukan melaksanakan? Kod lelaki yang tidak baik itu. Jadi kod serangan ini, AAA, sekali lagi, mungkin menghantar spam, mungkin memadam semua fail pada pemacu keras anda. Tetapi itu adalah apa yang benar-benar limpahan timbunan adalah, atau ditakluki penimbal, atau penampan serangan melimpah. Dan ia adalah sangat, sangat biasa hingga ke hari ini dengan program-program yang ditulis dalam C, C + +, dan juga beberapa bahasa lain. Pada nota yang menakutkan, kami akan berakhir dengan jenaka. [Ketawa] Jumpa anda pada hari Rabu. Pada CS50 seterusnya - Jadi saya semua keluar lampu cakera hari ini tetapi tunggu, lemak susu, separuh telefon buku, jus oren yang saya minum hari ini. Kabel USB, kunci a. [Bermain muzik]