[Powered by Google Translate] [Week 4, Sambungan] [David J. Malan - Universiti Harvard] [Ini adalah CS50. - CS50.TV] Ini adalah CS50, dan ini adalah akhir 4 minggu. Jadi beberapa berita baik dan ada berita buruk. Tiada kuliah pada hari Isnin, tiada masalah menetapkan minggu depan. [Pelajar bersorak] Anda tidak akan suka di mana ini akan. Tetapi kita tidak mempunyai ini bukan Rabu depan, dan terdapat juga satu sukatan pelajaran 1 Jumaat kuliah Jumaat depan supaya kita boleh tinggal di landasan yang betul. Tetapi segala-galanya akan difilemkan seperti biasa, jadi tidak perlu bimbang. Dan berkenaan dengan kuiz 0 apa yang kita akan lakukan ke arah hujung minggu pos di cs50.net laman web kursus penjelasan apa jenis jangkaan anda perlu mempunyai apabila ia datang kepada kuiz yang pertama. Secara umum, ia akan menjadi pilihan berganda, benar-palsu, jawapan pendek, pendek pengekodan masalah. Anda tidak akan dijangka untuk melaksanakan bersamaan masalah yang anda akan lihat di pset satu, yang mana anda mempunyai sebuah komputer dan penyahpepijat dan sebagainya, tetapi akan ada kecil pengekodan masalah. Dan sesungguhnya, panduan terbaik untuk mendapatkan rasa apa yang CS50 kuiz adalah seperti pergi ke cs50.net, pergi ke link Kuiz, dan anda boleh lihat beberapa tahun yang lalu bernilai kuiz. Hanya sedar bahawa kurikulum tidak sentiasa sama sejak bertahun-tahun. Kadang-kadang kita menambah, kadang-kadang tolak, jadi jika anda melihat beberapa topik di salah satu daripada orang-orang tua kuiz bahawa anda tidak mempunyai idea apa yang ia bercakap tentang, ia adalah sama ada yang kita tidak menutupinya atau bahawa kita tidak menutupinya. Tetapi dalam bentuk ulasan, Ahad ini, Isnin, dan Selasa serta seluruh kursus-ulasan sesi pada malam Ahad - masa dan lokasi akan diumumkan pada halaman utama kursus - anda semua mempunyai peluang untuk mengkaji dengan felo pengajaran kursus bahan bagi tahun ini, kedua-dua dalam seksyen dan sebagai kelas penuh, dan mereka akan difilemkan seperti biasa juga. Semua hak. Jadi, tanpa berlengah-lengah lagi, satu komen pada pas / gagal dan menambah / menggugurkan. Anda mungkin telah melihat nota saya malam tadi, dan ini adalah benar-benar hanya beberapa jaminan tambahan bahawa jika anda berada di kalangan orang-orang yang kurang selesa atau di suatu tempat di antara dan anda rasa hanya sedikit di atas kepala anda, menyedari bahawa memang agak biasa, dan terdapat struktur sokongan yang mencukupi di tempat, salah satu yang waktu pejabat adalah niat untuk memperbaiki semua lebih setiap malam lepas e-mel saya, dan menyedari juga bahawa pilihan seperti pas / gagal untuk kelas seperti ini benar-benar dimaksudkan sebagai mekanisme untuk mengambil kelebihan luar kursus seperti ini, supaya sekali lagi jika anda menghabiskan masa mereka 10, 15, 20 jam hanya cuba untuk mendapatkan beberapa pset untuk bekerja dan anda tahu anda 90-95% cara di sana tetapi anda tidak boleh menemui beberapa pepijat sialan, dalam pas / gagal model yang jenis okay. Idea ini adalah bahawa dengan mekanisme itu maka anda boleh pergi tumpuan pada psets anda yang lain atau tidur atau apa sahaja ia adalah yang anda mahu memberi tumpuan kepada. Jadi, menyedari bahawa anda mempunyai sehingga ini Selasa akan datang - teknikal 5th Isnin, tetapi ia adalah hari cuti, jadi ini hari selasa - untuk beralih dari pas / gagal untuk gred atau sebaliknya. Dan jika anda benar-benar pada jurang dan ingin menjatuhkan sama sekali, sila menangkap saya selepas kuliah atau menggugurkan saya nota. Kami suka untuk sembang sekurang-kurangnya sebelum anda tawaran kata perpisahan. Semua hak. Jadi kita mula mengambil roda latihan off kali terakhir. Secara khususnya, kami memberi tumpuan pada tali. Rentetan adalah sesuatu yang diisytiharkan di perpustakaan CS50, khusus dalam fail yang dipanggil cs50.h yang kita akan mula kelihatan pada minggu ini dan seterusnya. Tetapi rentetan adalah benar-benar hanya pemudahan sesuatu itulah sedikit lebih arcanely digambarkan sebagai * char. Char kita sudah biasa dengan. Ia hanya watak tunggal. Tetapi * Isnin ditandakan apa? >> [Pelajar] penunjuk A. Penunjuk. Dan apa yang penunjuk? >> [Pelajar] address. Ia seperti alamat, lokasi dalam ingatan. Apa alamat atau lokasi atau memori? Sekali lagi, kita semua mempunyai komputer riba dengan persembahan atau 2 Gigabyte RAM kemungkinan besar hari ini, dan ini bermakna anda mempunyai bilion atau 2 bilion bytes bernilai ingatan. Dan ia tidak benar-benar perkara apa yang secara fizikal kelihatan seperti, tetapi mengambil iman yang anda boleh bilangannya semua bait individu bahawa komputer riba anda sendiri mempunyai - ini adalah bait 0, ini adalah bait 1, ini adalah bait 2000000000 - dan itulah apa yang dilakukan oleh komputer. Apabila anda memperuntukkan ruang untuk watak tunggal, misalnya, ia jelas mempunyai hidup di suatu tempat di dalam memori komputer anda, dan mungkin ia adalah di beberapa bait 12345, dan itulah tempat di sini di dalam memori komputer anda. Dan alamat maka watak itu adalah 12345. Kini, 0 minggu melalui kini setakat, kita tidak benar-benar dijaga di mana dalam perkara-perkara memori disimpan kerana kita biasanya menggunakan simbol, pembolehubah, dan array untuk benar-benar mendapat sekurang-data kami. Tetapi seperti Isnin dan semua lebih hari ini, anda kini akan mempunyai semua keupayaan yang lebih ekspresif dengan program-program bertulis untuk benar-benar memanipulasi memori komputer tetapi anda lihat patut, bagi kedua-dua tujuan yang baik dan buruk, pepijat menjadi hasil yang sangat biasa pada ketika ini dalam pembelajaran barangan ini. Tetapi apakah ia benar-benar bermakna untuk menjadi * char? Mari pergi ke hadapan kembali ke - dan kita akan kembali Binky seperti yang dijanjikan hari ini. Mari kita pergi ke contoh yang mudah di sini. Biar saya menyelamatkan fail ini sebagai compare.c, dan biarlah saya hanya mendapat beberapa kod template sini begitu termasuk stdio.h, izinkan saya juga memberi diri saya termasuk cs50.h. Saya akan mengezum masuk di sana. Biar saya mulakan menulis int utama, utama (tidak sah), dan sekarang saya mahu melakukan sesuatu seperti ini: printf ("Berikan saya rentetan:") dan kemudian saya akan menggunakan s rentetan mendapat GetString untuk mendapatkan rentetan daripada pengguna, maka saya akan meminta pengguna untuk satu lagi. ("Berikan saya satu lagi rentetan:") dan saya akan bertanya kepada mereka melalui GetString untuk mendapatkan. Saya akan memanggilnya t kerana t datang selepas s dan s adalah nama yang bagus untuk rentetan jika ia agak generik. Jadi GetString, dan sekarang saya hanya mahu melakukan pemeriksaan kewarasan dan saya akan katakan jika (s == t) dan kemudian saya hanya akan memberitahu pengguna printf ("Anda ditaip perkara yang sama \ n!"); lain saya akan mencetak keluar sesuatu seperti ("Anda ditaip sesuatu yang berbeza! \ n") atau apa-apa hukuman akan menjadi. Jadi sesuatu seperti itu. Kemudian seperti biasa, saya akan kembali 0 yang hanya menandakan bahawa tiada perkara buruk berlaku, dan saya akan pergi ke hadapan dan menyusun dan menjalankan program ini. Tetapi pada hari Isnin kita berlari program ini, dan sebenarnya diberitahu bahawa HELLO tidak HELLO dan SELAMAT TINGGAL adalah tidak SELAMAT TINGGAL. Tingkah laku yang kita lihat adalah sedikit lebih seperti ini. Biar saya pergi ke dalam direktori sumber saya, zoom di sini, dan mari kita lakukan membuat bandingkan. Disusun okay. Membiarkan saya menjalankan membandingkan. Beri saya rentetan: HELLO. Berikan saya satu lagi rentetan: HELLO. Anda menaip sesuatu yang berbeza! Baiklah, biar saya mencuba sesuatu yang mudah seperti 50, 50. Anda menaip sesuatu yang berbeza! hi, hi. Jadi jelas, sesuatu yang berlaku di sini. Tetapi apa yang adalah penjelasan mengapa? Rupa-rupanya, talian 12 adalah benar-benar berfungsi. Apakah masalah asas di sini? Yeah. >> [Pelajar] Ia membandingkan alamat. Ya, sebenarnya. Ia sebenarnya membandingkan alamat di mana HELLO dan HELLO disimpan. Ia tidak membandingkan huruf HELLO sekali lagi dan sekali lagi, kerana apa yang benar-benar berlaku, semua masa ini kita telah menggunakan GetString - Papan hitam ini sekali lagi memori komputer kita, dan katakan saya panggil GetString selepas mengisytiharkan s berubah-ubah. Apakah ingatan saya kelihatan seperti? Mari kita sewenang-wenangnya mengatakan bahawa s kelihatan seperti ini. Ia adalah persegi. Dan cukup banyak bila-bila masa saya menarik sekeping memori pada skrin jika ia adalah 32-bit saya telah menarik dataran seperti ini kerana sesungguhnya di dalam perkakas, penunjuk, alamat, adalah 32-bit. Ia adalah sama seperti int. Yang boleh berbeza-beza berdasarkan sistem komputer. Orang-orang yang samar-samar biasa dengan hakikat bahawa Mac atau PC anda adalah 64-bit, yang sebenarnya menandakan bahawa komputer anda menggunakan petunjuk 64-bit, Alamat 64-bit, dan di kalangan upsides bahawa komputer anda boleh mempunyai RAM lebih daripada tadi. Cerita panjang pendek, kembali pada hari apabila komputer hanya digunakan 32 bit untuk mewakili alamat, bilangan terbesar bait anda boleh mewakili dalam kes itu adalah apa yang jika anda mempunyai 32 bit? Jadi 4 bilion, kanan, kerana 2 daripada 32 adalah 4 bilion. Nombor ini telah berulang dalam kursus ini. Jadi jika anda hanya mempunyai 32 bit, bilangan tertinggi anda boleh bergantung kepada adalah kira-kira 4 bilion. Tetapi itu adalah had asas komputer sehingga beberapa tahun yang lalu kerana jika anda hanya boleh dikira sebagai tinggi sebagai 4 bilion, ia tidak kira jika anda membeli 8 gigabait RAM atau lebih 5 gigabait RAM; anda tidak boleh mengharapkan yang tinggi, jadi ia adalah sia-sia. Anda hanya boleh mengakses pertama 3 atau 4 gigabait memori komputer anda. Itu kurang daripada satu isu sekarang, dan anda boleh membeli MacBook Pro dan Dells dengan 8 gigabait RAM atau lebih hari ini. Tetapi jika saya memperuntukkan agak hanya dalam program ini penunjuk, penunjuk dipanggil s, ia mungkin kelihatan seperti ini pada skrin kerana sesungguhnya kita perlu mengupas kembali lapisan ini. Saya menyimpan rentetan berkata, tetapi seperti hari Isnin, tali adalah benar-benar * char, alamat beberapa watak. Jadi mari kita mengambil roda latihan luar walaupun kita akan terus menggunakan GetString sekarang. Jadi saya telah diisytiharkan s, dan ini adalah sebahagian memori, 32-bit. Apakah di sini dalam ingatan secara lalai? >> [Sambutan pelajar didengar] Apa itu? >> [Pelajar] Sampah. Sampah. >> Tepat sekali. Jika anda pengaturcara tidak meletakkan nilai dalam pembolehubah, yang tahu apa itu? Kadang-kadang anda mendapatkan bertuah dan ia adalah 0, yang merupakan jenis yang bagus, default nilai bersih, tetapi seperti yang kita lihat hari Isnin, kadang-kadang ia adalah karut lengkap, beberapa benar-benar besar nombor positif atau negatif yang datang dari mana? Yeah. >> [Pelajar] Fungsi sebelum. >> Yeah. Selalunya fungsi yang mendapat dipanggil sebelum ini kerana ingat, kerana anda memanggil fungsi dalam ingatan, mereka mengambil lebih banyak ruang dan lebih dari bawah ke atas, dan secepat pulangan fungsi, memori yang mendapat semula oleh seorang lelaki seterusnya yang mendapat dipanggil, yang menggunakan keping sama anda memori. Dan jika anda telah sampah kiri sana, nilai sebelumnya, kita mungkin kesilapan s sebagai mempunyai nilai tertentu apabila benar-benar kita tidak letakkan apa-apa di sana. Jadi RAM kami pada ketika ini kelihatan seperti ini. Kini di sebelah kanan garis 7 kita memanggil GetString, yang kita telah lakukan sekarang untuk minggu, tetapi apa yang GetString benar-benar melakukan? GetString ditulis oleh kakitangan CS50 adalah sedikit pintar bahawa sebaik sahaja pengguna mula menaip kunci dan hits Masukkan, GetString angka keluar berapa banyak ketukan kekunci melakukan melanda pengguna, berapa banyak watak-watak yang saya perlukan untuk memperuntukkan RAM untuk. Dan di mana RAM yang datang, siapa tahu? Ia adalah tempat di gigabait 2 komputer anda atau barang kecil memori. Tetapi mari kita andaikan bahawa komputer mendapati ruang untuk perkataan HELLO di sini. Perkataan yang saya taipkan adalah H-E-L-L-O. Dan jika kita menarik ini sebagai urutan aksara, kita mungkin menarik seperti ini. Tetapi saya perlu melakukan 1 perkara tambahan. Apa yang dimiliki pada akhir rentetan apa-apa dalam C? Watak batal, yang kita menulis sebagai \ 0. Ia teknikal nombor 0, tetapi backslash membuat semua lebih jelas bahawa ini adalah benar-benar nombor 0, 0 integer; ia tidak, bagi contoh, 0 quote-unquote bahawa anda mungkin menaip di keyboard. Jadi ini adalah HELLO. Dan apa yang kita mengatakan pada hari Isnin bahawa fungsi seperti GetString sebenarnya kembali semua ini minggu? Ia tidak kembali rentetan per se kerana itu tidak benar-benar mempunyai makna kerana rentetan tidak wujud. Mereka jenis fabrikasi di perpustakaan CS50. Apakah benar-benar rentetan, lebih teknikal? >> [Pelajar] Ia adalah watak pertama. Tepat sekali. Ia agak hanya alamat aksara pertama yang pengguna ditaip masuk Jadi, jika kata-kata saya HELLO berakhir sehingga ia di 123 bilangan bait dan kemudian di beberapa bait 124, 125, 126, dan sebagainya, jika saya hanya beberapa bait saya dari 0 sehingga, apa yang benar-benar GetString kembali literal nombor 123. Jadi apa yang mendapat dimasukkan ke dalam s adalah 123 nombor, bukan huruf H, bukan perkataan HELLO, cukup sekadar alamat di mana saya boleh mencari huruf pertama HELLO. Tetapi itu tidak kelihatan seperti cukup. Saya meminta anda untuk rentetan, bukan watak. Jadi bagaimana kita atau komputer tahu bahawa ello jenis yang datang bersama-sama dengan H? Apakah jenis perjanjian kita? Yeah. [Pelajar] Ia terus memberitahu dirinya untuk mencari beberapa lebih aksara. >> Tepat sekali. Ada konvensyen ini manusia-komputer di mana apabila anda berurusan dengan rentetan, atau dikenali sekarang sebagai bintang char, anda hanya perlu memikirkan mana akhir rentetan setiap dalam kehidupan adalah dengan benar-benar hanya iterating atasnya dengan bagi gelung, gelung sementara, apa sahaja, supaya apabila anda mencari hujung tali kini anda boleh membuat kesimpulan daripada itu, oh, perkataan penuh HELLO. Orang-orang dengan pengalaman pengaturcaraan terlebih dahulu mungkin tahu di Jawa anda hanya boleh memanggil panjang dan dalam bahasa lain, anda boleh memanggil panjang atau serupa. Ini kerana dalam banyak bahasa, terutama perkara-perkara yang dipanggil bahasa berorientasi objek, panjang sesuatu adalah jenis dalam terkandung sekeping data itu sendiri, lebih suka kita terkandung ID dan nama dan rumah-rumah di dalam pelajar pada hari Isnin. Tetapi C adalah tahap yang lebih rendah. Tiada objek atau kelas, jika anda pernah mendengar istilah sebelum. Apa yang anda perlu benar-benar adalah alamat-alamat ingatan. Jadi ini adalah sejenis cara lama mewakili menarik struktur data. Anda mempunyai nilai permulaan seperti alamat watak pertama dan kemudian hanya beberapa konvensyen sewenang-wenangnya bahawa semua orang bersetuju untuk diikuti. Jadi bagaimana panjang rentetan dilaksanakan, adakah kami mencadangkan? Strlen, strlen, yang sesetengah daripada anda kini telah digunakan beberapa kali. Ia agak mudah, bukan? Ia seperti 2 baris kod. Ia cukup banyak gelung untuk beberapa jenis, mungkin dengan pembolehubah tempatan tambahan. Tetapi strlen hanya untuk mengambil penunjuk dan kemudian mula mencari \ 0. Dan sebaik sahaja ia mendapati ia, ia boleh kembali jumlah langkah-langkah yang diambil dalam rentetan itu. Jadi, kita boleh membuat kesimpulan daripada ini apa yang berlaku di depan. Katakan kemudian Saya mengaku t seperti yang saya lakukan di baris 10. Ini adalah beberapa nilai sampah. Siapa tahu pada mulanya? Tetapi di sebelah kanan garis 10 Saya memanggil GetString lagi. Siapa tahu di mana ini berakhir? Mari kita sewenang-wenangnya mengatakan bahawa sistem operasi mendapati bilik untuk cara di sini. Saya berlaku untuk kebetulan menaip H-E-L-L-O lagi, dan sebagainya kita boleh menarik jenis yang sama gambar. Tetapi hakikat bahawa saya telah dilakar semula gambar ini adalah sengaja kerana itu adalah berbeza HELLO daripada yang satu ini. Jadi di sini ini mungkin menjadi lokasi 456, ini adalah 457, dan sebagainya. Jadi apa yang mendapat dimasukkan ke mana tanda tanya sekali? Dalam kes ini 456. Kami memilih nombor-nombor sewenang-wenangnya kerana benar-benar selepas hari ini kita tidak akan peduli begitu banyak tentang apa yang alamat apa-apa. Semua yang kita mengambil berat tentang adalah bahawa kita boleh memikirkan alamat sekeping beberapa data seperti HELLO. Jadi benar-benar apa yang kebanyakan orang lakukan dalam bidang sains komputer apabila bercakap tentang alamat-alamat ingatan dan bercakap mengenai petunjuk khusus, bukannya bersusah payah memikirkan 123 - yang peduli di mana barangan ini sebenarnya adalah, kita hanya tahu bahawa ia adalah di alamat beberapa berangka - kita memudahkan dunia dan hanya mengatakan bahawa s menunjuk kepada watak yang dan t menunjuk kepada watak itu. Dan hakikat bahawa ia adalah anak panah adalah agak sengaja kerana harfiah kini s menunjuk di H dan t menunjuk di H lain kerana pada akhir hari, ia tidak kira apa alamat, tetapi ia tidak perkara yang kita mempunyai keupayaan untuk meluahkan alamat itu dengan sekeping beberapa kod. Kita tidak benar-benar dimanipulasi alamat ini sahaja lagi jadi kita akan melihat di mana kita boleh mencelah dan menyusun melakukan perkara-perkara dengan petunjuk, tetapi untuk sekarang sejajar 12 literal apakah nilai-nilai yang kita membandingkan mengikut cerita ini dalam 12 baris? Kami mengatakan adalah 123 sama sama kepada 456? Dan yang pasti tidak berlaku. Dan walaupun konsepnya, penunjuk ini pastinya tidak sama seperti ini kerana anda dipanggil GetString dua kali, dan GetString tidak cuba untuk menjadi super bijak, ia tidak cuba untuk sedar, oh, anda taip HELLO 5 minit yang lalu; biarlah saya memberikan anda penunjuk yang sama kerana saya memberikan anda sebelum, ia hanya memperuntukkan sebahagian memori yang baru setiap kali anda memanggilnya. Jadi bagaimana kita menyelesaikan masalah ini? Jika tahap yang lebih tinggi, saya mahu membandingkan tali HELLO dan HELLO - Saya tidak peduli tentang petunjuk - bagaimana saya boleh pergi tentang menjawab soalan, pengguna menaip perkara yang sama? Apa yang perlu di sini? Yeah. [Pelajar] Gunakan fungsi. >> Saya boleh menggunakan fungsi keluar dari kotak. Saya boleh menggunakan fungsi dipanggil strcmp, s-t-r-c-m p, hanya versi singkatan berkata rentetan bandingkan. Dan jika kita pergi ke, misalnya, bandingkan 2, yang merupakan antara pemberian hari ini, Saya lakukan betul-betul itu. Saya terus segala-galanya yang sama dari baris 1 ke 26 atau jadi, dan kini melihat bahagian ini telah berubah hanya sedikit. Mari kita mengabaikan garis 28 untuk seketika dan memberi tumpuan hanya pada yang satu ini. Apa yang kita katakan Isnin yang membandingkan str tidak? Ia mengendalikan proses mengambil 2 petunjuk, s dan t dalam kes ini, jenis hampir meletakkan jari pada mereka 2 huruf, dan apa yang ia perlu lakukan adalah sesuatu seperti gelung sementara atau untuk gelung, dan ia mengatakan ini sama? Jika ya, ia menggerakkan jari atau petunjuk ke hadapan. Adakah ini yang sama, sama, ini, sama ini sama, ini sama? Dan aduh, saya pada akhir tali di kedua-dua s dan t. Saya tidak menemui sebarang percanggahan. Ya, ini adalah rentetan yang sama. Dan apakah str membandingkan pulangan jika 2 rentetan adalah sama, nampaknya? Sifar. Jadi 0 adalah baik dalam kes ini kerana jika ia mengembalikan -1 atau +1, yang bermaksud bahawa s hanya berlaku untuk datang sebelum t abjad atau selepas t. Dan mengapa yang akan berguna untuk mempunyai fungsi yang memberitahu anda yang rentetan datang sebelum atau selepas dalam kamus? [Pelajar] Mencari. >> Mencari dan sorting. Jadi, anda boleh melakukan perkara-perkara seperti carian binari atau apapun gelembung atau bergabung apapun di mana anda perlu membandingkan perkara. Setakat ini kita telah jenis memotong beberapa sudut dan hanya bercakap tentang sorting dalam konteks nombor kerana ia adalah bagus dan mudah untuk bercakap tentang, tetapi anda pasti boleh membandingkan tali, epal dan pisang, kerana jika epal dikenali untuk datang sebelum pisang, sama, anda boleh bergerak rentetan sekitar dalam ingatan seperti Rob lakukan dengan apapun merge dalam video dan kita lakukan di sini di atas pentas dengan apapun pemilihan, jenis kemasukan, dan apapun gelembung. Jadi di mana lagi kita boleh mengambil ini? Mari kita cuba ini. Apapun mari kita lupa bahawa pelajaran untuk seketika dan cuba sekarang dan menyalin 1.c untuk melakukan perkara berikut. Dalam baris 21 saya mengatakan sesuatu cetak, maka saya mendapat rentetan daripada pengguna, maka saya memeriksa ini. Kami telah tidak benar-benar mendapat ke tabiat ini lagi, tetapi mari kita kini melakukan ini. Mari kita sebenarnya mengupas kembali lapisan ini. Ini adalah benar-benar char *. Lelaki ini adalah benar-benar char *. Jadi apakah maknanya untuk memeriksa jika s == NULL? Ia ternyata bahawa apabila anda memanggil fungsi seperti GetString atau lebih umumnya hanya meminta komputer untuk memberi anda beberapa memori, sesuatu yang boleh pergi salah. Anda boleh menjadi gila dan meminta komputer untuk terabyte memori dengan meminta trilion bait memori yang hanya tidak wujud dalam komputer, tetapi fungsi GetString dan lain-lain perlu beberapa cara menjerit pada anda jika anda telah diminta untuk terlalu banyak. Dan cara GetString melakukan ini jika anda telah diminta untuk memori yang lebih daripada yang terdapat dalam komputer, walaupun itulah super, kebarangkalian rendah super kerana tiada seorang pun daripada kami akan menaip satu trilion watak dan kemudian tekan Enter, tetapi kebarangkalian rendah walaupun ia mungkin, saya masih mahu untuk memeriksa ia hanya dalam kes, dan nilai khas yang GetString, jawapan, dan fungsi-fungsi lain pulangan jika sesuatu yang telah silapnya adalah NULL dalam semua topi. Dan apakah NULL? NULL hanya kebetulan untuk mewakili penunjuk. Ia adalah alamat 0 memori. Dunia memutuskan bahawa sewenang-wenangnya, jika ini adalah memori komputer saya - anda tahu apa? - kita pergi untuk mencuri hanya 1 bait memori setiap komputer, dan ini adalah lokasi 0. Kami akan memberikan ia nama samaran NULL, dan kita akan menjanjikan bahawa kita sebenarnya tidak akan meletakkan data sebenar di sana kerana kita hanya sewenang-wenangnya perlu nilai khas, 0, NULL aka, supaya kita boleh menjerit pada pengguna jika sesuatu berlaku. Jika tidak, anda mungkin tidak tahu tidak 0 bermakna meletakkan sesuatu di sini atau adakah ia bermakna sesuatu silapnya? Kami mempunyai semua bersetuju bahawa tiada apa-apa jua cara NULL telah dipulangkan, tiada alamat sebenar telah dipulangkan. Sekarang, di sini saya hanya mengguna pakai konvensyen manusia saya saya kembali 1 daripada utama jika sesuatu berlaku. Itu kerana konvensyen pulangan utama adalah untuk kembali 0 jika baik, 1 atau beberapa nilai lain jika buruk. Tetapi GetString dan apa-apa fungsi yang berurusan pulangan memori NULL jika sesuatu yang buruk. Okay. Jadi malangnya, line 27, super mudah walaupun ia adalah, sepenuhnya gagal untuk menyalin rentetan. Mengapa? Kita boleh melihat ini seperti berikut. Saya menuntut dalam 27 baris untuk membuat salinan s dan memanggil ia t. Jadi, saya tidak meminta pengguna untuk 2 rentetan masa ini, saya hanya mengatakan nilai dalam s harus diletakkan di t juga. Jadi sekarang hanya untuk menunjukkan betapa patah ini, sejajar 29 seterusnya apa yang saya lakukan? Pertama saya memeriksa jika panjang t adalah lebih besar daripada 0. Terdapat beberapa rentetan sana. Pengguna menaip sesuatu masuk Apakah garis 32 lakukan, nampaknya? [Pelajar tindak balas didengar] >> Hak. Anda jenis boleh membuat kesimpulan dari apa yang saya katakan ia melakukan. Tetapi dari segi teknikal, apa ini lakukan? t [0] mewakili apa? [Pelajar] Watak 0. >> [Malan] Watak 0. Atau, lebih seperti manusia, watak pertama dalam t, apa sahaja yang, H mungkin dalam kes ini. Dan toupper melakukan apa yang ia berkata. Ia capitalizes watak 0 t dan ia mengubah ia. Jadi ini bermakna mengambil watak 0 t, membuat ia huruf besar, dan meletakkannya kembali di lokasi yang sama. Jadi jika saya menaip hello dalam huruf kecil, ini perlu mengubah h huruf kecil untuk H. modal Tetapi masalahnya ialah bahawa dalam baris 35 dan 36 apa yang saya kira-kira untuk melakukan adalah mencetak untuk kita s dan t. Dan apa yang firasat anda? Apa yang saya benar-benar akan melihat jika saya taip dalam hello dalam huruf kecil semua? Apa yang berlaku untuk mendapatkan dicetak? >> [Sambutan pelajar didengar] >> Apa itu? [Pelajar] Big H dan selebihnya kecil. >> H besar dan selebihnya kecil yang, s atau t? [Pelajar] Kedua-dua. >> Kedua-dua. Tepat sekali. Jadi mari kita lihat apa yang berlaku di sini. Biar saya pergi ke hadapan dan menyusun ini. Ini adalah copy1, jadi membuat copy1. Semua hak. Zum masuk Biar saya pergi ke hadapan dan menjalankan copy1, Masukkan, Katakanlah (wahai Muhammad) sesuatu: hello dalam huruf kecil. Ia dipermodalkan salinan, tetapi ia nampaknya dipermodalkan asal serta, kerana apa yang kini berlaku dalam cerita ini? Dalam baris 27 saya tidak benar-benar seolah-olah menyalin rentetan, tetapi walaupun anda mungkin telah intuitif berharap bahawa kes itu, jika anda berfikir tentang gambar ini, apa yang benar-benar telah saya lakukan? Separuh daripada gambar adalah sama. Jadi mari kita melancarkan kembali ke masa supaya t tidak lagi wujud dalam cerita. S boleh wujud dalam cerita, tetapi mari huruf kecil hello masa ini. Jadi biarlah saya menetapkan apa yang saya sebenarnya ditaip masuk Dalam kes ini di sini kita mempunyai h-e-l-l-o. Kami akan menarik sebagai urutan aksara, meletakkan garis pemisah saya di sini dan 0 \ saya. Jadi ini adalah di mana kita berada secepat baris 1 melalui 24-ish, memberikan atau mengambil, telah dilaksanakan. Ini adalah gambar ingatan saya. Apabila saya mendapat kepada 27 baris, apa yang berlaku? Sama seperti sebelum ini, saya mendapat penunjuk, yang saya akan menarik sebagai dataran ini. Ia dipanggil t. Dan apa nilai secara lalai? Siapa tahu? Beberapa nilai sampah. Jadi, saya akan abstrak yang jauh sebagai tanda tanya. Dan secepat sebelah kanan sebanyak 27 baris melaksanakan, apa yang saya meletakkan di dalam t? Perkara yang sama yang dalam s. Jadi jika kita untuk seketika mengeluarkan abstraksi ini anak panah dan kita katakan, oh, ini adalah alamat ingatan beban 123, apabila anda mengatakan t mendapat s, koma bertitik, anda benar-benar meletakkan 123 di sini. Sekarang jika kita jenis memudahkan dunia kita sekali lagi dengan gambar, apa yang anda telah benar-benar dilakukan hanya menambah anak panah lain untuk dunia anda itu menunjuk dari t kepada rentetan yang tepat sama. Jadi, apabila di baris 31 dan 32 saya sebenarnya pergi tentang menukar t [0], apa t [0] nampaknya sinonim dengan sekarang? [0] Jadi itulah segala yang berlaku. Dan walaupun jenis ini merasakan sedikit tahap rendah dan batin dan ini jenis berasa seperti mungkin intuitif ini sepatutnya hanya bekerja - Saya telah membuat salinan perkara sebelum dan ia hanya bekerja - jika anda benar-benar berfikir tentang apa yang benar-benar adalah rentetan, ia adalah * char. Nah, apakah itu? Ia alamat beberapa watak. Maka mungkin ia lebih masuk akal bahawa apabila anda cuba untuk melakukan sesuatu super seolah-olah mudah seperti ini, semua yang anda lakukan adalah menyalin alamat memori. Anda sebenarnya tidak melakukan apa-apa dengan tali sendiri. Jadi, walaupun anda tidak mempunyai idea bagaimana anda akan menyelesaikan masalah ini dalam kod, tahap yang tinggi, konsep, apa yang kita perlu lakukan untuk membuat ta salinan benar s, nampaknya? Yeah. >> [Pelajar] Berikan lokasi baru? >> Tepat sekali. Kita perlu memberi t lokasi baru. Kita perlu entah bagaimana mewujudkan sebuah dunia di mana kita akan mendapat sebahagian memori yang baru, yang hanya untuk demi kejelasan itu saya akan menarik hak di bawah satu ini, tetapi ia tidak perlu berada di sana. Tetapi ia perlu menjadi saiz yang sama, jadi saya akan melukis garisan menegak di tempat yang sama. Ia adalah baik jika ini adalah semua sampah pada mulanya. Siapa tahu apa yang berada di sana? Tetapi langkah 1 akan mempunyai akan memberi saya sebagai memori banyak seperti yang saya perlukan patut salinan hello, kemudian memikirkan bagaimana untuk menyalin h di sini, e di sini, l di sini dan sebagainya. Tetapi ini seharusnya berasa sedikit jelas walaupun beberapa butiran masih abstrak. Untuk menyalin rentetan ini ke dalam ini, ia hanya untuk gelung atau gelung sementara atau sesuatu yang anda telah menjadi semua lebih akrab. Jadi mari kita cuba ini. Mari saya pergi ke copy2.c. Di copy2.c kita mempunyai hampir program yang sama kecuali selama 27 baris. Ia kelihatan agak kompleks, tetapi jika kita asingkan sekeping oleh sekeping, sebelah kiri adalah sama. Char * t mencipta perkara ini dalam ingatan, walaupun dengan tanda tanya kerana kita tidak mempunyai idea apa yang ada secara lalai. Pada sebelah kanan kita sedang memperkenalkan fungsi baru, malloc, untuk ingatan memperuntukkan, memberi saya ingatan, dan ia nampaknya mengambil berapa banyak hujah, berapa banyak perkara di dalam kurungan? Saya mendengar sungutmu 1 dan 2, tetapi ia adalah hanya 1. Tiada koma, yang bermakna terdapat hanya 1 perkara di dalam kurungan. Walaupun terdapat kurungan lain, izinkan saya menyerlahkan apa yang di dalam kurungan terluar, dan ia adalah ungkapan ini: (Strlen (s) + 1) * sizeof (char). Jadi, jika kita benar-benar berfikir ini melalui, ini mengatakan memberikan saya panjang s. Mengapa saya, walaupun, sambil menambah 1 ke panjang? >> [Sambutan pelajar didengar] Tepat sekali. Kami perlukan ruang untuk lelaki ini pada ekor, watak keenam yang tidak mempunyai makna Inggeris tetapi tidak mempunyai makna perancangan khas. Jadi kita memerlukan + 1 untuk itu kerana strlen pulangan jangkaan manusia panjang, hello atau 5, ia tidak memberi anda watak null tambahan. Jadi saya manual menambah ini dengan + 1. Dan kemudian ini, saiz * (char), kita tidak dilihat sebelum ini. Ini bukan teknikal fungsi. Ia adalah kata kunci khas yang hanya memberitahu anda apa saiz beberapa jenis data pada komputer kerana pada hakikatnya, sebahagian daripada kita mempunyai komputer 32-bit. Saya mempunyai sebuah komputer yang agak lama di rumah, dan ia hanya menggunakan 32 bit untuk mewakili petunjuk. Dan sebagainya jika saya lakukan saiz jenis data, ia mungkin menjadi 32 bit. Tetapi jika saya menggunakan komputer baru saya mewah, saya mungkin akan mendapat kembali nilai 64-bit untuk sesuatu seperti alamat. Jadi dalam kes ini, hanya untuk selamat super, kami tidak pergi kepada sesuatu kod keras seperti - baik, apa yang saiz char mengikut kepada apa yang kita telah berkata setakat ini? Kami telah cukup banyak berkata secara lisan bahawa ia adalah 1 bait, dan itulah cukup banyak benar di seluruh papan. Tetapi sekali lagi, andaian cenderung menjadi buruk. Mereka membawa kepada perisian kereta jika orang menggunakan perisian anda dengan cara yang anda tidak berniat. Jadi abstrak mari ini jauh dan hanya lebih generik mengatakan Saya perlukan ini ketulan banyak memori dan setiap sebahagian memori harus bersamaan dengan saiz watak, yang sebenarnya bersamaan 1 dalam kes ini, tetapi ia adalah cara yang lebih generik menulisnya. Jadi, jika perkataan hello, berapa banyak bait tidak malloc nampaknya memperuntukkan bagi hello? [Pelajar] Enam. >> Enam. Tepat seperti yang banyak seperti yang kita mempunyai tanda soal pada skrin. Dan kemudian mengambil guess kini berdasarkan pemahaman anda GetString apakah malloc mungkin kembali? >> [Pelajar] address. Satu alamat apa? Daripada sebahagian pertama memori. Kami tidak mempunyai idea apa yang ada kerana beberapa fungsi lain mungkin telah menggunakan memori ini sebelumnya. Tetapi malloc, seperti GetString, mengembalikan alamat bait pertama memori bahawa ia telah diketepikan untuk anda. Walau bagaimanapun, apa yang ia tidak berbuat mengisi ruang kosong ini dengan watak null backslash kerana ia ternyata anda boleh menggunakan malloc untuk memperuntukkan apa-apa: ints, rentetan, tatasusunan, terapung, struktur pelajar. Anda boleh menggunakan malloc sepenuhnya generik. Ia tidak peduli atau perlu tahu apa yang anda memperuntukkan memori untuk. Jadi ia akan menjadi angkuh untuk malloc meletakkan 0 \ pada akhir Sebahagian setiap memori ia memberi anda kerana ini \ 0 perkara hanya satu konvensyen untuk rentetan. Ia tidak digunakan untuk ints, ia tidak digunakan untuk terapung, ia tidak digunakan untuk pelajar. Dan sebagainya gotcha dengan malloc adalah bahawa beban sepenuhnya kepada anda pengaturcara ingat berapa banyak bait anda diperuntukkan dan tidak pernah menggunakan untuk gelung atau gelung sementara dan pergi lepas sempadan sebahagian memori anda telah diberikan. Letakkan satu lagi cara, secepat anda memperuntukkan memori, anda tidak boleh meminta sistem operasi, oh, dengan cara itu, bagaimana besar sebahagian memori ini? Ia terpulang kepada anda untuk ingat jika anda perlu nilai itu. Jadi mari kita lihat bagaimana saya meneruskan untuk menggunakan memori ini. Dalam baris 28 dan 29 mengapa saya melakukan ini? Hanya jumlah cek kewarasan. Hanya dalam kes sesuatu silapnya, saya meminta beberapa jumlah gila memori atau saya telah banyak perkara yang berjalan pada komputer yang hanya ada memori tidak mencukupi, sesuatu seperti itu, saya sekurang-kurangnya mahu untuk memeriksa for null. Pada hakikatnya, kebanyakan komputer akan memberi anda ilusi bahawa setiap program boleh menggunakan keseluruhan RAM anda, tetapi walaupun begitu, jika jenis pengguna dalam rentetan beberapa lama gila mungkin kerana mereka seorang lelaki yang buruk dan mereka sebenarnya cuba untuk crash program anda atau hack ke dalamnya, anda mahu sekurang-kurangnya menyemak nilai pulangan malloc dan sama ada ia sama batal. Dan jika ia tidak, mari kita hanya berhenti sekarang kerana saya tidak tahu apa yang perlu dilakukan dalam kes itu. Bagaimana saya menyalin rentetan? Terdapat beberapa cara untuk melakukan ini. Terdapat str menyalin fungsi dalam C, tetapi ia adalah sangat mudah bagi kita untuk melakukan ini cara lama. Pertama izinkan saya memikirkan apa yang panjang s. Saya boleh meletakkan ini di dalam gelung tetapi sebaliknya saya hanya meletakkan ia keluar di sini untuk kejelasan. Jadi n kini menyimpan panjang rentetan asal, yang nampaknya 5. Kemudian dalam gelung untuk saya saya iterating dari 0 sehingga n, dan pada setiap lelaran Saya meletakkan [i] dalam t [i]. Jadi itulah apa yang saya tersirat dengan jari 2 saya menunjuk pada tali sebelum. Seperti ini untuk gelung lelaran seperti ini, saya akan menyalin h ke sini, e ke sini, l sini kerana ini adalah s, ini adalah t. Dan kemudian akhir sekali, dalam 35 baris mengapa saya melakukan ini? Saya perlu memastikan bahawa saya menamatkan rentetan t. Dan saya melakukannya dengan cara ini untuk menjadi super jelas. Tetapi mencadangkan, seseorang, jika anda boleh, cara yang berbeza untuk melakukan ini. Saya tidak benar-benar memerlukan satu line 35. Ada satu lagi cara untuk melakukan ini. Yeah. >> [Sambutan pelajar didengar] >> Katakanlah ia kuat. [Pelajar] Kurang daripada atau sama dengan. >> Tepat sekali. Kami hanya boleh berkata kurang daripada atau sama dengan n, yang secara umum telah buruk kerana hampir selalu apabila kita pergi kepada yang bersamaan dengan perkara yang kita sedang mengira kita pergi langkah 1 terlalu jauh. Tetapi ingat, berapa banyak bait adakah kita memperuntukkan? Kami memperuntukkan strlen s, jadi 5 + 1 untuk total 6. Jadi dalam kes ini, kita boleh melakukan sesuatu seperti ini supaya kita menyalin bukan hanya hello tetapi juga 0 \ pada akhir sangat. Selain itu, kita boleh menggunakan fungsi yang dipanggil salinan str, strcpy, tetapi itu tidak akan menjadi hampir yang banyak keseronokan. Tetapi itu semua ia tidak di bawah hood. Kemudian akhir sekali, kita melakukan perkara yang sama seperti sebelum ini. Saya mengambil kesempatan t dan kemudian saya mendakwa bahawa asal kelihatan seperti ini dan salinan kelihatan seperti itu. Jadi mari kita cuba ini sekarang. Biar saya pergi di sini. Buat copy2. Kami akan mengezum masuk dan menjalankan copy2. Saya akan menaip hello dalam huruf kecil, dan sememangnya saya mendapatkan huruf kecil hello seperti yang asal tetapi modal Hello untuk salinan. Tetapi saya tidak dilakukan hanya lagi. Saya perlu lakukan 1 perkara terakhir di sini. 46 dan 47 jelas membebaskan memori, tetapi apakah yang sebenarnya bermakna? Apa yang saya lakukan, adakah anda fikir, dengan memanggil line 46 dan line 47? Apakah kesan yang ada? Yeah. [Sambutan pelajar didengar] >> Tepat sekali. Anda hanya memberitahu sistem operasi, hey, terima kasih atas ingatan ini. Anda kini boleh menggunakan ia untuk orang lain. Dan di sini adalah satu contoh yang sempurna nilai sampah. Saya telah hanya digunakan memori ini untuk menulis perkataan hello dalam 2 tempat, sini, sini, sini, dan di sini. Jadi ini adalah h-e-l-l-o-\ 0. Tetapi kemudian saya panggil line 46 dan line 47, dan anda tahu apa yang berlaku di sana dari segi gambar? Sebenarnya, tunggu, gambar ini adalah yang lama. Apabila kita membuat salinan, lelaki ini sebenarnya menunjuk sini, jadi mari kita membuang nombor dan hanya abstrak jauh sebagai anak panah kami lagi. Apa yang berlaku dalam gambar ini apabila saya panggil bebas? [Pelajar tindak balas didengar] >> Tidak juga. Jika saya panggil percuma di s dan t - jenis soalan helah - gambar ini tidak berubah pada semua kerana memanggil s dan memanggil t hanya memberitahu sistem operasi, hey, anda boleh menggunakan memori ini lagi, tetapi ia tidak mengubah ini untuk menyeimbangkan atau beberapa aksara khas, ia tidak menukar ini, ia tidak mengubah h atau e atau l atau l atau o di tempat sama ada apa-apa lagi. Dari segi gambar, secepat anda memanggil percuma, tiada perubahan. Dan di dalamnya terletak asal nilai sampah kerana jika saya kemudian dalam program ini minta sistem operasi untuk ingatan lebih dengan malloc GetString atau atau sesuatu seperti yang dan sistem operasi mengatakan, pasti, saya mempunyai 12 bait memori hanya dibebaskan, menggunakan, apa yang anda akan perlu diserahkan? Anda akan menyerahkan sebahagian memori yang kita biasanya akan menarik dengan tanda soalan, tetapi apa yang mereka tanda tanya? Mereka berada h-e-l-l-o, h-e-l-l-o. Ini adalah nilai sampah baru kami dengan seberapa segera seperti yang anda membebaskan memori yang. Terdapat implikasi dunia sebenar di sini juga. Ini berlaku untuk melakukan dengan RAM, tetapi komputer anda sebenarnya melakukan perkara yang sama dengan cakera. Kami akan bercakap tentang perkara ini khususnya dengan set masalah masa depan yang memberi tumpuan kepada forensik. Tetapi apa sebenarnya yang berlaku jika anda mempunyai beberapa fail kewangan sensitif pada desktop anda atau beberapa JPEG lengkap dan anda mengheret ke dalam tong sampah anda, apa yang berlaku apabila anda mengheret ke dalam tong sampah atau tong kitar semula? Anda tahu apa yang saya bercakap tentang. [Ketawa] Apa yang berlaku apabila anda telah mengheret bukti bahawa ke dalam tong kitar semula anda atau sampah boleh? [Sambutan pelajar didengar] Nah, jadi berhati-hati. Apa yang berlaku apabila anda berbuat demikian? Jawapan ringkasnya adalah apa-apa, kan? Fail lengkap atau sensitif masih hanya duduk di sana tempat dalam cakera keras anda. Kebanyakan kita sekurang-kurangnya telah belajar cara keras bahawa anda perlu untuk mengosongkan sampah anda atau tong kitar semula anda untuk benar-benar memadam fail. Dan sesungguhnya, apabila anda klik kanan atau Kawalan klik pada sampah anda boleh atau memilih File, Sampah kosong atau apa sahaja dan anda sebenarnya mengosongkan sampah boleh atau tong kitar semula, apa sebenarnya yang berlaku kemudian kepada gambar ini? Tidak lebih. Jadi apa-apa yang sebenarnya berlaku pada cakera. Dan jika kita hanya sementara menyimpang dan menulis - I'll hanya menggunakan belakang ini. Jadi sekarang cerita berubah dari RAM, yang mana program wujud semasa anda menjalankan mereka, cakera, yang mana mereka disimpan jangka panjang walaupun apabila kuasa akan keluar, buat masa sekarang - dan kita akan kembali kepada ini pada masa depan - mari kita hanya berpura-pura bahawa ini mewakili dalam cakera keras komputer anda kerana kembali pada hari mereka digunakan untuk menjadi cakera bulat, sama seperti cakera liut. Jadi, jika anda mempunyai beberapa fail Excel sensitif, ia mungkin mengambil masa sehingga ini sebahagian memori pada cakera komputer anda, dan saya hanya melukis 1s dan 0-an sama sewenang-wenangnya. Apabila anda menyeret fail seperti itu ke tong sampah anda atau boleh kitar semula bin, benar-benar tiada apa yang berlaku kerana Apple dan Microsoft telah memutuskan sampah boleh dan tong kitar semula adalah benar-benar hanya placeholder sementara. Mungkin akhirnya OS akan mengosongkannya untuk anda, tetapi biasanya, ia tidak berbuat apa-apa, sekurang-kurangnya sehingga anda benar-benar rendah pada ruang. Walau bagaimanapun, apabila anda pergi ke sampah kosong atau kosong recycle bin, sama, tiada apa yang berlaku kepada gambar ini. Semua yang berlaku adalah di tempat lain di komputer anda, terdapat beberapa jenis jadual. Ia adalah jenis seperti lembaran menipu sedikit yang mengatakan bahawa, katakan, resume.doc, supaya resume anda dalam fail Microsoft Word yang digunakan untuk hidup di 123 lokasi pada cakera keras anda, bukan dalam ingatan dan tidak dalam RAM tetapi pada cakera keras anda, dan kehidupan JPEG lengkap anda pada 456, dan fail Excel anda tinggal di 789 atau mana-mana jua. Apabila anda padam fail dengan sebenarnya mengosongkan sampah atau tong kitar semula, gambar ini tidak berubah. 0 dan 1s pada cakera keras anda tidak pergi ke mana-mana. Tetapi jadual ini, pangkalan data ini sedikit pelbagai, adakah perubahan. Apabila anda memadam resume anda, ia seolah-olah fail dipadam dalam erti kata lain, tetapi semua komputer tidak lupa di mana perkara yang tinggal pada pemacu keras anda. 0 dan 1s yang mengarang resume anda atau mana-mana fail-fail lain masih utuh. Jadi, jika anda melakukan ini sengaja, masih ada kebarangkalian bukan sifar bahawa anda boleh memulihkan data anda menggunakan Norton Utilities atau beberapa perisian komersial maksud yang dalam kehidupan adalah untuk mencari 0s dan 1s yang telah jenis telah yatim, lupa di sini tetapi meninggalkan di sini, supaya anda boleh mendapatkan kembali data anda. Atau penyiasat forensik dengan polis atau FBI sebenarnya akan mengambil cakera keras dan sebenarnya mencari corak 0 dan 1s yang kelihatan seperti JPEG, kelihatan seperti fail Excel, dan memulihkan mereka bahawa cara walaupun komputer telah lupa mereka di sana. Jadi satu-satunya cara untuk benar-benar memadam data, seperti yang kita akan membincangkan di masa hadapan, adalah untuk gosok atau mengelap fail atau cakera keras oleh - Anda tidak boleh benar-benar menghilangkan 0s dan 1s kerana jika tidak, anda akan bermula dengan pemacu keras gigabit dan anda akan berakhir dengan cakera keras megabait jika anda sentiasa telah memotong, secara literal, 0 dan 1s. Jadi apa yang akan anda lakukan jika anda benar-benar mahu untuk menutup trek anda dan masalah asas adalah bahawa masih ada 0s dan 1s pada cakera? Saya melihat seseorang gesticulating bahawa anda secara fizikal akan memecahkan peranti. Yang akan bekerja. [Ketawa] Tetapi jika itulah jenis penyelesaian yang mahal, apa yang akan menjadi lebih munasabah? Yeah. >> [Pelajar] Overwrite mereka. >> Overwrite mereka dengan apa? >> [Pelajar] Data-data lain. Data lain. Anda hanya boleh menimpa cakera anda dengan 0s atau 1s atau semua 0s, 1s semua. Dan itulah sesungguhnya apa yang sesetengah perisian tidak. Anda boleh membeli perisian atau bahkan mendapatkan perisian percuma, dan juga dibina dalam Mac OS hari ini, kurang jadi dalam Windows, adalah keupayaan untuk selamat memadam. Sebenarnya, jika anda mahu kepada semua rumah run hari ini jika anda mempunyai Mac dan melakukan ini, jika anda telah mendapat beberapa perkara dalam tong sampah anda boleh, anda boleh melakukan Kosongkan Sampah yang selamat, yang tidak tepat. Bukannya hanya memadam fail di sini, ia tidak memadam sini 0 dan 1s, sebaliknya, ia hanya menukar mereka semua, misalnya, kepada 0 dan dot, dot, dot. Jadi salah psets masa depan anda sebenarnya akan untuk memulihkan data dengan sengaja - gambar-gambar yang kita telah diambil orang, tempat, dan perkara-perkara di kampus yang kita akan membuat imej forensik kad memori kamera digital, yang merupakan idea yang sama yang tepat - dan anda akan perlu dicabar untuk mencari sebenarnya corak yang mewakili JPEG pada cakera keras anda, banyak seperti bekas pelajar yang emelnya saya membaca beberapa minggu yang lalu untuk memulihkan gambar kakaknya. Mengapa tidak kita mengambil 5-minit rehat di sini, dan kami akan berkumpul semula dengan lebih pada ingatan. Jadi di sini adalah di mana perkara mendapatkan sedikit minda-lentur, tetapi ini adalah satu langkah yang sangat kuat ke arah memahami ini semua lebih. Berikut adalah program yang dipanggil pointers.c. Ia adalah antara contoh kod hari ini. Perhatikan bahawa dalam beberapa baris pertama, 19 melalui 22, semua yang kita lakukan adalah sesuatu seperti GetString dan kembali alamat, menyimpan ia dalam s. Seterusnya untuk walaupun 3 pset jika anda mahu tetapi pset 4 dan pada di mana anda boleh mula mengambil ini roda latihan luar diri, tidak ada sebab untuk berpura-pura bahawa rentetan wujud lagi. Ia sudah tentu okay hanya mula berkata * char. Sebagai mengetepikan, dalam rujukan dalam talian dan di dalam buku-buku anda sering boleh melihat bintang di sebelah pembolehubah. Anda juga mungkin melihat ruang di sekitar kedua-dua belah. Semua mereka berfungsi betul. Buat masa sekarang, walaupun, kita akan menyeragamkan pada pendekatan ini untuk membuat super jelas bahawa * char adalah seperti mengatakan penunjuk watak. Itu adalah jenis data. Dan kemudian nama pembolehubah adalah s dalam kes ini. Jadi kita telah mendapat rentetan dan kita telah dipanggil ia s. Dan kemudian turun di sini melihat bahawa saya lakukan sebenarnya sedikit tipu muslihat. Ini dipanggil penunjuk aritmetik, yang merupakan jenis mudah super. Ia hanya bermakna tambah dan tolak nombor untuk petunjuk. Tetapi ini sebenarnya berfungsi. Program ini nampaknya mencetak watak 1 rentetan s per baris seperti yang hasil akhir - Hanya supaya kita boleh merosakkan mana ini akan, membuat petunjuk, menjalankan petunjuk, izinkan saya zum masuk Sekarang mari saya jenis dalam sesuatu seperti HELLO dan jenis Masukkan dan ia mencetak 1 aksara per baris. Sehingga saat lalu, kita akan melakukan ini dengan notasi kurungan persegi. Kita akan mempunyai untuk gelung dan kita akan lakukan printf s [i] dan kita akan melakukannya lagi dan lagi dan lagi dengan n backslash pada akhir setiap baris. Tetapi program ini adalah berbeza. Program ini menggunakan, secara literal, aritmetik. Jadi apa yang berlaku di sini? Pertama sekali, sebelum gelung ini walaupun melaksanakan, apa, hanya perlu jelas, adalah s sebenarnya? S adalah? >> [Pelajar] address. >> Satu alamat. Dan ia alamat, dalam kes-hello, watak pertama dalam perkataan itu, yang merupakan h. Jadi s adalah, dalam contoh ini tertentu, alamat h. Jadi, apakah ia bermakna untuk melakukan s + i? Well, i bermula pada 0 dalam hal ini untuk gelung. Kami telah melakukan yang banyak kali. Saya akan pergi sehingga panjang tali, nampaknya. Jadi pada lelaran pertama gelung ini, i adalah jelas 0. Jadi ungkapan ini mengatakan s + i - bukan, s +0- yang jelas hanya s. Jadi apakah * s di sini? Sekarang kita sedang menggunakan bintang dengan cara yang sedikit berbeza. Biar saya pergi ke hadapan dan menghilangkan t kerana kita sudah selesai bercakap tentang t dan salinan s. Sekarang kita hanya mahu untuk memberitahu cerita yang melibatkan s. Dan sebagainya pada masa ini, setelah rentetan jenis, dunia kita kelihatan agak seperti ia lakukan sebelum dengan hanya s menyimpan alamat h dan lebih amnya menunjuk pada tali hello. Jika sekarang saya lakukan satu garis seperti * (s + i), mari kita mencuba ini. Jadi * (s + i). Biar saya memudahkan ini kerana ini adalah 0, jadi ini adalah * (s +0). Well, tunggu satu minit. Memudahkan lagi. Ini adalah * (s). Nah, sekarang kurungan adalah jenis bodoh, jadi sekarang mari kita hanya melakukan * s. Jadi, dalam lelaran pertama gelung ini, bahawa garis itu diserlahkan, 26, adalah cukup banyak bersamaan dengan percetakan ini. Apakah jenis data * s? Dalam konteks ini, kerana bintang yang berlaku akan datang kepada s sendiri, tetapi lebih khusus, kerana kita tidak lagi mengisytiharkan s, kita tidak mewujudkan pemboleh ubah lagi, tidak ada menyebut * char di baris 26, tidak ada menyebut tentang rentetan kata kunci, kami hanya menggunakan pembolehubah yang dipanggil s, ia ternyata kini bintang mempunyai sedikit berbeza dan, diakui, mengelirukan makna. * S di sini bermakna pergi ke alamat di s dan cetak apa yang ada di sana. Jadi s di sini, * s - jenis seperti pelongsor dan Tangga, ikut anak panah - di sini. Jadi ini adalah * s. Jadi apa yang mendapat dicetak pada lelaran pertama gelung yang di baris 26? Saya mencetak% c, yang merupakan placeholder untuk watak, maka \ n bagi barisan baru. * (S + i) di mana i ialah 0 hanya ini. Jadi apa char saya letakkan untuk c%? H. Dalam lelaran berikutnya gelung - anda mungkin boleh melihat di mana ini akan - lelaran seterusnya i adalah jelas 1, jadi ini bermakna +1 ku, dan kemudian sekarang saya perlu kurungan kerana kini bintang itu perlu untuk mengatakan pergi kepada alamat ingatan +1 ku. Apakah s? Mari kita melancarkan kembali dalam masa dan mengatakan anak panah ini kini sebenarnya tidak melakukan sebarang nikmat. Biarkan lebih khusus mengatakan bahawa ini menyimpan nombor 123 kerana permulaan rentetan ini hello, ini adalah alamat 123, ini adalah 124, dan sebagainya. Maka pada lelaran kedua apabila saya cakapkan +1 ku, bahawa seperti mengatakan 123 +1, atau dikenali sebagai 124, jadi apa char mendapat dicetak pada lelaran kedua? E pada alamat ingatan 124. Kemudian + lagi, 125, 126, 127, dan gelung ini bersyukur berhenti sebelum kita sampai ke sini kerana saya menggunakan strlen untuk memastikan bahawa saya tidak mengira terlalu tinggi. Jadi yang juga adalah ia. Sekali lagi, ini adalah hanya seolah-olah kita telah dilakukan seminggu yang lalu. Izinkan saya menulis pada baris bawah walaupun kita tidak mahu melakukan kedua-duanya. Ini adalah sama sekarang ini. Jadi walaupun s adalah rentetan, seperti yang kita telah memanggil ia selama beberapa minggu, s adalah benar-benar * char. Jadi, jika kita mahu menjadi super dubur, ia adalah benar-benar yang betul untuk menulis watak tertentu pada lokasi engan menggunakan alamat-alamat angka dan ini pengendali bintang, tetapi terus terang, ini adalah pembersih yang hanya begitu banyak. Jadi ini tidak buruk. Tiada sebab untuk berhenti melakukan baris 27 di sini, tetapi 26 adalah fungsi yang sama, dan ia berfungsi sama untuk betul-betul sebab-sebab yang kita telah membincangkan setakat. Dan akhir sekali, 29 adalah amalan yang hanya baik. Panggilan percuma s bermakna bahawa kini anda memberi kembali memori bahawa GetString memberikan anda kerana sekali lagi, seperti yang saya disebutkan Isnin, GetString untuk minggu telah memperkenalkan bug ke dalam kod anda. Kod untuk minggu anda mempunyai kebocoran memori di mana anda telah meminta GetString untuk memori tetapi anda tidak pernah memberikan ia kembali. Dan yang sengaja dipilih oleh kami pedagogically kerana ia hanya terlalu banyak untuk berfikir tentang awal. Tetapi sekarang kita memerlukan lebih simetri. Jika anda bertanya kepada komputer untuk ingatan, seperti kes GetString, seperti kes itu nampaknya malloc, anda mesti sekarang terus pset 4 juga bebas apa-apa memori itu. Notis ini adalah berbeza daripada mengatakan n int. Anda tidak perlu untuk membebaskan ini kerana anda tidak memanggil GetString dan anda tidak memanggil malloc. Dan walaupun anda dipanggil GetInt kerana akhirnya kita akan melihat, GetInt tidak memperuntukkan memori untuk anda kerana anda sebenarnya boleh lulus sekitar integer dan terapung dan aksara hanya cara yang kita telah lakukan untuk minggu. Rentetan, walaupun, adalah istimewa kerana benar-benar mereka dinamika aksara berganda. Jadi mereka hanya berbeza dari aksara dan terapung dan ints dan sebagainya. Tetapi kita akan kembali yang lama. Sebarang pertanyaan kemudian pada permulaan ini petunjuk? Yeah. [Soalan pelajar didengar] Ah, soalan yang sangat baik. Salah satu perkara yang beberapa C sebenarnya tidak untuk anda, yang mudah, ia angka untuk anda apa saiz jenis data dan kemudian tidak bahawa jenis penggandaan untuk anda. Ini adalah tidak relevan dalam kes aksara kerana hampir selalu char 1 bait, jadi ini hanya berfungsi. Tetapi demi perbincangan, jika anda sebenarnya percetakan integer dan anda telah cuba untuk mencetak beberapa nilai yang telah menunjuk pada integer, anda sama tidak akan perlu untuk melakukan + 4 * i hanya kerana int 4 bait. Aritmetik pointer bermakna bahawa C dan pengkompil melakukan semua bahawa matematik untuk anda. Semua yang anda perlu mengambil berat tentang pengiraan dalam jenis rasa manusia. Yeah. [Pelajar] Jika anda mengisytiharkan rentetan di dalam gelung, adakah anda mempunyai untuk membebaskan kemudian? Soalan yang baik. Jika anda mengisytiharkan dalam rentetan bagi gelung, adakah anda perlu untuk membebaskan kemudian? Anda hanya perlu memori bebas yang anda memperuntukkan dengan GetString atau dengan malloc. Jadi jika anda hanya mengatakan sesuatu seperti - izinkan saya meletakkan pendakap kerinting sekarang supaya semua kod berkaitan. Jika anda melakukan sesuatu, walaupun buggily, seperti ini, char * t = s, anda tidak perlu t percuma kerana t tidak melibatkan apa-apa sebutan malloc atau GetString. Jika sebaliknya anda lakukan ini, GetString, maka ya, anda akan perlu t percuma. Dan pada hakikatnya, satunya peluang anda untuk berbuat demikian adalah sekarang dalam gelung ini, isu yang sama skop bahawa kita telah dibincangkan pada masa lalu. Jika tidak, anda akan memperuntukkan memori, memperuntukkan memori, memperuntukkan memori, dan di akhir program ini kerana anda berada di luar gelung itu, t tidak wujud, tetapi anda tidak pernah memberitahu sistem operasi bahawa anda tidak memerlukan memori yang lagi. Dan tidak lama lagi, bagi pset 4 atau 5 kita akan melengkapkan anda dengan program yang dipanggil Valgrind, yang sama dalam semangat untuk GDB bahawa ia mendapat agak antara muka batin, tetapi tujuan dalam hidup adalah untuk membantu anda. Dan Valgrind merupakan satu program yang pada masa depan akan mencari program anda mencari kebocoran memori, sama ada dari GetString atau malloc, yang kita akan mula menggunakan semua lebih kerana kita berhenti menggunakan perpustakaan CS50 sebagai banyak. Kami akhirnya kini mempunyai jenis perbendaharaan kata dan jenis model mental dalam teori dengan yang untuk menyelesaikan program ini patah. Jadi dalam program ini patah, swap berfungsi dalam swap, tetapi ia tidak pernah benar-benar bekerja di utama kerana utama diluluskan dalam x dan y, ingat, dan mereka telah diluluskan oleh nilai-nilai, jadi untuk bercakap. Salinan daripada mereka telah diberikan untuk menukar. Menjelang akhir swap, a dan b itu memang telah ditukar, tetapi sudah tentu x dan y, seperti yang kita dibincangkan pada hari Isnin, tidak pernah. Jadi saya mencadangkan hijau di sini bahawa ini adalah sebenarnya penyelesaian di sini. Dan sebenarnya, biarlah saya bergerak bintang saya hanya untuk menjadi konsisten walaupun, sekali lagi, fungsi ini tidak mengapa. Pada minggu-minggu akan datang, kami akan menjelaskan bila dan mengapa ia perkara. Jadi hijau kini adalah penyelesaian. Terus terang, ia kelihatan banyak keseluruhan Messier kerana saya mempunyai semua bintang-bintang ini. Izinkan saya menunjukkan satu perkara. Top line di sini di mana ia mengatakan int * dan int * b asasnya melakukan perkara yang sama kerana ia sentiasa mempunyai. Ia mengisytiharkan 2 hujah atau parameter untuk menukar, di mana yang pertama adalah penunjuk int dipanggil, kedua yang merupakan penunjuk int dipanggil b. Satu-satunya perkara yang baru pada ketika ini adalah hakikat bahawa terdapat bintang di sana. Apa maksudnya? Tidak int, b tidak adalah satu int. Adalah alamat int dan b adalah alamat int yang berbeza. Turun di sini, ini adalah di mana saya mengakui C mendapat mengelirukan. Sekarang kita sedang menggunakan bintang, tetapi ia mempunyai makna yang berbeza dalam konteks ini. Kerana kita tidak mengisytiharkan petunjuk seperti kita di sini, di sini kita dereferencing perkara. Jadi secara teknikal, bintang dalam konteks ini baris pertama, kedua, dan ketiga di dalam swap pengendali dereference, yang hanya bermakna pergi ke sana. Jadi hanya jari saya diikuti anak panah untuk h, * Cara pergi ke alamat tersebut dan mencari saya int yang ada. * Cara b pergi ke alamat dan lulus saya apa yang ada. Jadi mari kita melukis gambar dari Isnin kini menggunakan timbunan bingkai, satu bawah yang akan menjadi utama, satu atas yang akan menjadi swap, supaya dunia kita kelihatan, sama seperti hari Isnin, seperti ini. Berikut adalah sebahagian memori yang utama akan menggunakan. Ingat dari hari Isnin bahawa program ini hanya mempunyai 2 pembolehubah, yang dipanggil x dan satu dipanggil y, dan saya telah meletakkan nombor 1 dan 2 di sana. Sekarang apabila saya panggil swap seperti yang saya lakukan pada hari Isnin, sebelum ini apabila saya menggunakan versi merah program ini, yang kelihatan seperti ini, Saya mendapat 2 parameter, a dan b, dan apa yang kita menulis di sini dan di sini? Hanya 1 dan 2, secara literal salinan x dan y. Hari ini kita mengubah itu. Hari ini bukannya lulus dalam ints a dan b kita pergi untuk lulus dalam 2 alamat. Alamat tersebut berlaku untuk menunjukkan ints, tetapi alamat tidak ints diri. Mereka adalah alamat. Ia seperti alamat pos sebaliknya. Jadi sekarang kita hanya perlu memberi diri saya sedikit lebih terperinci pada skrin. Ini adalah memori komputer saya kerana ia telah sepanjang hari. Sekarang kita perlu beberapa skim penomboran sewenang-wenangnya. Jadi mari kita hanya mengatakan, hanya secara kebetulan, bahawa ini adalah alamat ingatan 123, 124. Mari kita hanya mengatakan ini ialah 125, ini adalah 126, dan sebagainya, tetapi yang benar-benar sewenang-wenangnya. Kita hanya perlu beberapa skim penomboran dalam ingatan saya. Jadi sekarang apabila saya benar-benar lulus dalam x dan y, saya tidak akan lulus dalam x dan y; Saya akan lulus dalam alamat pos, jadi untuk bercakap, x dan y supaya apa yang mendapat disimpan di sini dan di sini tidak adalah 1 dan 2, tetapi jika anda boleh melihat teks kecil saya, apa yang mendapat diluluskan di sini dan di sini? [Sambutan pelajar didengar] >> Tepat sekali. 123 mendapat diletakkan di sini dan 124 mendapat diletakkan di sini. Sekarang, kerana saya menggunakan bintang dalam cara ini garis yang pertama di sini di atas, program saya hanya tahu bahawa 123 dan 124, walaupun mereka jelas integer bahawa mana-mana manusia boleh notis, mereka harus ditafsirkan sebagai alamat, alamat berangka. Mereka tidak berada di dalam dan diri mereka sendiri ints, mereka alamat, dan itulah kerana saya telah jelas meletakkan bintang di sana. Jadi sekarang dalam baris pertama, kedua, dan ketiga saya kod sebenar apa yang berlaku di sini? Mari kita lukiskan rehat gambar. Tmp adalah sama seperti ia adalah pada hari Isnin. Tiada apa-apa yang istimewa tentang tmp. Ia adalah hanya 32 bit tempatan berubah-ubah, dan di dalam yang saya nampaknya menyimpan nilai a *. Sekarang, jika saya hanya berkata tmp = a, apa yang saya akan meletakkan di sini? >> [Pelajar] 123. 123. Tetapi itu bukan apa yang saya lakukan. Saya katakan tmp = * a. Cara Bintang pergi ke sana. Jadi di sini adalah, 123. Bagaimana saya pergi ke sana? Berpura-pura seperti ada anak panah. Nah, ada ia adalah, 1. Jadi apa yang mendapat disimpan di tmp, nampaknya? Hanya 1. Jadi dalam erti kata lain, tmp *, * satu cara pergi ke alamat yang kini dalam, yang nampaknya 123. Okay, di sini kita adalah di 123 lokasi, saya melihat nombor 1, jadi saya akan meletakkan nombor 1 di sana. Sekarang apa yang saya lakukan dalam 2 baris, * = * b? Ini adalah sedikit lebih terlibat kerana kini apa yang dikatakan? Ia adalah 123. So * adalah di mana? Tepat di mana saya sebelum ini. Jadi pergi ke sana. Okay. Sekarang, akhirnya, dan akhirnya ini akan mula masuk akal, mudah-mudahan, * B bermakna apa yang di b? 124. Jadi saya perlu pergi ke sana, yang terletak 2. Jadi, apa yang saya meletakkan di mana? 2 masuk ke sini kerana * b masuk ke dalam * satu. Jadi, saya akan berbuat demikian. Dan anda sudah boleh melihat, mungkin, bahawa kita lebih dekat untuk menyelesaikan ini bodoh, masalah yang mudah dengan betul untuk kali pertama kerana sekarang kita masih mempunyai ingatan apa x, kami mempunyai 2 salinan, diakui, y, tetapi baris 3 sekarang kata * b. Jadi di sini adalah b. * B cara pergi ke sana. Jadi di mana lokasi 124? Ia nampaknya di sini. Jadi apa yang saya letakkan di sini? Jelas sekali, tmp. Jadi sekarang saya melakukan ini. Jadi saya mempunyai 1 di sini dan 2 di sini. Dan kini apa tentang semua ini, 123, 124, dan 1? Secepat pulangan swap, ingatan ini adalah sebagai baik sebagai hilang kerana secepat pulangan swap, sistem operasi adalah bebas untuk menggunakan memori yang sekali lagi pada masa depan. Hanya ingatan utama di bawah timbunan ini kononnya melekat sekitar. Dan supaya kita akhirnya mempunyai kini versi bekerja. Biar saya pergi ke swap.c, dan notis berikut. Pada bahagian atas program saya telah berubah prototaip saya untuk menjadi int * dan int * b. Jadi, perkara yang hanya saya berubah untuk pergi dari merah, yang buruk, hijau, yang baik, saya tambah bintang ini hari ini. Tetapi kemudian turun di sini di swap sendiri saya terpaksa untuk menyalin, paste apa yang hanya pada slaid. Saya mempunyai bintang di sini, bintang di sini - yang sepadan prototaip - dan kemudian semua perkara ini kini mempunyai bintang kecuali tmp kerana penggunaan pembolehubah sementara, tiada apa-apa yang baru di sana. Saya hanya perlu penyimpanan sementara untuk int. Jadi kita tidak memerlukan bintang di sana. Kita hanya perlu bintang supaya kita boleh menyeberang ini jenis sempadan sewenang-wenangnya antara 2 bingkai dalam ingatan komputer saya. Tetapi satu perkara yang lepas telah berubah, dan anda mungkin telah celah ia sudah. Apa barisan lain jelas berbeza sekarang? >> [Pelajar] & x. Ya, jadi 25 adalah barisan terakhir kod saya perlu menukar untuk ini untuk bekerja. Seminggu yang lalu dan walaupun pada hari Isnin line 25 kelihatan seperti ini, menukar x dan y, dan ini hanya dipecahkan kerana jika anda mengatakan swap (x, y) anda memberi salinan x dan y untuk menukar, maka ia melakukan perkara, tetapi anda sebenarnya tidak pernah berubah-ubah x dan y sendiri. Jadi, walaupun anda tidak pernah melihat watak ini sebelum dengan #: glib dalam kod, hanya mengambil tekaan. Apakah #: glib lakukan, nampaknya? [Pelajar] Mengambil alamat. >> Mengambil alamat. Jadi #: glib mengatakan memberikan saya alamat x. Siapa tahu di mana ia? Ia berlaku untuk menjadi 123. Saya tidak peduli. Hanya memberikan saya alamat x. & Y bermakna memberi saya alamat y. Dan pada ketika itu cerita ini adalah sempurna konsisten dengan gambar kita menarik seketika lalu. Jadi saya akan mengakui petunjuk, sudah tentu bagi saya apabila saya mula belajar ini, pasti salah satu perkara yang paling sukar untuk membalut fikiran saya sekitar. Tetapi sedar, terutamanya seperti yang kita terus bermain dengan jenis-jenis perkara, jika anda memecahkan ia turun untuk menyusun ini super mudah intelektual tidak menarik masalah hanya nombor bergerak di sekitar, jawapannya kepada banyak kekeliruan dengan petunjuk benar-benar boleh diperolehi daripada mekanik ini sangat asas. Berikut adalah alamat. Pergi ke sana dengan bintang. Atau sebaliknya, di sini #: glib. Memikirkan apa yang sebenarnya adalah alamat. Semua hak. Jadi di mana semua ingatan ini datang dari? Kami telah menarik gambar ini beberapa kali, dan saya terus menjanjikan kita akan kembali kepadanya, tetapi di sini adalah perwakilan memori komputer anda yang sedikit lebih dilabelkan daripada papan hitam kami di sini adalah. Segmen teks di atas mewakili apa yang berkenaan dengan program anda? [Sambutan pelajar didengar] >> Maaf? Katakanlah lagi. [Pelajar] Program sebenar. >> Program sebenar. Jadi dilafaz 0s dan 1s bahawa anda telah disusun selepas menulis kod C dan kemudian berjalan dan menjana hujung 0s dan 1s sehingga mendapat terletak di sana dalam ingatan kerana apabila anda klik dua kali ikon pada Mac atau PC anda atau menjalankan arahan seperti mario pada segera anda, 0s dan 1s daripada cakera dimuatkan ke dalam memori supaya komputer boleh memanipulasi mereka dan melaksanakan mereka dengan lebih cepat. Jadi dimulakan data dan data yang tidak diisytiharkan, kita tidak akan bercakap banyak tentang mereka, tetapi mereka hanya pembolehubah global. Dimulakan bermakna pembolehubah global yang anda berikan nilai kepada; tidak diisytiharkan bermakna pembolehubah global bahawa anda tidak lagi memberi nilai kepada. Kemudian terdapat pembolehubah persekitaran yang saya benar-benar akan melambai tangan saya pada, tetapi mereka berada di sana dan yang menyimpan perkara-perkara seperti nama pengguna anda dan jenis lain butiran tahap yang lebih rendah. Tetapi keping juiciest susun atur memori anda adalah perkara ini dipanggil timbunan dan longgokan itu. Timbunan sekali lagi, perlu jelas, adalah memori yang digunakan apabila fungsi dipanggil, apabila terdapat pembolehubah tempatan dan apabila terdapat parameter yang diluluskan sekitar. Semua yang berlaku dalam timbunan. Timbunan itu kita tidak bercakap tentang, tetapi mengambil tekaan yang menggunakan timbunan. Hanya sebahagian memori yang berbeza. Ia berlaku untuk diambil di sini di atas, tetapi itulah konvensyen bergambar sewenang-wenangnya. Siapa yang nampaknya telah menggunakan memori dari timbunan itu selama beberapa minggu? Ia teknikal anda tetapi secara tidak langsung. >> [Pelajar] GetString. GetString dan malloc. Jadi di sini adalah perbezaan asas. Anda tahu untuk beberapa minggu lalu bahawa jika anda memerlukan ingatan, hanya mengisytiharkan pembolehubah. Jika anda memerlukan banyak memori, mengisytiharkan pelbagai kanan di dalam fungsi anda. Tetapi masalah kita telah disimpan menghadapi adalah jika anda mengisytiharkan pembolehubah tempatan dalam fungsi, secepat pulangan fungsi, apa yang berlaku kepada memori dan pembolehubah-pembolehubah? Hanya apapun ia tidak lagi milik anda, bukan? Ia hanya hilang jenis konsep. Ia masih fizikal di sana, jelas, tetapi ia tidak lagi hak anda untuk menggunakan. Ini adalah jelas bermasalah jika anda mahu menulis fungsi dalam kehidupan yang sebenarnya memperuntukkan memori dan tidak memberikan kembali segera. Kes di titik: tujuan GetString dalam kehidupan adalah untuk tidak mempunyai idea terlebih dahulu betapa besar rentetan saya akan menaip di keyboard, tetapi ia mendapat untuk dapat memperuntukkan memori untuk memegang Daud atau hello atau keseluruhan esei bahawa pengguna mungkin telah ditaip masuk Jadi GetString telah menggunakan malloc. Malloc itu mesti menggunakan bukan timbunan; sebaliknya ia menggunakan perkara ini dipanggil timbunan itu. Ada apa-apa yang berbeza tentang memori. Ia bukan cepat atau perlahan atau apa-apa seperti itu. Ia hanya fizikal di lokasi yang berbeza. Tetapi pemerintahan adalah bahawa memori yang diperuntukkan pada timbunan tidak akan diambil dari anda sehingga anda memanggil - mengambil tekaan bebas. Sebaliknya, ingatan-mana anda bertanya pada timbunan dengan hanya mengisytiharkan array atau mengisytiharkan pembolehubah seperti yang kita telah lakukan untuk minggu, bahawa secara lalai berakhir pada timbunan. Dan bahawa kerja-kerja yang besar 90% daripada masa itu, tetapi pada masa-masa yang jarang di mana anda mahu untuk memperuntukkan memori dan menyimpan di sekeliling, maka anda perlu menggunakan fungsi seperti malloc. Atau kita telah menggunakan fungsi seperti GetString, yang seterusnya menggunakan malloc. Mari kita lihat di mana ini mungkin memecahkan dan kemudian mengambil mengintip di Binky. Kita akan kembali itu di masa depan. Berikut adalah program super mudah bahawa dalam 2 baris pertama melakukan apa? Dalam bahasa Inggeris, apa yang ini 2 baris pertama kod lakukan dalam utama? [Sambutan pelajar didengar] Berhati-hati. Ia tidak memberi saya alamat x atau y. [Pelajar] Memberi petunjuk kepada ints. Baik >>. Berikan saya 2 petunjuk untuk integer. Dalam erti kata lain, memberi saya 2 ketulan ingatan bahawa saya menyimpan lukisan hari ini, walaupun saya terpadam sekarang, sebagai dataran. Berikan saya 2 ketulan memori, satu dipanggil x, satu dipanggil y - sebelum saya memanggil mereka s dan t - dan apakah jenis Sebahagian bahawa memori? Ia akan menyimpan alamat. Ia adalah * int jenis. Jadi alamat int akhirnya akan hidup dalam x, alamat int akhirnya akan hidup dalam y, tetapi pada mulanya, apa yang di dalam x dan y? Siapa tahu? Sampah nilai. Ia mempunyai tiada kaitan dengan penunjuk. Jika kita tidak meletakkan sesuatu di sana, siapa tahu apa sebenarnya ada? Sekarang, x. Apa yang berlaku di sini? Ini adalah legit kini kerana x penunjuk. Ia merupakan satu * int. Jadi ini bermakna saya boleh meletakkan di x alamat Sebahagian beberapa memori. Apakah malloc kembali? Sempurna, ia kembali alamat, alamat bait pertama dalam sebahagian keseluruhan ingatan. Berapa banyak bait ini nampaknya memperuntukkan, misalnya, dalam perkakas? Apakah saiz int? 4. Jika anda berfikir kembali ke 1 minggu, ia bukan super penting untuk sentiasa ingat bahawa, tetapi dalam kes ini ia adalah berguna untuk mengetahui, 4 bait. Jadi ini memperuntukkan pada 4 bytes timbunan dan ia kembali alamat yang pertama kepada saya dengan sewenang-wenangnya. Kini, apa yang x buat? A * x = 42 adalah melakukan apa? Jika pada ketika ini dalam cerita kita mempunyai x, yang kelihatan seperti ini dengan nilai sampah beberapa, ini kini y dengan nilai sampah beberapa, sekarang dalam 3 baris saya telah diperuntukkan 4 bait. Gambar ini pada dasarnya kelihatan seperti ini. Atau lebih khusus, jika ini adalah alamat sewenang-wenangnya 123, ini adalah apa cerita kita kini kelihatan seperti. * X = 42 sekarang bermakna apa? Ini bermakna pergi hingga 123 alamat dan meletakkan nombor 42 di sana. Saya tidak perlu untuk menarik garis-garis kerana kita tidak melakukan rentetan. Saya sepatutnya hanya ditulis seperti ini, dan hanya kerana demonstrasi itu, 42 sebagai sejenis int mengambil banyak ruang, 4 bait. Jadi itulah apa yang berlaku di sana, tetapi ada masalah sekarang. * Y = 13. Apa yang akan berlaku di sini? Masalahnya ialah y * di dunia dipermudahkan kita hanya bermakna pergi ke alamat dalam y. Apakah dalam y? Ia adalah beberapa nilai sampah. Jadi mari kita andaikan bahawa nilai sampah adalah 5551212, sesuatu yang gila seperti itu. * Cara y pergi untuk menangani 5551212. Itu suka di sini. Ia tidak wujud, misalnya. Jadi * y mendapat 13 cara saya cuba untuk menarik 13 di sini. Ia tidak wujud. Saya telah melebihi segmen papan hitam. Apa yang saya dapat? Bahawa mesej kesalahan segmentasi samar kerana saya cuba untuk meletakkan dalam ingatan nilai seperti 13 di tempat yang tidak wujud. Selebihnya program mungkin bekerja okay, tetapi sehingga titik bahawa ia tidak. Jadi mari kita cuba untuk memberitahu cerita ini. Kita akan kembali kepada bahawa apabila kita telah bercakap tentang hex. Mari kita kembali kepada ini dan menyimpulkan dengan perkara ini dipanggil Binky, yang ingat adalah seorang profesor Stanford duduk di rumah bermain dengan claymation, untuk menceritakan kisah tepat program yang sama. Ia hanya kira-kira 3 minit. Di sini kita mempunyai Binky. [Penceramah lelaki pada video] Hei Binky, bangun. Ia adalah masa untuk berseronok penunjuk. [Binky] Apa itu? Belajar mengenai petunjuk? Oh, gula-gula! [Pembesar suara lelaki] Nah, untuk memulakan, saya rasa kita akan memerlukan petunjuk pasangan. [Binky] Okay. Kod ini memperuntukkan 2 petunjuk yang boleh menunjukkan kepada integer. [Penceramah lelaki] Okay. Well, saya melihat 2 petunjuk, tetapi mereka seolah-olah tidak akan menunjuk kepada apa-apa. [Binky] Itu betul. Pada mulanya, petunjuk tidak menunjukkan apa-apa. Perkara-perkara yang mereka menunjukkan dipanggil pointees, dan menetapkan mereka sehingga adalah satu langkah yang berasingan. [Pembesar suara lelaki] Oh, betul, betul. Saya tahu bahawa. The pointees berasingan. Er, jadi bagaimana anda memperuntukkan pointee? [Binky] Okay. Kod ini memperuntukkan pointee integer baru, dan bahagian ini menetapkan x untuk menunjukkan ia. [Penceramah lelaki] Hei, yang kelihatan lebih baik. Jadi membuat ia melakukan sesuatu. >> [Binky] Okay. Saya akan dereference x penunjuk untuk menyimpan nombor 42 ke pointee. Untuk silap mata ini, saya akan memerlukan tongkat sakti saya dereferencing. [Penceramah lelaki] tongkat sakti anda dereferencing? Itu yang besar. [Binky] Ini adalah apa yang kelihatan seperti kod. Saya hanya akan menubuhkan nombor dan ... [Pop bunyi] [Penceramah lelaki] Hey melihat, ada ia pergi. Jadi melakukan satu dereference pada x mengikuti anak panah untuk mengakses pointee itu, dalam kes ini untuk menyimpan 42 di sana. Hei, cuba menggunakan ia untuk menyimpan nombor 13 melalui penunjuk lain, y. [Binky] Okay. Saya hanya akan pergi ke sini untuk y dan mendapatkan nombor 13 menubuhkan dan kemudian mengambil tongkat dereferencing dan hanya ... [Bunyi dengung] Wah! [Penceramah lelaki] Oh hey, yang tidak bekerja. Katakanlah, Binky, saya tidak fikir dereferencing y adalah idea yang baik kerana menubuhkan pointee adalah satu langkah yang berasingan dan saya tidak fikir kita pernah melakukannya. [Binky] Hmm, titik yang baik. [Penceramah lelaki] Yeah. Kami memperuntukkan y penunjuk tetapi kita tidak pernah menetapkan ia untuk menunjukkan pointee satu. [Binky] Hmm, sangat taat. [Pembesar suara lelaki] Hei, anda mencari yang baik di sana, Binky. Anda boleh menetapkan ia supaya mata y kepada pointee sama seperti x? >> [Binky] Pasti. Saya akan menggunakan tongkat sakti saya tugasan penunjuk. [Pembesar suara lelaki] Adakah yang akan menjadi masalah seperti sebelum ini? [Binky] Tidak, ini tidak menyentuh pointees. Ia hanya perubahan satu penunjuk untuk menunjukkan perkara yang sama seperti lain. [Pop bunyi] [Penceramah lelaki] Oh, saya lihat. Sekarang y mata ke tempat yang sama sebagai x. Jadi tunggu. Sekarang y ditetapkan. Ia mempunyai pointee. Jadi, anda boleh cuba tongkat dereferencing sekali lagi untuk menghantar lebih 13. [Binky] Eh, okay. Sini pergi. [Pop bunyi] [Penceramah lelaki] Hei, melihat bahawa. Sekarang dereferencing kerja pada y. Dan kerana penunjuk berkongsi bahawa salah pointee, kedua-dua mereka melihat 13. [Binky] Yeah, perkongsian. Apa sahaja. Jadi, kita akan pergi untuk menukar tempat sekarang? [Penceramah lelaki] Oh melihat, kita berada di luar masa. >> [Binky] Tetapi - [Penceramah lelaki] Hanya ingat 3 peraturan penunjuk. Nombor 1, struktur asas adalah bahawa anda mempunyai penunjuk dan ia menunjuk ke pointee satu. Tetapi penunjuk dan pointee adalah berasingan, dan kesilapan biasa adalah untuk menubuhkan penunjuk tetapi lupa untuk memberikan pointee. Nombor 2, dereferencing pointer bermula pada penunjuk dan mengikuti anak panah ke atas untuk mengakses pointee. Seperti yang kita semua tahu, ini hanya berfungsi jika terdapat pointee, yang jenis mendapat kembali untuk memerintah nombor 1. Nombor 3, tugasan penunjuk mengambil satu penunjuk dan perubahan untuk menunjukkan pointee sama seperti penunjuk lain. Jadi selepas tugasan, 2 penunjuk akan menunjukkan kepada pointee yang sama. Kadang-kadang yang dipanggil perkongsian. Dan itu semua ada ia benar-benar. Selamat tinggal sekarang. Ini adalah Binky. Ini adalah CS50. Kami akan melihat anda minggu depan. [Tepukan] [CS50.TV]