1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Minggu 4, Lanjutan] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Universitas Harvard] 3 00:00:04,240 --> 00:00:07,290 [Ini adalah CS50. - CS50.TV] 4 00:00:07,290 --> 00:00:11,290 >> Ini adalah CS50, dan ini adalah akhir minggu 4. 5 00:00:11,290 --> 00:00:14,030 Jadi beberapa kabar baik dan kabar buruk. 6 00:00:14,030 --> 00:00:26,240 Tidak ada kuliah pada hari Senin, tidak ada masalah ditetapkan minggu depan. [Siswa bersorak] 7 00:00:26,240 --> 00:00:28,680 Anda tidak akan menyukai mana hal ini terjadi. 8 00:00:28,680 --> 00:00:31,590 Tapi kita memiliki ini sebagai gantinya Rabu depan, 9 00:00:31,590 --> 00:00:37,740 dan ada juga per kuliah 1 silabus Jumat depan Jumat sehingga kita bisa tetap di jalur. 10 00:00:37,740 --> 00:00:40,580 Tapi semuanya akan difilmkan seperti biasa, jadi tidak perlu khawatir. 11 00:00:40,580 --> 00:00:44,100 >> Dan berkaitan dengan kuis 0 yang akan kita lakukan menjelang akhir minggu 12 00:00:44,100 --> 00:00:47,140 adalah posting di cs50.net homepage kursus ini penjelasan 13 00:00:47,140 --> 00:00:50,160 macam apa harapan Anda harus memiliki ketika datang ke kuis pertama. 14 00:00:50,160 --> 00:00:55,100 Secara umum, itu akan menjadi pilihan ganda, benar-salah, jawaban singkat, masalah coding pendek. 15 00:00:55,100 --> 00:00:57,360 Kau tidak akan diharapkan untuk melaksanakan setara dengan 16 00:00:57,360 --> 00:01:00,030 dari masalah yang Anda akan lihat di pset, untuk yang Anda memiliki komputer 17 00:01:00,030 --> 00:01:03,240 dan debugger dan sejenisnya, tetapi akan ada masalah coding kecil. 18 00:01:03,240 --> 00:01:06,900 >> Dan memang, panduan terbaik untuk mendapatkan rasa apa CS50 kuis seperti 19 00:01:06,900 --> 00:01:09,180 adalah pergi ke cs50.net, pergi ke link Kuis, 20 00:01:09,180 --> 00:01:11,920 dan Anda dapat melihat beberapa tahun terakhir senilai kuis. 21 00:01:11,920 --> 00:01:16,600 Hanya menyadari bahwa kurikulum tidak selalu sama selama bertahun-tahun. 22 00:01:16,600 --> 00:01:18,510 Kadang-kadang kita tambahkan, kadang-kadang mengurangi, 23 00:01:18,510 --> 00:01:20,670 jadi jika Anda melihat beberapa topik pada salah satu dari orang-orang tua kuis 24 00:01:20,670 --> 00:01:25,380 bahwa Anda tidak tahu apa yang dibicarakan, itu baik bahwa kita menutupinya 25 00:01:25,380 --> 00:01:27,210 atau bahwa kita tidak menutupinya. 26 00:01:27,210 --> 00:01:31,110 Namun dalam bentuk ulasan, ini hari Minggu, Senin, dan Selasa 27 00:01:31,110 --> 00:01:34,770 serta sesi kursus-lebar review pada Minggu malam - 28 00:01:34,770 --> 00:01:37,500 waktu dan lokasi akan diumumkan pada homepage kursus ini - 29 00:01:37,500 --> 00:01:40,120 Anda semua memiliki kesempatan untuk meninjau dengan rekan-rekan mengajar kursus ini 30 00:01:40,120 --> 00:01:44,830 bahan untuk tahun ini, baik dalam bagian dan sebagai kelas penuh, 31 00:01:44,830 --> 00:01:48,400 dan mereka akan difilmkan seperti biasa juga. 32 00:01:48,400 --> 00:01:53,380 >> Baiklah. Jadi tanpa basa-basi lagi, satu komentar pada lulus / gagal dan add / drop. 33 00:01:53,380 --> 00:01:57,980 Anda mungkin telah melihat catatan saya tadi malam, dan ini benar-benar hanya beberapa kepastian tambahan 34 00:01:57,980 --> 00:02:01,250 bahwa jika Anda termasuk orang yang sangat kurang nyaman atau di suatu tempat di antara 35 00:02:01,250 --> 00:02:04,870 dan Anda merasa hanya sedikit di atas kepala Anda, 36 00:02:04,870 --> 00:02:08,430 menyadari bahwa memang cukup normal, dan ada struktur dukungan yang cukup di tempat, 37 00:02:08,430 --> 00:02:13,530 salah satunya jam kantor berniat meningkatkan semua lebih per malam email terakhir saya, 38 00:02:13,530 --> 00:02:16,520 dan menyadari juga bahwa pilihan seperti lulus / gagal untuk kelas seperti ini 39 00:02:16,520 --> 00:02:21,540 benar-benar dimaksudkan sebagai mekanisme untuk mengambil tepi off dari kursus seperti ini, 40 00:02:21,540 --> 00:02:24,200 sehingga lagi jika Anda menghabiskan mereka 10, 15, 20 jam 41 00:02:24,200 --> 00:02:28,160 hanya mencoba untuk mendapatkan beberapa pset untuk bekerja dan Anda tahu bahwa Anda 90-95% dari perjalanan ke sana 42 00:02:28,160 --> 00:02:32,100 tetapi Anda tidak dapat menemukan beberapa bug sialan, dalam lulus / gagal Model yang semacam apa-apa. 43 00:02:32,100 --> 00:02:36,230 >> Idenya adalah bahwa dengan mekanisme yang Anda kemudian dapat pergi fokus pada psets lain 44 00:02:36,230 --> 00:02:39,530 atau tidur atau apa pun yang Anda ingin fokus pada. 45 00:02:39,530 --> 00:02:43,390 Jadi menyadari bahwa Anda telah sampai Selasa ini datang - teknis Senin 5th, 46 00:02:43,390 --> 00:02:50,840 tapi itu hari libur, jadi ini Selasa mendatang - untuk beralih dari lulus / gagal versa dinilai atau sebaliknya. 47 00:02:50,840 --> 00:02:54,450 Dan jika Anda benar-benar di tebing dan berpikir untuk menjatuhkan sama sekali, 48 00:02:54,450 --> 00:02:56,440 mohon menangkap saya setelah kuliah atau drop me catatan. 49 00:02:56,440 --> 00:02:59,990 Kami akan senang untuk setidaknya chatting sebelum Anda tawaran kata perpisahan. 50 00:02:59,990 --> 00:03:03,470 Baiklah. Jadi kita mulai mengambil roda pelatihan off terakhir kali. 51 00:03:03,470 --> 00:03:06,030 Secara khusus, kami fokus pada string. 52 00:03:06,030 --> 00:03:09,740 String adalah sesuatu yang dideklarasikan pada perpustakaan CS50, 53 00:03:09,740 --> 00:03:14,340 khusus dalam file bernama cs50.h yang kita akan mulai melihat minggu ini dan berikutnya. 54 00:03:14,340 --> 00:03:17,250 Tapi string adalah benar-benar hanya penyederhanaan sesuatu 55 00:03:17,250 --> 00:03:20,980 itu sedikit lebih arcanely digambarkan sebagai char *. 56 00:03:20,980 --> 00:03:24,090 Char kita akrab dengan. Ini hanya satu karakter. 57 00:03:24,090 --> 00:03:28,010 Tapi * pada Senin dilambangkan apa? >> [Mahasiswa] pointer. 58 00:03:28,010 --> 00:03:31,290 Sebuah pointer. Dan apa pointer? >> [Mahasiswa] Sebuah alamat. 59 00:03:31,290 --> 00:03:33,420 >> Ini seperti alamat, lokasi di memori. 60 00:03:33,420 --> 00:03:35,910 Apa alamat atau lokasi atau memori? 61 00:03:35,910 --> 00:03:40,290 Sekali lagi, kita semua memiliki laptop dengan pertunjukan atau 2 gigabyte RAM kemungkinan besar hari ini, 62 00:03:40,290 --> 00:03:44,160 dan itu berarti Anda memiliki miliar atau 2 milyar byte senilai memori. 63 00:03:44,160 --> 00:03:46,240 Dan itu tidak terlalu penting apa yang secara fisik terlihat seperti, 64 00:03:46,240 --> 00:03:51,220 tetapi mengambil pada iman bahwa Anda dapat menomori semua byte individu yang memiliki laptop Anda sendiri - 65 00:03:51,220 --> 00:03:54,580 ini adalah byte 0, ini adalah byte 1, ini adalah byte 2 miliar - 66 00:03:54,580 --> 00:03:56,100 dan itulah apa komputer tidak. 67 00:03:56,100 --> 00:04:00,030 Bila Anda mengalokasikan ruang untuk satu karakter, misalnya, 68 00:04:00,030 --> 00:04:02,480 itu jelas harus tinggal di suatu tempat di memori komputer Anda, 69 00:04:02,480 --> 00:04:05,860 dan mungkin itu di nomor 12345 byte, 70 00:04:05,860 --> 00:04:08,470 dan itu di suatu tempat di sini dalam memori komputer Anda. 71 00:04:08,470 --> 00:04:12,630 Dan alamat maka karakter yang 12345. 72 00:04:12,630 --> 00:04:16,140 >> Sekarang, dalam seminggu 0 sampai sekarang sejauh ini, kami belum benar-benar peduli 73 00:04:16,140 --> 00:04:19,170 dimana dalam hal memori disimpan karena kita biasanya menggunakan simbol, 74 00:04:19,170 --> 00:04:22,540 variabel, dan array untuk benar-benar mendapatkan data kami. 75 00:04:22,540 --> 00:04:24,950 Tapi pada hari Senin dan semua lebih hari ini, Anda sekarang akan memiliki 76 00:04:24,950 --> 00:04:27,710 semua lebih ekspresif kemampuan menulis dengan program 77 00:04:27,710 --> 00:04:31,330 untuk benar-benar memanipulasi memori komputer namun Anda lihat cocok, 78 00:04:31,330 --> 00:04:33,720 baik untuk tujuan yang baik dan buruk, 79 00:04:33,720 --> 00:04:39,620 bug menjadi hasil yang sangat umum pada saat ini dalam belajar hal-hal ini. 80 00:04:39,620 --> 00:04:42,460 Tapi apa benar-benar berarti menjadi char *? 81 00:04:42,460 --> 00:04:46,140 Mari kita lanjutkan kembali ke - dan kami akan kembali ke Binky seperti yang dijanjikan hari ini. 82 00:04:46,140 --> 00:04:48,670 Mari kita pergi ke sebuah contoh sederhana di sini. 83 00:04:48,670 --> 00:04:53,060 Mari saya simpan file ini sebagai compare.c, dan biarkan aku hanya mendapatkan beberapa kode template di sini 84 00:04:53,060 --> 00:05:00,490 sehingga termasuk stdio.h, saya juga memberi diriku termasuk cs50.h. Saya akan memperbesar sana. 85 00:05:00,490 --> 00:05:05,850 Mari saya mulai menulis int main, main (void), dan sekarang saya ingin melakukan sesuatu seperti ini: 86 00:05:05,850 --> 00:05:13,520 printf ("Beri aku string:") dan kemudian saya akan menggunakan s string yang akan GetString 87 00:05:13,520 --> 00:05:16,750 untuk mendapatkan string dari pengguna, maka aku akan meminta pengguna untuk satu. 88 00:05:16,750 --> 00:05:21,870 ("Beri aku string lain:") dan aku akan meminta mereka melalui GetString untuk mendapatkan itu. 89 00:05:21,870 --> 00:05:27,020 Saya akan menyebutnya t karena t datang setelah s dan s adalah nama yang bagus untuk string jika itu cukup generik. 90 00:05:27,020 --> 00:05:30,030 Jadi GetString, dan sekarang saya hanya ingin melakukan cek kewarasan dan aku akan mengatakan 91 00:05:30,030 --> 00:05:39,770 if (s == t) maka aku hanya akan memberitahu pengguna printf ("Anda mengetik hal yang sama \ n"); 92 00:05:39,770 --> 00:05:45,520 lagi aku akan mencetak sesuatu seperti ("Anda mengetik sesuatu yang berbeda \ n!") 93 00:05:45,520 --> 00:05:48,460 atau apa pun kalimat akan. Jadi sesuatu seperti itu. 94 00:05:48,460 --> 00:05:52,200 Lalu seperti biasa, saya akan kembali 0 yang hanya menandakan bahwa tidak ada hal buruk terjadi, 95 00:05:52,200 --> 00:05:54,400 dan aku akan pergi ke depan dan mengkompilasi dan menjalankan program ini. 96 00:05:54,400 --> 00:05:56,540 >> Tetapi pada hari Senin kami berlari program ini, 97 00:05:56,540 --> 00:06:00,420 dan benar-benar diberitahu bahwa HELLO tidak HELLO GOODBYE dan tidak GOODBYE. 98 00:06:00,420 --> 00:06:03,140 Perilaku kita lihat adalah sedikit lebih seperti ini. 99 00:06:03,140 --> 00:06:11,450 Biarkan aku pergi ke direktori sumber saya, zoom di sini, dan mari kita lakukan membuat bandingkan. 100 00:06:11,450 --> 00:06:14,570 Disusun oke. Biarkan saya jalankan membandingkan. Beri aku string: HELLO. 101 00:06:14,570 --> 00:06:16,300 Beri aku string lain: HELLO. 102 00:06:16,300 --> 00:06:18,000 Anda mengetik sesuatu yang berbeda! 103 00:06:18,000 --> 00:06:22,650 Nah, biarkan aku mencoba sesuatu yang sederhana seperti 50, 50. Anda mengetik sesuatu yang berbeda! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Jadi jelas, ada sesuatu yang terjadi di sini. 105 00:06:25,740 --> 00:06:28,440 Tapi apa adalah penjelasan mengapa? 106 00:06:28,440 --> 00:06:33,850 Rupanya, baris 12 adalah benar-benar disfungsional. 107 00:06:34,300 --> 00:06:39,430 Apa masalah mendasar di sini? Ya. >> [Mahasiswa] Ini membandingkan alamat. 108 00:06:39,430 --> 00:06:41,850 Ya, tepatnya. Ini benar-benar membandingkan alamat 109 00:06:41,850 --> 00:06:44,580 di mana HELLO HELLO dan disimpan. 110 00:06:44,580 --> 00:06:48,290 Ini tidak membandingkan surat HELLO lagi dan lagi, 111 00:06:48,290 --> 00:06:52,370 karena apa yang sebenarnya terjadi, selama ini kita telah menggunakan GetString - 112 00:06:52,370 --> 00:06:56,130 Papan ini lagi memori komputer kita, 113 00:06:56,130 --> 00:07:00,100 dan katakanlah saya sebut GetString setelah mendeklarasikan variabel s. 114 00:07:00,100 --> 00:07:01,930 Apa memori saya terlihat seperti? 115 00:07:01,930 --> 00:07:07,070 Mari kita sewenang-wenang mengatakan bahwa s terlihat seperti ini. Ini persegi. 116 00:07:07,070 --> 00:07:09,040 Dan cukup banyak setiap saat saya sudah ditarik sepotong memori pada layar 117 00:07:09,040 --> 00:07:12,860 jika 32 bit saya sudah menggambar kotak seperti ini karena memang di alat, 118 00:07:12,860 --> 00:07:17,380 pointer, alamat, adalah 32 bit. Ini sama dengan int. 119 00:07:17,380 --> 00:07:19,420 Yang dapat bervariasi berdasarkan pada sistem komputer. 120 00:07:19,420 --> 00:07:24,630 Bagi Anda yang samar-samar akrab dengan fakta bahwa Anda Mac atau PC adalah 64 bit, 121 00:07:24,630 --> 00:07:28,120 yang benar-benar menunjukkan bahwa komputer Anda menggunakan 64-bit pointer, 122 00:07:28,120 --> 00:07:33,730 64-bit alamat, dan di antara upsides itu adalah komputer Anda 123 00:07:33,730 --> 00:07:35,560 dapat memiliki RAM lebih dari tadi. 124 00:07:35,560 --> 00:07:39,240 Singkat cerita, kembali pada hari ketika komputer hanya digunakan 32 bit 125 00:07:39,240 --> 00:07:42,740 untuk mewakili alamat, jumlah terbesar byte Anda bisa mewakili 126 00:07:42,740 --> 00:07:46,280 dalam hal ini adalah bagaimana jika Anda memiliki 32 bit? 127 00:07:46,280 --> 00:07:49,590 Jadi 4 miliar, benar, karena 2 ke 32 adalah 4 miliar. 128 00:07:49,590 --> 00:07:51,370 Jumlah ini telah berulang dalam kursus. 129 00:07:51,370 --> 00:07:55,240 >> Jadi jika Anda hanya memiliki 32 bit, jumlah tertinggi Anda bisa menghitung sampai kira-kira 4 miliar. 130 00:07:55,240 --> 00:07:58,750 Tapi itu keterbatasan mendasar dari komputer sampai beberapa tahun yang lalu 131 00:07:58,750 --> 00:08:01,180 karena jika Anda hanya dapat menghitung setinggi 4 miliar, 132 00:08:01,180 --> 00:08:05,270 tidak masalah jika Anda membeli 8 gigabyte RAM atau bahkan 5 gigabyte RAM; 133 00:08:05,270 --> 00:08:07,780 Anda tidak dapat menghitung yang tinggi, sehingga itu tidak berguna. 134 00:08:07,780 --> 00:08:11,430 Anda hanya bisa mengakses 3 atau 4 gigabyte pertama memori komputer Anda. 135 00:08:11,430 --> 00:08:14,410 Itu kurang dari sebuah isu sekarang, dan Anda dapat membeli MacBook Pro dan Dells 136 00:08:14,410 --> 00:08:17,680 dengan 8 gigabyte RAM atau bahkan lebih hari ini. 137 00:08:17,680 --> 00:08:24,100 Tapi jika saya mengalokasikan cukup hanya dalam program ini pointer, pointer yang disebut s, 138 00:08:24,100 --> 00:08:28,370 mungkin terlihat seperti ini di layar karena memang kita perlu mengupas lapisan ini. 139 00:08:28,370 --> 00:08:33,520 Saya menyimpan string mengatakan, tetapi pada hari Senin, string adalah benar-benar * char, 140 00:08:33,520 --> 00:08:35,590 alamat beberapa karakter. 141 00:08:35,590 --> 00:08:39,280 Jadi mari kita bahwa roda pelatihan di luar meskipun kita akan terus menggunakan GetString untuk saat ini. 142 00:08:39,280 --> 00:08:42,600 Jadi saya sudah menyatakan s, dan ini adalah sepotong memori, 32 bit. 143 00:08:42,600 --> 00:08:47,370 Apa yang ada di sini di memori secara default? >> [Respon siswa tidak terdengar] 144 00:08:47,370 --> 00:08:50,040 Apa itu? >> [Mahasiswa] Sampah. >> Sampah. Tepat. 145 00:08:50,040 --> 00:08:54,610 Jika Anda programmer tidak memasukkan nilai dalam variabel, yang tahu apa itu? 146 00:08:54,610 --> 00:08:57,990 Kadang-kadang Anda beruntung dan itu 0, yang merupakan jenis nilai, standar yang baik, bersih, 147 00:08:57,990 --> 00:09:00,310 tapi seperti yang kita lihat Senin, kadang-kadang omong kosong, 148 00:09:00,310 --> 00:09:04,130 beberapa nomor positif atau negatif sangat besar yang berasal dari mana? 149 00:09:05,350 --> 00:09:07,010 Ya. >> [Mahasiswa] Fungsi sebelumnya. >> Ya. 150 00:09:07,010 --> 00:09:10,170 >> Seringkali fungsi yang dipanggil sebelumnya karena ingat, 151 00:09:10,170 --> 00:09:13,920 ketika Anda memanggil fungsi-fungsi dalam memori, mereka mengambil ruang lebih banyak dan lebih dari bawah ke atas, 152 00:09:13,920 --> 00:09:17,040 dan segera setelah kembali fungsi, memori yang akan digunakan kembali 153 00:09:17,040 --> 00:09:20,890 oleh orang berikutnya yang dipanggil, yang menggunakan slice yang sama Anda memori. 154 00:09:20,890 --> 00:09:23,450 Dan jika Anda sudah sampah kiri ada, nilai sebelumnya, 155 00:09:23,450 --> 00:09:28,190 kita mungkin keliru s sebagai memiliki beberapa nilai ketika benar-benar kita tidak menaruh apa pun di sana. 156 00:09:28,190 --> 00:09:30,960 Jadi RAM kami di titik ini terlihat seperti ini. 157 00:09:30,960 --> 00:09:36,030 Sekarang di sisi kanan baris 7 kita memanggil GetString, 158 00:09:36,030 --> 00:09:40,150 yang telah kita lakukan sekarang untuk minggu, tapi apa yang benar-benar melakukan GetString? 159 00:09:40,150 --> 00:09:43,350 GetString ditulis oleh staf CS50 adalah sedikit cerdas 160 00:09:43,350 --> 00:09:46,500 di bahwa segera setelah pengguna mulai mengetik tombol Enter dan hits, 161 00:09:46,500 --> 00:09:50,010 GetString angka keluar berapa banyak keystrokes melakukan hit pengguna, 162 00:09:50,010 --> 00:09:53,360 berapa banyak karakter yang saya perlukan untuk mengalokasikan RAM untuk. 163 00:09:53,360 --> 00:09:55,660 Dan di mana RAM yang berasal dari, siapa tahu? 164 00:09:55,660 --> 00:09:58,930 Ini suatu tempat di komputer Anda 2 gigabyte atau entah apa lagi memori. 165 00:09:58,930 --> 00:10:05,200 Tapi anggap bahwa komputer menemukan ruang untuk kata HELLO di sini. 166 00:10:05,200 --> 00:10:08,710 Kata saya mengetik adalah H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Dan jika kita menggambar ini sebagai rangkaian karakter, kita mungkin menarik seperti ini. 168 00:10:13,510 --> 00:10:17,860 Tapi aku perlu melakukan 1 hal ekstra. Apa yang menjadi milik pada akhir setiap string dalam C? 169 00:10:17,860 --> 00:10:20,710 Karakter nol, yang kita tulis sebagai \ 0. 170 00:10:20,710 --> 00:10:23,980 Secara teknis angka 0, tetapi backslash membuat semua semakin jelas 171 00:10:23,980 --> 00:10:28,150 bahwa ini adalah benar-benar angka 0, 0 integer; 172 00:10:28,150 --> 00:10:32,440 itu tidak, untuk 0 misalnya, kutipan-tanda kutip yang Anda mungkin mengetik di keyboard. 173 00:10:32,440 --> 00:10:33,940 Jadi ini adalah HELLO. 174 00:10:33,940 --> 00:10:36,350 >> Dan apa yang kita katakan pada hari Senin bahwa fungsi seperti GetString 175 00:10:36,350 --> 00:10:39,580 sebenarnya kembali semua minggu? 176 00:10:39,580 --> 00:10:43,960 Ini tidak kembali string per se karena itu tidak benar-benar memiliki makna 177 00:10:43,960 --> 00:10:47,710 karena string tidak ada. Mereka semacam fabrikasi di perpustakaan CS50. 178 00:10:47,710 --> 00:10:51,300 Apa benar-benar string, lebih teknis? >> [Mahasiswa] Ini karakter pertama. 179 00:10:51,300 --> 00:10:55,950 Tepat. Ini cukup sederhana alamat dari karakter pertama bahwa pengguna diketik masuk 180 00:10:55,950 --> 00:11:02,810 Jadi, jika kata-kata saya HELLO berakhir itu di nomor 123 byte dan kemudian di nomor 124 byte, 181 00:11:02,810 --> 00:11:08,320 125, 126, dan sebagainya, jika saya hanya nomor byte saya dari 0 ke atas, 182 00:11:08,320 --> 00:11:12,650 apa yang sebenarnya GetString adalah kembali secara harfiah nomor 123. 183 00:11:12,650 --> 00:11:19,270 Jadi apa yang akan dimasukkan ke dalam s adalah nomor 123, bukan huruf H, bukan kata HELLO, 184 00:11:19,270 --> 00:11:23,130 cukup hanya alamat di mana saya dapat menemukan huruf pertama dari HELLO. 185 00:11:23,130 --> 00:11:26,500 Tapi itu tidak tampak seperti cukup. Saya meminta Anda untuk string, bukan karakter. 186 00:11:26,500 --> 00:11:32,970 Jadi bagaimana kita atau komputer tahu bahwa ELLO jenis datang bersama dengan H? 187 00:11:35,760 --> 00:11:37,460 Apa jenis perjanjian yang kita miliki? Ya. 188 00:11:37,460 --> 00:11:40,100 [Mahasiswa] Ini terus mengatakan dirinya menemukan karakter lagi. >> Tepat. 189 00:11:40,100 --> 00:11:44,570 >> Ada konvensi ini manusia-komputer dimana ketika Anda berurusan dengan string, 190 00:11:44,570 --> 00:11:49,410 atau dikenal sekarang sebagai bintang char, Anda hanya perlu mencari tahu 191 00:11:49,410 --> 00:11:54,350 di mana akhir dari setiap string dalam hidup adalah dengan benar-benar hanya iterasi di atasnya dengan untuk loop, 192 00:11:54,350 --> 00:11:57,820 while loop, apa pun, sehingga ketika Anda menemukan akhir string 193 00:11:57,820 --> 00:12:02,160 sekarang Anda dapat menyimpulkan dari itu, oh, seluruh kata itu HELLO. 194 00:12:02,160 --> 00:12:04,820 Bagi Anda dengan pengalaman pemrograman sebelumnya mungkin tahu di Jawa 195 00:12:04,820 --> 00:12:09,880 Anda hanya bisa menelepon dan panjang. dalam bahasa lain Anda dapat menghubungi panjang atau mirip. 196 00:12:09,880 --> 00:12:14,060 Itu karena dalam banyak bahasa, terutama hal-hal yang disebut bahasa berorientasi objek, 197 00:12:14,060 --> 00:12:18,580 panjang dari sesuatu adalah jenis dalamnya dikemas dari sepotong data itu sendiri, 198 00:12:18,580 --> 00:12:24,000 banyak seperti kita dikemas ID dan nama dan rumah dalam seorang mahasiswa pada hari Senin. 199 00:12:24,000 --> 00:12:28,700 Tapi C adalah tingkat yang lebih rendah. Tidak ada benda atau kelas, jika Anda pernah mendengar istilah itu sebelumnya. 200 00:12:28,700 --> 00:12:31,490 Yang harus benar-benar alamat memori. 201 00:12:31,490 --> 00:12:35,540 Jadi ini adalah semacam cara kuno mewakili struktur menarik data. 202 00:12:35,540 --> 00:12:38,760 Anda memiliki nilai awal seperti alamat karakter pertama 203 00:12:38,760 --> 00:12:42,340 dan kemudian hanya beberapa konvensi sewenang-wenang yang semua orang setuju untuk mengikuti. 204 00:12:42,340 --> 00:12:46,420 Jadi bagaimana panjang string diimplementasikan, apakah kita usulkan? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, yang sebagian dari Anda sekarang telah digunakan beberapa kali. Ini cukup sederhana, kan? 206 00:12:51,360 --> 00:12:53,060 Ini seperti 2 baris kode. 207 00:12:53,060 --> 00:12:56,140 Hal ini cukup banyak loop untuk dari beberapa macam, mungkin dengan variabel lokal tambahan. 208 00:12:56,140 --> 00:13:00,540 Tapi strlen hanya harus mengambil pointer dan kemudian mulai mencari \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Dan secepat itu menemukan, itu bisa mengembalikan jumlah langkah yang diambil itu dalam string tersebut. 210 00:13:05,190 --> 00:13:07,150 Jadi kita dapat menyimpulkan dari ini apa yang terjadi di depan. 211 00:13:07,150 --> 00:13:11,850 Misalkan maka saya menyatakan t seperti yang telah saya lakukan di baris 10. 212 00:13:11,850 --> 00:13:14,280 Ini adalah beberapa nilai sampah. Siapa tahu pada awalnya? 213 00:13:14,280 --> 00:13:18,490 Tapi di sisi kanan garis 10 Saya menelepon GetString lagi. 214 00:13:18,490 --> 00:13:20,050 Siapa yang tahu di mana ini berakhir? 215 00:13:20,050 --> 00:13:23,830 Mari kita sewenang-wenang mengatakan bahwa sistem operasi menemukan ruang untuk itu cara di atas sini. 216 00:13:23,830 --> 00:13:28,610 Saya kebetulan kebetulan ketik H-E-L-L-O lagi, 217 00:13:28,610 --> 00:13:31,260 dan sehingga kita dapat menarik jenis yang sama gambar. 218 00:13:31,260 --> 00:13:34,290 Tapi fakta bahwa saya sudah digambar ulang gambar ini disengaja 219 00:13:34,290 --> 00:13:37,720 karena itu adalah berbeda HELLO dari satu ini. 220 00:13:37,720 --> 00:13:43,920 Jadi di sini ini mungkin lokasi 456, ini adalah 457, dan sebagainya. 221 00:13:43,920 --> 00:13:47,170 Jadi apa yang akan ditaruh dimana tanda tanya dulu? 222 00:13:47,170 --> 00:13:50,190 Dalam kasus ini 456. 223 00:13:50,190 --> 00:13:53,540 Kami memilih angka-angka ini sewenang-wenang karena benar-benar setelah hari ini 224 00:13:53,540 --> 00:13:57,110 kita tidak akan peduli begitu banyak tentang apa alamat apa pun. 225 00:13:57,110 --> 00:14:02,690 Yang kami pedulikan adalah bahwa kita dapat mengetahui alamat dari beberapa bagian dari data seperti HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Jadi benar-benar apa yang kebanyakan orang lakukan dalam ilmu komputer ketika berbicara tentang alamat memori 227 00:14:07,100 --> 00:14:10,210 dan berbicara tentang pointer khusus, 228 00:14:10,210 --> 00:14:14,220 daripada repot-repot mencari tahu 123 - siapa yang peduli di mana hal ini sebenarnya, 229 00:14:14,220 --> 00:14:17,440 kita hanya tahu bahwa itu adalah di beberapa alamat numerik - 230 00:14:17,440 --> 00:14:22,180 kita menyederhanakan dunia dan hanya mengatakan bahwa s menunjuk ke karakter yang 231 00:14:22,180 --> 00:14:25,080 dan t menunjuk ke karakter itu. 232 00:14:25,080 --> 00:14:27,430 Dan fakta bahwa itu panah cukup disengaja 233 00:14:27,430 --> 00:14:31,610 karena secara harfiah sekarang s menunjuk H dan t menunjuk pada H lain 234 00:14:31,610 --> 00:14:34,720 karena pada akhir hari, tidak peduli apa alamat tersebut, 235 00:14:34,720 --> 00:14:40,240 tetapi tidak peduli bahwa kita memiliki kemampuan untuk mengekspresikan alamat bahwa dengan beberapa potongan kode. 236 00:14:40,240 --> 00:14:42,730 Kami belum benar-benar dimanipulasi alamat ini dulu 237 00:14:42,730 --> 00:14:47,770 jadi kita akan melihat di mana kita dapat menyisipkan dan semacam melakukan hal-hal dengan pointer, 238 00:14:47,770 --> 00:14:52,030 tapi untuk saat ini sejalan 12 harfiah nilai-nilai apa yang kita membandingkan 239 00:14:52,030 --> 00:14:55,500 menurut cerita ini sejalan 12? 240 00:14:56,570 --> 00:15:01,290 Kami katakan adalah 123 sama sama dengan 456? Dan itu pasti tidak terjadi. 241 00:15:01,290 --> 00:15:05,320 Dan bahkan secara konseptual, pointer ini jelas tidak sama dengan ini 242 00:15:05,320 --> 00:15:09,500 karena Anda disebut GetString dua kali, dan GetString tidak mencoba untuk menjadi super pintar, 243 00:15:09,500 --> 00:15:12,470 tidak mencoba untuk menyadari, oh, Anda ketik HELLO 5 menit lalu; 244 00:15:12,470 --> 00:15:15,090 izinkan saya memberi Anda pointer yang sama seperti yang kuberikan padamu sebelumnya, 245 00:15:15,090 --> 00:15:18,450 itu hanya mengalokasikan sepotong memori baru setiap kali Anda menyebutnya. 246 00:15:18,450 --> 00:15:20,350 >> Jadi bagaimana kita mengatasi masalah ini? 247 00:15:20,350 --> 00:15:24,270 Jika tingkat yang lebih tinggi saya ingin membandingkan string HELLO dan HELLO - 248 00:15:24,270 --> 00:15:28,680 Saya tidak peduli tentang pointer - bagaimana aku pergi tentang menjawab pertanyaan, 249 00:15:28,680 --> 00:15:31,980 apakah pengguna ketik hal yang sama? Apa yang diperlukan di sini? Ya. 250 00:15:31,980 --> 00:15:35,200 [Mahasiswa] Gunakan fungsi. >> Saya dapat menggunakan fungsi keluar dari kotak. 251 00:15:35,200 --> 00:15:38,170 Saya bisa menggunakan fungsi yang disebut strcmp, s-t-r-c-m-p, 252 00:15:38,170 --> 00:15:41,190 hanya versi singkat mengatakan string yang dibandingkan. 253 00:15:41,190 --> 00:15:45,070 Dan jika kita masuk ke, misalnya, membandingkan 2, yang merupakan salah handout hari ini, 254 00:15:45,070 --> 00:15:46,690 Saya melakukan hal itu. 255 00:15:46,690 --> 00:15:51,750 Aku terus segala sesuatu yang lain sama dari baris 1 pada turun ke 26 atau lebih, 256 00:15:51,750 --> 00:15:54,360 dan sekarang perhatikan bagian ini telah berubah hanya sedikit. 257 00:15:54,360 --> 00:15:57,690 Mari kita mengabaikan baris 28 sejenak dan fokus hanya pada satu ini. 258 00:15:57,690 --> 00:16:00,410 Apa yang kita katakan Senin bahwa membandingkan str tidak? 259 00:16:00,410 --> 00:16:05,200 Ini menangani proses mengambil 2 pointer, s dan t dalam hal ini, 260 00:16:05,200 --> 00:16:08,480 semacam hampir meletakkan jari pada orang-2 surat, 261 00:16:08,480 --> 00:16:11,530 dan apa yang harus Anda lakukan adalah sesuatu seperti loop sementara atau untuk loop, 262 00:16:11,530 --> 00:16:16,050 dan mengatakan orang-sama? Jika demikian, bergerak jari atau pointer ke depan. 263 00:16:16,050 --> 00:16:17,970 Apakah ini sama, sama, ini sama, 264 00:16:17,970 --> 00:16:22,710 ini sama, ini sama? Dan ooh, aku di akhir string di kedua s dan t. 265 00:16:22,710 --> 00:16:26,780 Saya belum menemukan kontradiksi. Ya, string ini adalah sama. 266 00:16:26,780 --> 00:16:31,940 Dan apa str membandingkan kembali jika string 2 adalah sama, rupanya? Nol. 267 00:16:31,940 --> 00:16:35,900 Jadi 0 adalah baik dalam hal ini karena jika ia mengembalikan -1 atau +1, 268 00:16:35,900 --> 00:16:40,560 yang berarti bahwa itu hanya terjadi untuk datang sebelum t abjad atau setelah t. 269 00:16:40,560 --> 00:16:43,760 Dan mengapa itu berguna untuk memiliki fungsi yang memberitahu anda string mana yang datang sebelum 270 00:16:43,760 --> 00:16:46,720 atau setelah dalam kamus? 271 00:16:46,720 --> 00:16:48,740 [Mahasiswa] Pencarian. Pencarian >> dan menyortir. 272 00:16:48,740 --> 00:16:51,730 >> Sehingga Anda dapat melakukan hal-hal seperti pencarian biner atau bubble sort atau menggabungkan semacam 273 00:16:51,730 --> 00:16:53,230 di mana Anda harus membandingkan hal. 274 00:16:53,230 --> 00:16:56,420 Sejauh ini kita sudah seperti memotong beberapa sudut dan hanya berbicara tentang pemilahan 275 00:16:56,420 --> 00:16:59,430 dalam konteks angka karena itu bagus dan mudah untuk berbicara tentang, 276 00:16:59,430 --> 00:17:02,430 tetapi Anda pasti dapat membandingkan string, apel dan pisang, 277 00:17:02,430 --> 00:17:05,349 karena jika apel diketahui datang sebelum pisang, sama, 278 00:17:05,349 --> 00:17:09,319 Anda dapat memindahkan string di dalam memori seperti Rob lakukan dengan gabungan semacam dalam video 279 00:17:09,319 --> 00:17:15,880 dan kita lakukan di sini di atas panggung dengan semacam seleksi, insertion sort, dan bubble sort. 280 00:17:15,880 --> 00:17:18,710 Jadi di mana lagi bisa kita ambil ini? Mari kita coba ini. 281 00:17:18,710 --> 00:17:23,980 Semacam Mari kita lupakan tentang pelajaran itu untuk beberapa saat dan coba sekarang dan menyalin 1.c untuk melakukan hal berikut. 282 00:17:23,980 --> 00:17:26,800 Sejalan 21 Saya mengatakan sesuatu cetak, 283 00:17:26,800 --> 00:17:28,520 maka aku mendapatkan string dari user, 284 00:17:28,520 --> 00:17:30,690 maka aku memeriksa ini. 285 00:17:30,690 --> 00:17:33,620 Kami belum benar-benar masuk ke kebiasaan ini, tapi mari kita sekarang melakukan hal ini. 286 00:17:33,620 --> 00:17:40,990 Mari kita benar-benar mengupas lapisan ini. Ini benar-benar char *. Orang ini benar-benar char *. 287 00:17:40,990 --> 00:17:45,690 Jadi apa artinya untuk memeriksa apakah s == NULL? 288 00:17:45,690 --> 00:17:48,380 Ternyata bahwa ketika Anda memanggil fungsi seperti GetString 289 00:17:48,380 --> 00:17:51,540 atau lebih umum hanya meminta komputer untuk memberikan beberapa memori, 290 00:17:51,540 --> 00:17:53,030 sesuatu yang bisa salah. 291 00:17:53,030 --> 00:17:56,630 Anda bisa menjadi gila dan meminta komputer untuk terabyte memori 292 00:17:56,630 --> 00:18:01,780 dengan meminta triliunan byte memori yang hanya tidak ada di komputer, 293 00:18:01,780 --> 00:18:05,130 namun fungsi GetString dan lainnya perlu beberapa cara berteriak pada Anda 294 00:18:05,130 --> 00:18:06,820 jika Anda sudah meminta terlalu banyak. 295 00:18:06,820 --> 00:18:10,450 Dan cara GetString melakukan ini adalah jika Anda telah meminta lebih banyak memori 296 00:18:10,450 --> 00:18:14,250 daripada yang tersedia di komputer, bahkan jika itu super, super rendah probabilitas 297 00:18:14,250 --> 00:18:17,730 karena tidak satupun dari kita akan mengetik satu triliun karakter dan kemudian tekan Enter, 298 00:18:17,730 --> 00:18:21,980 tetapi probabilitas rendah meskipun mungkin, saya masih ingin memeriksa untuk itu berjaga-jaga, 299 00:18:21,980 --> 00:18:26,120 dan nilai khusus yang GetString, jawaban, dan fungsi lainnya kembali 300 00:18:26,120 --> 00:18:30,630 jika sesuatu yang tidak beres adalah NULL dalam semua topi. 301 00:18:30,630 --> 00:18:36,520 >> Dan apa yang NULL? NULL hanya begitu terjadi untuk mewakili pointer. Ini memori 0 address. 302 00:18:36,520 --> 00:18:40,800 Dunia memutuskan bahwa sewenang-wenang, jika ini adalah memori komputer saya - Anda tahu apa? - 303 00:18:40,800 --> 00:18:46,260 kita akan mencuri hanya 1 byte dari memori setiap komputer, dan ini adalah lokasi 0. 304 00:18:46,260 --> 00:18:49,560 Kita akan memberikan julukan NULL, dan kita akan berjanji 305 00:18:49,560 --> 00:18:52,660 bahwa kita tidak akan pernah benar-benar menempatkan data nyata ada 306 00:18:52,660 --> 00:18:56,770 karena kita hanya perlu sewenang-wenang nilai khusus, 0, alias NULL, 307 00:18:56,770 --> 00:19:00,230 sehingga kita bisa berteriak pengguna jika terjadi kesalahan. 308 00:19:00,230 --> 00:19:03,590 Jika tidak, Anda mungkin tidak tahu apakah 0 berarti menempatkan sesuatu di sini 309 00:19:03,590 --> 00:19:05,490 atau apakah itu berarti ada yang tidak beres? 310 00:19:05,490 --> 00:19:09,190 Kita harus semua setuju bahwa tidak berarti NULL dikembalikan, 311 00:19:09,190 --> 00:19:11,700 ada alamat yang sebenarnya dikembalikan. 312 00:19:11,700 --> 00:19:15,210 Sekarang, di sini aku hanya mengadopsi konvensi manusia saya saya kembali 1 dari main 313 00:19:15,210 --> 00:19:17,040 jika terjadi kesalahan. 314 00:19:17,040 --> 00:19:20,650 Itu karena konvensi kembalinya utama adalah untuk kembali 0 jika baik, 315 00:19:20,650 --> 00:19:22,990 1 atau beberapa nilai lain jika buruk. 316 00:19:22,990 --> 00:19:28,200 Tapi GetString dan setiap fungsi yang berhubungan dalam mengembalikan memori NULL jika sesuatu berjalan buruk. 317 00:19:28,200 --> 00:19:33,480 >> Oke. Jadi, sayangnya, jalur 27, super sederhana meskipun, benar-benar gagal untuk menyalin string. 318 00:19:33,480 --> 00:19:35,740 Kenapa? Kita bisa melihat ini sebagai berikut. 319 00:19:35,740 --> 00:19:40,120 Saya mengklaim sejalan 27 akan membuat salinan s dan menyebutnya t. 320 00:19:40,120 --> 00:19:45,790 Jadi aku tidak meminta pengguna untuk 2 string saat ini, aku hanya mengatakan nilai dalam s 321 00:19:45,790 --> 00:19:47,870 harus dimasukkan ke dalam t juga. 322 00:19:47,870 --> 00:19:52,890 Jadi sekarang hanya untuk menunjukkan bagaimana rusak ini, sejalan 29 seterusnya apa yang saya lakukan? 323 00:19:52,890 --> 00:19:56,980 Pertama saya memeriksa apakah panjang t lebih besar dari 0. 324 00:19:56,980 --> 00:19:59,330 Ada beberapa string sana. Pengguna mengetik sesuatu masuk 325 00:19:59,330 --> 00:20:03,410 Apa baris 32 dilakukan, rupanya? 326 00:20:03,410 --> 00:20:08,910 [Respon siswa terdengar] Kanan >>. Anda dapat menyimpulkan jenis itu dari apa yang saya katakan itu melakukan. 327 00:20:08,910 --> 00:20:13,200 Tapi secara teknis, apa ini lakukan? t [0] mewakili apa? 328 00:20:13,200 --> 00:20:15,140 [Mahasiswa] Karakter zeroth. >> [Malan] Karakter zeroth. 329 00:20:15,140 --> 00:20:19,620 Atau, lebih mirip manusia, karakter pertama di t, apa pun itu, H mungkin dalam kasus ini. 330 00:20:19,620 --> 00:20:24,990 Dan toupper melakukan apa yang dikatakannya. Ini mengkapitalisasi karakter zeroth dari t dan perubahan itu. 331 00:20:24,990 --> 00:20:28,430 Jadi ini berarti mengambil karakter ke nol dari t, membuatnya huruf besar, 332 00:20:28,430 --> 00:20:30,320 dan dimasukkan kembali ke dalam lokasi yang sama. 333 00:20:30,320 --> 00:20:35,540 Jadi jika saya ketik halo dalam huruf kecil, ini harus mengubah h huruf kecil ke H. modal 334 00:20:35,540 --> 00:20:41,400 Tapi masalahnya adalah bahwa dalam garis 35 dan 36 apa yang saya lakukan adalah mencetak bagi kita s dan t. 335 00:20:41,400 --> 00:20:43,120 Dan apa dugaan Anda? 336 00:20:43,120 --> 00:20:47,250 Apa yang saya benar-benar akan melihat apakah saya mengetik di halo dalam huruf kecil semua? 337 00:20:47,250 --> 00:20:52,280 Apa yang akan mendapatkan dicetak? >> [Respon siswa terdengar] >> Apa itu? 338 00:20:52,280 --> 00:20:58,360 [Mahasiswa] Big H dan sisanya kecil. >> The H besar dan sisanya kecil yang, s atau t? 339 00:20:58,360 --> 00:21:03,170 [Mahasiswa] Kedua. Keduanya >>. Tepat. Jadi mari kita lihat apa yang terjadi di sini. 340 00:21:03,170 --> 00:21:08,380 >> Biarkan aku pergi ke depan dan kompilasi ini. Ini adalah copy1, sehingga membuat copy1. Baiklah. 341 00:21:08,380 --> 00:21:14,840 Zoom in Biarkan aku pergi ke depan dan menjalankan copy1, Enter, Katakan sesuatu: halo dalam huruf kecil. 342 00:21:14,840 --> 00:21:19,570 Ini dikapitalisasi copy, tapi rupanya dikapitalisasi asli juga, 343 00:21:19,570 --> 00:21:22,070 karena apa yang sekarang terjadi dalam cerita ini? 344 00:21:22,070 --> 00:21:27,030 Sejalan 27 Saya tidak benar-benar tampaknya menyalin string, 345 00:21:27,030 --> 00:21:30,450 tapi meskipun Anda mungkin intuitif berharap bahwa akan terjadi, 346 00:21:30,450 --> 00:21:33,680 jika Anda berpikir tentang gambar ini, apa yang sebenarnya telah saya lakukan? 347 00:21:33,680 --> 00:21:35,410 Setengah dari gambar yang sama. 348 00:21:35,410 --> 00:21:39,390 Jadi mari kita memutar kembali dalam waktu sehingga t belum ada dalam cerita. 349 00:21:39,390 --> 00:21:43,160 S bisa eksis dalam cerita, tapi mari kita huruf kecil halo saat ini. 350 00:21:43,160 --> 00:21:46,710 Jadi biarkan saya memperbaiki apa yang saya benar-benar diketik masuk 351 00:21:46,710 --> 00:21:51,280 Dalam hal ini di sini kita memiliki h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Kami akan menggambar sebagai urutan karakter, memasang garis pemisah saya di sini dan \ saya 0. 353 00:21:58,050 --> 00:22:05,980 Jadi ini adalah di mana kita secepat baris 1 sampai 24-ish, memberi atau mengambil, telah dieksekusi. 354 00:22:05,980 --> 00:22:07,800 Ini adalah gambar dari ingatanku. 355 00:22:07,800 --> 00:22:10,800 Ketika saya sampai ke baris 27, apa yang terjadi? 356 00:22:10,800 --> 00:22:14,730 Sama seperti sebelumnya, saya mendapatkan pointer, yang saya akan menarik sebagai alun-alun ini. 357 00:22:14,730 --> 00:22:19,740 Ini disebut t. Dan apa nilainya secara default? Siapa yang tahu? Beberapa nilai sampah. 358 00:22:19,740 --> 00:22:22,060 >> Jadi saya akan abstrak yang jauh sebagai tanda tanya. 359 00:22:22,060 --> 00:22:27,670 Dan segera setelah sisi kanan baris 27 mengeksekusi, apa yang saya meletakkan dalam t? 360 00:22:27,670 --> 00:22:30,770 Hal yang sama yang ada di s. 361 00:22:30,770 --> 00:22:34,120 Jadi jika kita sejenak menghapus abstraksi panah dan kita katakan, 362 00:22:34,120 --> 00:22:40,330 oh, ini adalah memori beban alamat 123, ketika Anda mengatakan t mendapat s, titik koma, 363 00:22:40,330 --> 00:22:42,700 Anda benar-benar menempatkan 123 di sini. 364 00:22:42,700 --> 00:22:45,200 Sekarang jika kita jenis menyederhanakan dunia kita lagi dengan gambar, 365 00:22:45,200 --> 00:22:48,750 apa yang telah Anda benar-benar dilakukan hanya menambahkan panah lain untuk dunia Anda 366 00:22:48,750 --> 00:22:52,910 yang menunjuk dari t ke string yang sama persis. 367 00:22:52,910 --> 00:22:59,730 Jadi ketika di baris 31 dan 32 saya benar-benar pergi tentang mengubah t [0], 368 00:22:59,730 --> 00:23:05,580 apa yang t [0] tampaknya identik dengan sekarang? s [0] 369 00:23:05,580 --> 00:23:07,030 Jadi itulah semua yang terjadi. 370 00:23:07,030 --> 00:23:09,900 Dan meskipun semacam ini terasa dari tingkat rendah kecil dan misterius 371 00:23:09,900 --> 00:23:12,760 dan ini semacam terasa seperti mungkin intuitif ini seharusnya hanya bekerja - 372 00:23:12,760 --> 00:23:15,410 Saya telah membuat salinan dari hal-hal sebelum dan itu hanya bekerja - 373 00:23:15,410 --> 00:23:18,590 jika Anda benar-benar berpikir tentang apa string benar-benar, itu adalah char *. 374 00:23:18,590 --> 00:23:21,700 Nah, apa itu? Ini alamat beberapa karakter. 375 00:23:21,700 --> 00:23:24,930 Maka mungkin akan lebih masuk akal bahwa ketika Anda mencoba untuk melakukan sesuatu 376 00:23:24,930 --> 00:23:29,220 Super tampaknya sederhana seperti ini, semua yang Anda lakukan adalah menyalin alamat memori. 377 00:23:29,220 --> 00:23:32,530 Anda tidak benar-benar melakukan apa-apa dengan string itu sendiri. 378 00:23:32,530 --> 00:23:37,500 Jadi bahkan jika Anda tidak tahu bagaimana Anda akan memecahkan masalah ini dalam kode, 379 00:23:37,500 --> 00:23:45,080 tingkat tinggi, secara konseptual, apa yang perlu kita lakukan untuk membuat ta copy sejati s, rupanya? 380 00:23:46,670 --> 00:23:48,820 Ya. >> [Mahasiswa] Berikan lokasi baru? >> Tepat. 381 00:23:48,820 --> 00:23:50,800 >> Kita perlu memberikan t lokasi baru. 382 00:23:50,800 --> 00:23:55,230 Kita perlu entah bagaimana membuat sebuah dunia di mana kita mendapatkan sepotong baru memori, 383 00:23:55,230 --> 00:24:00,090 yang hanya demi kejelasan, aku akan menggambar tepat di bawah satu ini, tapi itu tidak perlu berada di sana. 384 00:24:00,090 --> 00:24:04,880 Tapi perlu ukuran yang sama, jadi saya akan menggambar garis-garis vertikal di tempat yang sama. 385 00:24:04,880 --> 00:24:09,720 Tidak apa-apa jika ini adalah sampah semua awalnya. Siapa yang tahu apa yang ada di sana? 386 00:24:09,720 --> 00:24:13,850 Tetapi langkah 1 akan harus memberi saya memori sebanyak yang saya butuhkan 387 00:24:13,850 --> 00:24:18,630 agar sesuai salinan halo, kemudian mencari tahu bagaimana untuk menyalin h di sini, e di sini, 388 00:24:18,630 --> 00:24:20,390 l sini dan sebagainya. 389 00:24:20,390 --> 00:24:24,880 Tapi ini harus sudah merasa sedikit jelas bahkan jika beberapa detail yang masih abstrak. 390 00:24:24,880 --> 00:24:28,690 Untuk menyalin string ini ke dalam ini, itu hanya untuk loop atau loop sementara 391 00:24:28,690 --> 00:24:31,580 atau sesuatu dengan yang Anda sudah menjadi semua lebih akrab. 392 00:24:31,580 --> 00:24:35,970 Jadi mari kita coba ini. Biarkan aku pergi ke copy2.c. 393 00:24:35,970 --> 00:24:43,270 Dalam copy2.c kami memiliki hampir program yang sama kecuali untuk jalur 27. 394 00:24:43,270 --> 00:24:47,260 Ini terlihat sedikit rumit, tetapi jika kita jatuhkan itu sepotong demi sepotong, 395 00:24:47,260 --> 00:24:48,950 sisi kiri adalah sama. 396 00:24:48,950 --> 00:24:52,790 Char * t menciptakan hal ini dalam memori, meskipun dengan tanda tanya 397 00:24:52,790 --> 00:24:54,680 karena kita tidak tahu apa yang ada secara default. 398 00:24:54,680 --> 00:24:57,920 Di sisi kanan kita sekarang memperkenalkan fungsi malloc, baru, 399 00:24:57,920 --> 00:25:00,640 untuk memori mengalokasikan, memberi saya memori, 400 00:25:00,640 --> 00:25:06,900 dan itu tampaknya membutuhkan berapa banyak argumen, berapa banyak hal di dalam kurung? 401 00:25:09,660 --> 00:25:12,130 Aku mendengar sungut dari 1 dan 2, tapi itu hanya 1. 402 00:25:12,130 --> 00:25:15,320 Tidak ada koma, yang berarti hanya ada 1 hal di dalam tanda kurung. 403 00:25:15,320 --> 00:25:17,720 Meskipun ada tanda kurung lain, biarkan saya menyorot 404 00:25:17,720 --> 00:25:21,460 apa bagian dalam kurung terluar, dan itu ungkapan ini: 405 00:25:21,460 --> 00:25:25,880 (Strlen (s) + 1) * sizeof (char). 406 00:25:25,880 --> 00:25:29,190 Jadi jika kita benar-benar berpikir ini melalui, ini mengatakan memberi saya panjang s. 407 00:25:29,190 --> 00:25:34,440 Mengapa saya, meskipun, menambahkan 1 ke panjang? >> [Respon siswa tidak terdengar] 408 00:25:34,440 --> 00:25:40,200 Tepat. Kami membutuhkan ruang untuk orang ini di ekor, karakter keenam yang tidak memiliki arti English 409 00:25:40,200 --> 00:25:42,250 tetapi memiliki arti program khusus. 410 00:25:42,250 --> 00:25:46,800 >> Jadi kita perlu + 1 untuk itu karena strlen mengembalikan harapan manusia panjang, 411 00:25:46,800 --> 00:25:50,890 Halo atau 5, tidak memberikan karakter null tambahan. 412 00:25:50,890 --> 00:25:52,980 Jadi saya secara manual menambahkan dengan + 1. 413 00:25:52,980 --> 00:25:56,060 Dan kemudian ini, * ukuran (char), kami belum melihat ini sebelumnya. 414 00:25:56,060 --> 00:25:57,480 Ini bukan teknis fungsi. 415 00:25:57,480 --> 00:26:04,150 Ini adalah kata kunci khusus yang hanya memberitahu Anda apa ukuran adalah dari beberapa tipe data pada komputer 416 00:26:04,150 --> 00:26:06,980 karena pada kenyataannya, sebagian dari kita memiliki 32-bit komputer. 417 00:26:06,980 --> 00:26:10,900 Saya memiliki komputer yang cukup tua di rumah, dan hanya menggunakan 32 bit untuk mewakili pointer. 418 00:26:10,900 --> 00:26:13,900 Dan jadi jika saya melakukan ukuran tipe data, mungkin 32 bit. 419 00:26:13,900 --> 00:26:18,300 Tapi kalau aku menggunakan komputer baru mewah saya, saya bisa mendapatkan kembali nilai 64 bit 420 00:26:18,300 --> 00:26:20,510 untuk sesuatu seperti alamat. 421 00:26:20,510 --> 00:26:25,400 Jadi dalam hal ini, untuk amannya super, kita tidak akan sesuatu kode keras seperti - 422 00:26:25,400 --> 00:26:28,740 baik, apa ukuran char sesuai dengan apa yang kita katakan sejauh ini? 423 00:26:28,740 --> 00:26:34,450 Kami sudah cukup banyak mengatakan secara lisan bahwa itu 1 byte, dan itu cukup banyak benar di seluruh papan. 424 00:26:34,450 --> 00:26:37,000 Tapi sekali lagi, asumsi cenderung buruk. 425 00:26:37,000 --> 00:26:40,850 Mereka mengarah ke perangkat lunak kereta jika orang menggunakan perangkat lunak Anda dengan cara yang tidak anda inginkan. 426 00:26:40,850 --> 00:26:44,750 So abstrak mari kita pergi dan ini hanya lebih umum mengatakan 427 00:26:44,750 --> 00:26:46,830 Saya mau ini potongan banyak memori 428 00:26:46,830 --> 00:26:50,210 dan setiap potongan memori harus setara dengan ukuran karakter, 429 00:26:50,210 --> 00:26:54,870 yang sebenarnya sama dengan 1 dalam kasus ini, tapi itu cara yang lebih generik menulis itu. 430 00:26:54,870 --> 00:27:00,460 Jadi jika kata tersebut halo, berapa banyak byte yang tampaknya malloc mengalokasikan untuk hello? 431 00:27:00,460 --> 00:27:04,980 [Mahasiswa] Enam. Enam >>. Persis seperti banyak seperti yang telah kita tanda tanya di layar. 432 00:27:04,980 --> 00:27:07,800 Dan kemudian mengambil menebak sekarang didasarkan pada pemahaman Anda tentang GetString 433 00:27:07,800 --> 00:27:12,790 apa malloc mungkin kembali? >> [Mahasiswa] Sebuah alamat. 434 00:27:12,790 --> 00:27:17,020 Sebuah alamat apa? Dari potongan pertama dari memori. 435 00:27:17,020 --> 00:27:20,670 >> Kami tidak tahu apa yang ada karena beberapa fungsi lain 436 00:27:20,670 --> 00:27:23,010 bisa saja menggunakan memori ini sebelumnya. 437 00:27:23,010 --> 00:27:28,380 Tapi malloc, seperti GetString, mengembalikan alamat dari byte pertama dari memori 438 00:27:28,380 --> 00:27:30,540 yang telah disisihkan untuk Anda. 439 00:27:30,540 --> 00:27:38,380 Namun, apa yang tidak lakukan adalah mengisi kosong ini dengan karakter null backslash 440 00:27:38,380 --> 00:27:43,030 karena ternyata Anda dapat menggunakan malloc untuk mengalokasikan apapun: ints, string, array, 441 00:27:43,030 --> 00:27:45,700 mengapung, struktur mahasiswa. 442 00:27:45,700 --> 00:27:47,750 Anda dapat menggunakan malloc sepenuhnya umum. 443 00:27:47,750 --> 00:27:51,470 Ia tidak peduli atau harus tahu apa yang Anda mengalokasikan memori untuk. 444 00:27:51,470 --> 00:27:55,810 Jadi akan gegabah untuk malloc untuk menempatkan \ 0 445 00:27:55,810 --> 00:27:58,340 pada akhir setiap potongan memori itu memberi Anda 446 00:27:58,340 --> 00:28:02,620 karena ini \ 0 hal hanyalah sebuah konvensi untuk string. 447 00:28:02,620 --> 00:28:06,310 Ini tidak digunakan untuk ints, itu tidak digunakan untuk mengapung, itu tidak digunakan untuk siswa. 448 00:28:06,310 --> 00:28:11,730 Dan sehingga Gotcha dengan malloc adalah bahwa beban sepenuhnya pada Anda programmer 449 00:28:11,730 --> 00:28:16,790 untuk mengingat berapa banyak byte yang Anda dialokasikan dan tidak pernah menggunakan untuk loop 450 00:28:16,790 --> 00:28:21,570 atau while loop dan melewati batas dari sepotong memori Anda telah diberikan. 451 00:28:21,570 --> 00:28:23,540 Dengan kata lain, segera setelah Anda mengalokasikan memori, 452 00:28:23,540 --> 00:28:28,510 Anda tidak dapat meminta sistem operasi, oh, by the way, seberapa besar dari sepotong memori itu? 453 00:28:28,510 --> 00:28:32,080 Itu sepenuhnya terserah Anda untuk mengingat jika Anda memerlukan nilai tersebut. 454 00:28:32,080 --> 00:28:34,330 >> Jadi mari kita lihat bagaimana saya melanjutkan untuk menggunakan memori ini. 455 00:28:34,330 --> 00:28:38,430 Sejalan 28 dan 29 mengapa aku melakukan ini? 456 00:28:39,850 --> 00:28:42,260 Hanya cek Total kewarasan. 457 00:28:42,260 --> 00:28:45,110 Hanya dalam kasus sesuatu yang tidak beres, saya meminta beberapa jumlah gila memori 458 00:28:45,110 --> 00:28:48,690 atau saya telah begitu banyak hal yang berjalan pada komputer yang ada saja tidak cukup memori, 459 00:28:48,690 --> 00:28:51,780 sesuatu seperti itu, saya setidaknya ingin untuk memeriksa null. 460 00:28:51,780 --> 00:28:55,260 Pada kenyataannya, kebanyakan komputer akan memberikan ilusi bahwa setiap program 461 00:28:55,260 --> 00:28:57,080 dapat menggunakan keseluruhan RAM Anda, 462 00:28:57,080 --> 00:29:00,740 tetapi meskipun demikian, jika pengguna jenis dalam beberapa string panjang gila mungkin karena mereka orang jahat 463 00:29:00,740 --> 00:29:03,440 dan mereka benar-benar mencoba untuk crash program atau hack ke dalamnya, 464 00:29:03,440 --> 00:29:07,300 Anda ingin setidaknya memeriksa nilai kembali dari malloc dan apakah itu sama dengan nol. 465 00:29:07,300 --> 00:29:11,630 Dan jika tidak, mari kita berhenti sekarang karena saya tidak tahu apa yang harus dilakukan dalam kasus itu. 466 00:29:11,630 --> 00:29:13,950 Bagaimana cara menyalin string? Ada beberapa cara untuk melakukan hal ini. 467 00:29:13,950 --> 00:29:18,850 Ada str menyalin fungsi di C, tapi itu super sederhana bagi kita untuk melakukan hal ini dengan cara kuno. 468 00:29:18,850 --> 00:29:23,110 >> Pertama biarkan saya mencari tahu apa yang panjang s. 469 00:29:23,110 --> 00:29:26,930 Saya bisa menempatkan ini dalam loop tetapi aku hanya menaruhnya di sini untuk kejelasan. 470 00:29:26,930 --> 00:29:30,610 Jadi n sekarang menyimpan panjang string asli, yang tampaknya 5. 471 00:29:30,610 --> 00:29:35,290 Kemudian dalam loop untuk saya, saya iterasi dari 0 pada hingga n, 472 00:29:35,290 --> 00:29:40,940 dan pada setiap iterasi saya menempatkan s [i] dalam t [i]. 473 00:29:40,940 --> 00:29:45,060 Jadi itulah yang saya tersirat dengan 2 jari saya menunjuk pada string sebelum. 474 00:29:45,060 --> 00:29:49,260 Karena ini untuk loop iterates seperti ini, saya akan menyalin h ke sini, 475 00:29:49,260 --> 00:29:52,890 e ke sini, l ke sini karena ini adalah s, ini t. 476 00:29:52,890 --> 00:29:58,770 Dan kemudian terakhir, sejalan 35 mengapa aku melakukan ini? 477 00:29:58,770 --> 00:30:03,770 Saya harus memastikan bahwa saya mengakhiri t string. 478 00:30:03,770 --> 00:30:06,170 Dan saya melakukannya dengan cara ini menjadi super eksplisit. 479 00:30:06,170 --> 00:30:09,510 Tapi mengusulkan, seseorang, jika Anda bisa, dengan cara yang berbeda untuk melakukan hal ini. 480 00:30:09,510 --> 00:30:13,930 Saya tidak benar-benar membutuhkan jalur 35. Ada cara lain untuk melakukan hal ini. 481 00:30:13,930 --> 00:30:18,880 Ya. >> [Respon siswa terdengar] >> Katakanlah keras. 482 00:30:18,880 --> 00:30:20,960 [Mahasiswa] Kurang dari atau sama dengan. >> Tepat. 483 00:30:20,960 --> 00:30:24,450 Kami hanya bisa mengatakan kurang dari atau sama dengan n, yang pada umumnya telah buruk 484 00:30:24,450 --> 00:30:28,190 karena hampir selalu ketika kita pergi ke suatu hal yang sama dengan kita menghitung 485 00:30:28,190 --> 00:30:30,000 kita pergi 1 langkah terlalu jauh. 486 00:30:30,000 --> 00:30:32,170 Tapi ingat, berapa banyak byte yang kita alokasikan? 487 00:30:32,170 --> 00:30:37,210 Kami dialokasikan strlen dari s, maka 5 + 1 untuk total 6. 488 00:30:37,210 --> 00:30:39,980 Jadi dalam hal ini kita bisa melakukan sesuatu seperti ini 489 00:30:39,980 --> 00:30:46,450 sehingga kita menyalin bukan hanya halo tetapi juga \ 0 di akhir. 490 00:30:46,450 --> 00:30:49,860 Atau, kita bisa menggunakan fungsi yang disebut salinan str, strcpy, 491 00:30:49,860 --> 00:30:51,700 tapi itu tidak akan menyenangkan hampir sama banyak. 492 00:30:51,700 --> 00:30:54,000 Tapi itu semua hal ini di bawah tenda. 493 00:30:54,000 --> 00:30:56,050 Kemudian terakhir, kami melakukan hal yang sama seperti sebelumnya. 494 00:30:56,050 --> 00:31:01,620 Saya memanfaatkan t dan kemudian saya mengklaim bahwa aslinya terlihat seperti ini dan salin terlihat seperti itu. 495 00:31:01,620 --> 00:31:08,570 Jadi mari kita coba ini sekarang. Biarkan aku pergi di sini. Membuat COPY2. Kami akan memperbesar dan menjalankan COPY2. 496 00:31:08,570 --> 00:31:13,840 Aku akan mengetik halo dalam huruf kecil, dan memang saya mendapatkan huruf kecil halo seperti aslinya 497 00:31:13,840 --> 00:31:16,930 tapi modal Hello untuk salin. 498 00:31:16,930 --> 00:31:20,300 Tapi aku tidak dilakukan dulu. Saya perlu melakukan 1 hal terakhir di sini. 499 00:31:20,300 --> 00:31:28,000 46 dan 47 jelas membebaskan memori, tapi apa yang benar-benar berarti? 500 00:31:28,000 --> 00:31:33,250 Apa yang saya lakukan, apakah Anda berpikir, dengan memanggil baris 46 dan baris 47? 501 00:31:33,250 --> 00:31:38,900 Apa efek tidak yang memiliki? Ya. 502 00:31:38,900 --> 00:31:43,140 [Respon siswa terdengar] >> Tepat. 503 00:31:43,140 --> 00:31:46,380 >> Anda hanya mengatakan sistem operasi, hey, terima kasih untuk memori ini. 504 00:31:46,380 --> 00:31:48,320 Sekarang Anda dapat menggunakannya untuk orang lain. 505 00:31:48,320 --> 00:31:50,790 Dan di sini adalah contoh sempurna dari nilai sampah. 506 00:31:50,790 --> 00:31:55,430 Saya baru saja menggunakan memori ini untuk menuliskan kata halo di 2 tempat, 507 00:31:55,430 --> 00:31:57,490 di sini, di sini, di sini, dan di sini. 508 00:31:57,490 --> 00:32:00,910 Jadi ini adalah h-e-l-l-o-\ 0. 509 00:32:00,910 --> 00:32:06,960 Tapi kemudian saya sebut baris 46 dan baris 47, dan Anda tahu apa yang terjadi di sana dalam hal gambar? 510 00:32:06,960 --> 00:32:10,010 Sebenarnya, tunggu, gambar ini merupakan yang lama. 511 00:32:10,010 --> 00:32:12,550 Setelah kita membuat copy, orang ini sebenarnya menunjuk di sini, 512 00:32:12,550 --> 00:32:16,110 jadi mari kita menghapus angka dan hanya abstrak pergi sebagai panah kami lagi. 513 00:32:16,110 --> 00:32:19,370 Apa yang terjadi dalam gambar ini ketika saya menelepon gratis? 514 00:32:19,370 --> 00:32:22,750 [Respon siswa terdengar] >> Bahkan tidak. 515 00:32:22,750 --> 00:32:29,510 Jika saya sebut gratis di s dan t - jenis pertanyaan jebakan - gambar ini tidak berubah sama sekali 516 00:32:29,510 --> 00:32:33,880 karena memanggil s dan memanggil t hanya memberitahu sistem operasi, 517 00:32:33,880 --> 00:32:39,010 hey, Anda dapat menggunakan memori ini lagi, tapi itu tidak mengubah ini untuk null 518 00:32:39,010 --> 00:32:41,840 atau beberapa karakter khusus, tidak mengubah hal ini, 519 00:32:41,840 --> 00:32:47,350 itu tidak mengubah h atau e atau l atau l atau o baik dalam tempat untuk hal lain. 520 00:32:47,350 --> 00:32:51,610 Dalam hal gambar, segera setelah Anda panggilan gratis, tidak ada perubahan. 521 00:32:51,610 --> 00:32:56,570 Dan di situlah letak asal nilai sampah karena jika saya kemudian dalam program ini 522 00:32:56,570 --> 00:33:01,010 meminta sistem operasi untuk memori lebih dengan GetString atau malloc atau sesuatu seperti itu 523 00:33:01,010 --> 00:33:04,900 dan sistem operasi mengatakan, yakin, saya memiliki 12 byte memori hanya membebaskan, 524 00:33:04,900 --> 00:33:08,080 menggunakan, apa yang Anda akan diserahkan? 525 00:33:08,080 --> 00:33:10,830 Kau akan diserahkan sepotong memori yang kita biasanya akan menarik 526 00:33:10,830 --> 00:33:13,700 dengan tanda tanya, tapi apa yang mereka tanda tanya? 527 00:33:13,700 --> 00:33:17,000 Mereka kebetulan h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Ini adalah nilai-nilai baru kami sampah segera setelah Anda membebaskan memori itu. 529 00:33:20,940 --> 00:33:22,750 >> Ada implikasi dunia nyata di sini juga. 530 00:33:22,750 --> 00:33:24,720 Hal ini terjadi berkaitan dengan RAM, tetapi komputer Anda 531 00:33:24,720 --> 00:33:26,720 benar-benar melakukan hal yang sama dengan disk. 532 00:33:26,720 --> 00:33:30,620 Kita akan membicarakan ini secara khusus dengan sejumlah masalah di masa depan yang berfokus pada forensik. 533 00:33:30,620 --> 00:33:36,170 Tapi apa yang sebenarnya terjadi jika Anda memiliki beberapa file keuangan yang sensitif pada desktop Anda 534 00:33:36,170 --> 00:33:39,600 atau JPEG samar dan Anda tarik ke tempat sampah Anda, 535 00:33:39,600 --> 00:33:44,390 apa yang terjadi ketika Anda tarik ke tempat sampah atau recycle bin? 536 00:33:44,390 --> 00:33:47,240 Kau tahu apa yang saya bicarakan. [Tertawa] 537 00:33:47,240 --> 00:33:52,370 Apa yang terjadi ketika Anda sudah diseret bukti bahwa ke recycle bin atau sampah? 538 00:33:52,370 --> 00:33:55,920 [Respon siswa tidak terdengar] 539 00:33:55,920 --> 00:33:58,000 Nah, begitu hati-hati. Apa yang terjadi ketika Anda melakukan itu? 540 00:33:58,000 --> 00:34:01,030 Jawaban singkatnya adalah tidak, kan? 541 00:34:01,030 --> 00:34:04,790 File samar atau sensitif masih hanya duduk di sana di suatu tempat di hard drive Anda. 542 00:34:04,790 --> 00:34:07,940 Sebagian besar dari kita setidaknya telah belajar dengan cara yang keras bahwa Anda perlu untuk mengosongkan sampah Anda 543 00:34:07,940 --> 00:34:10,429 atau Anda recycle bin untuk benar-benar menghapus file. 544 00:34:10,429 --> 00:34:13,440 Dan memang, ketika Anda mengklik kanan atau klik pada Kontrol sampah Anda dapat 545 00:34:13,440 --> 00:34:15,580 atau pilih File, Empty Trash atau apa pun 546 00:34:15,580 --> 00:34:21,420 dan Anda benar-benar mengosongkan tempat sampah atau recycle bin, apa yang sebenarnya terjadi kemudian ke gambar ini? 547 00:34:22,810 --> 00:34:25,969 Lebih apa-apa. Jadi tidak ada yang benar-benar terjadi pada disk. 548 00:34:25,969 --> 00:34:30,880 >> Dan jika kita hanya sementara ngelantur dan menulis - aku akan hanya menggunakan bagian belakang ini. 549 00:34:30,880 --> 00:34:34,639 Jadi sekarang cerita berubah dari RAM, yang mana program tersebut ada 550 00:34:34,639 --> 00:34:39,250 saat Anda sedang menjalankan mereka, ke disk, yang mana mereka disimpan jangka panjang 551 00:34:39,250 --> 00:34:42,920 bahkan ketika listrik padam, untuk saat ini - dan kami akan kembali ke hotel ini di masa depan - 552 00:34:42,920 --> 00:34:46,380 mari kita berpura-pura bahwa ini merupakan bagian dalam hard drive komputer Anda 553 00:34:46,380 --> 00:34:50,110 karena kembali pada hari mereka digunakan untuk menjadi disk melingkar, seperti disket. 554 00:34:50,110 --> 00:34:55,130 Jadi jika Anda memiliki beberapa file Excel sensitif, mungkin mengambil ini sepotong memori 555 00:34:55,130 --> 00:34:59,770 pada disk komputer Anda, dan aku hanya menggambar 1s sewenang-wenang yang sama dan 0s. 556 00:34:59,770 --> 00:35:03,970 Ketika Anda men-drag file seperti itu untuk sampah Anda bisa atau recycle bin, 557 00:35:03,970 --> 00:35:07,750 harfiah tidak terjadi karena Apple dan Microsoft baru saja memutuskan 558 00:35:07,750 --> 00:35:10,450 sampah dan recycle bin benar-benar hanya placeholder sementara. 559 00:35:10,450 --> 00:35:14,710 Mungkin akhirnya OS akan kosong untuk Anda, tetapi biasanya, tidak melakukan apa-apa, 560 00:35:14,710 --> 00:35:17,090 setidaknya sampai Anda benar-benar rendah pada ruang. 561 00:35:17,090 --> 00:35:20,870 >> Namun, ketika Anda pergi ke tempat sampah kosong atau kosong recycle bin, 562 00:35:20,870 --> 00:35:23,460 sama, tidak ada yang terjadi pada gambar ini. 563 00:35:23,460 --> 00:35:28,590 Semua yang terjadi di tempat lain di komputer Anda, ada beberapa jenis tabel. 564 00:35:28,590 --> 00:35:35,400 Ini semacam seperti contekan kecil yang mengatakan bahwa, katakanlah, resume.doc, 565 00:35:35,400 --> 00:35:40,920 sehingga resume Anda dalam file Microsoft Word yang digunakan untuk tinggal di lokasi 123 pada hard disk Anda, 566 00:35:40,920 --> 00:35:43,710 tidak ada di memori dan tidak dalam RAM tetapi pada hard disk Anda, 567 00:35:43,710 --> 00:35:49,050 dan samar Anda JPEG hidup pada 456, dan Anda file Excel tinggal di 789 atau di mana pun. 568 00:35:49,050 --> 00:35:53,640 Ketika Anda menghapus file dengan benar-benar mengosongkan sampah atau recycle bin, 569 00:35:53,640 --> 00:35:59,530 gambar ini tidak berubah. 0s dan 1s pada hard drive Anda tidak pergi ke mana pun. 570 00:35:59,530 --> 00:36:03,930 Tapi ini tabel, database ini sedikit macam, tidak berubah. 571 00:36:03,930 --> 00:36:08,750 Ketika Anda menghapus resume Anda, itu seolah-olah file tersebut dihapus dalam arti tertentu, 572 00:36:08,750 --> 00:36:12,790 tetapi semua komputer tidak akan lupa di mana hal yang hidup pada hard drive Anda. 573 00:36:12,790 --> 00:36:17,870 The 0s dan 1s yang membentuk resume Anda atau file-file lainnya masih utuh. 574 00:36:17,870 --> 00:36:21,960 >> Jadi jika Anda melakukan ini sengaja, masih ada kemungkinan non-nol 575 00:36:21,960 --> 00:36:25,800 bahwa Anda dapat memulihkan data Anda menggunakan Norton Utilities atau beberapa perangkat lunak komersial 576 00:36:25,800 --> 00:36:29,810 Tujuan yang dalam hidup adalah untuk menemukan 0s dan 1s yang semacam yatim piatu, 577 00:36:29,810 --> 00:36:33,300 dilupakan di sini tapi kiri di sini, sehingga Anda bisa mendapatkan data Anda kembali. 578 00:36:33,300 --> 00:36:38,410 Atau peneliti forensik dengan polisi atau FBI akan benar-benar mengambil hard drive 579 00:36:38,410 --> 00:36:42,550 dan benar-benar mencari pola 0s dan 1s yang terlihat seperti JPEG, terlihat seperti file Excel, 580 00:36:42,550 --> 00:36:46,400 dan memulihkan mereka dengan cara itu bahkan jika komputer telah melupakan mereka di sana. 581 00:36:46,400 --> 00:36:49,820 Jadi satu-satunya cara untuk benar-benar menghapus data, seperti yang akan kita bahas di masa depan, 582 00:36:49,820 --> 00:36:54,190 adalah untuk menggosok atau menghapus file atau hard disk dengan - 583 00:36:54,190 --> 00:36:56,540 Anda tidak bisa benar-benar menyingkirkan 0s dan 1s 584 00:36:56,540 --> 00:36:59,440 karena jika tidak Anda akan mulai dengan drive GB hard 585 00:36:59,440 --> 00:37:02,380 dan Anda akan berakhir dengan hard drive megabyte jika Anda terus-menerus yang menghapus, 586 00:37:02,380 --> 00:37:04,380 harfiah, 0s dan 1s. 587 00:37:04,380 --> 00:37:06,310 Jadi apa yang akan Anda lakukan jika Anda benar-benar ingin untuk menutupi trek Anda 588 00:37:06,310 --> 00:37:10,510 dan masalah mendasar adalah bahwa masih ada 0s dan 1s pada disk? 589 00:37:10,510 --> 00:37:14,930 Saya melihat seseorang isyarat bahwa Anda secara fisik akan menghancurkan perangkat. Itu akan bekerja. 590 00:37:14,930 --> 00:37:19,600 [Tertawa] Tapi kalau itu semacam sebuah solusi yang mahal, apa yang akan menjadi lebih masuk akal? 591 00:37:19,600 --> 00:37:23,270 Ya. >> [Mahasiswa] Timpa mereka. >> Timpa mereka dengan apa? >> [Mahasiswa] Data lain. 592 00:37:23,270 --> 00:37:29,070 Data lain. Anda hanya dapat menimpa disk dengan 0s atau 1s atau semua 0s, semua 1s. 593 00:37:29,070 --> 00:37:31,230 >> Dan itulah memang apa beberapa perangkat lunaknya. 594 00:37:31,230 --> 00:37:33,570 Anda dapat membeli perangkat lunak atau bahkan mendapatkan perangkat lunak bebas, 595 00:37:33,570 --> 00:37:36,610 dan bahkan dibangun untuk Mac OS hari ini, kurang begitu di Windows, 596 00:37:36,610 --> 00:37:38,660 adalah kemampuan untuk aman menghapus. 597 00:37:38,660 --> 00:37:41,960 Sebenarnya, jika Anda ingin semua rumah run hari ini jika Anda memiliki Mac dan melakukan hal ini, 598 00:37:41,960 --> 00:37:45,740 jika Anda punya beberapa hal di tempat sampah Anda bisa, Anda dapat melakukan Kosongkan Sampah Secure, 599 00:37:45,740 --> 00:37:47,610 yang tidak tepat. 600 00:37:47,610 --> 00:37:53,350 Alih-alih hanya menghapus file di sini, itu tidak menghapus 0s dan 1s sini, 601 00:37:53,350 --> 00:38:01,240 melainkan hanya mengubah mereka semua, misalnya, untuk 0s dan dot, titik, titik. 602 00:38:01,240 --> 00:38:05,330 Jadi salah satu dari psets masa depan Anda akan benar-benar sengaja memulihkan data - 603 00:38:05,330 --> 00:38:08,430 foto-foto yang kita telah diambil orang, tempat, dan hal-hal di kampus 604 00:38:08,430 --> 00:38:12,810 yang kami akan membuat gambar forensik dari kartu memori kamera digital, 605 00:38:12,810 --> 00:38:17,120 yang merupakan ide yang sama - dan Anda akan harus ditantang untuk benar-benar menemukan 606 00:38:17,120 --> 00:38:20,160 pola yang mewakili JPEG pada hard drive Anda, 607 00:38:20,160 --> 00:38:23,610 seperti itu murid yang email saya membaca beberapa minggu yang lalu melakukan 608 00:38:23,610 --> 00:38:25,860 untuk memulihkan foto adiknya. 609 00:38:25,860 --> 00:38:30,300 Mengapa kita tidak mengambil istirahat 5 menit di sini, dan kami akan berkumpul kembali dengan lebih pada memori. 610 00:38:33,030 --> 00:38:38,610 Jadi, di sinilah hal mendapatkan sedikit pikiran-lipatan, tapi ini adalah langkah yang sangat kuat 611 00:38:38,610 --> 00:38:40,480 menuju pemahaman ini semua lebih. 612 00:38:40,480 --> 00:38:42,900 Berikut ini adalah sebuah program yang disebut pointers.c. 613 00:38:42,900 --> 00:38:45,430 Ini adalah salah contoh kode hari ini. 614 00:38:45,430 --> 00:38:51,280 Perhatikan bahwa dalam beberapa baris pertama, 19 sampai 22, semua yang kita lakukan adalah sesuatu seperti GetString 615 00:38:51,280 --> 00:38:54,460 dan kembali alamat, menyimpannya dalam s. 616 00:38:54,460 --> 00:38:58,380 Selanjutnya untuk pset bahkan 3 jika Anda ingin tapi pset 4 dan 617 00:38:58,380 --> 00:39:01,030 di mana Anda dapat mulai untuk mengambil roda pelatihan ini dari diri sendiri, 618 00:39:01,030 --> 00:39:04,030 tidak ada alasan untuk berpura-pura bahwa string ada lagi. 619 00:39:04,030 --> 00:39:07,030 Ini tentu saja hanya mulai mengatakan char *. 620 00:39:07,030 --> 00:39:12,610 >> Sebagai samping, dalam referensi online dan dalam buku-buku Anda mungkin sering melihat bintang di samping variabel. 621 00:39:12,610 --> 00:39:15,600 Anda bahkan mungkin melihat ruang di sekitar kedua sisi itu. 622 00:39:15,600 --> 00:39:17,680 Semua dari mereka secara fungsional benar. 623 00:39:17,680 --> 00:39:21,180 Untuk saat ini, meskipun, kita akan standarisasi pada pendekatan ini untuk membuat super jelas 624 00:39:21,180 --> 00:39:24,000 bahwa char * seperti mengatakan pointer karakter. 625 00:39:24,000 --> 00:39:25,680 Itu adalah tipe data. 626 00:39:25,680 --> 00:39:28,730 Dan kemudian nama variabel adalah dalam kasus ini. 627 00:39:28,730 --> 00:39:31,180 Jadi kita sudah string dan kami telah menyebutnya s. 628 00:39:31,180 --> 00:39:35,180 Dan kemudian di sini melihat bahwa saya lakukan sebenarnya sedikit tipu daya. 629 00:39:35,180 --> 00:39:39,080 Ini disebut aritmatika pointer, yang merupakan semacam super sederhana. 630 00:39:39,080 --> 00:39:41,790 Ini hanya berarti menambah dan mengurangi angka untuk pointer. 631 00:39:41,790 --> 00:39:43,660 Tapi ini benar-benar bekerja. 632 00:39:43,660 --> 00:39:49,170 Program ini tampaknya mencetak 1 karakter string s per baris sehingga hasil akhir - 633 00:39:49,170 --> 00:39:54,920 Hanya supaya kita bisa merusak mana hal ini terjadi, membuat pointer, pointer jalankan, biarkan aku tampilannya masuk 634 00:39:54,920 --> 00:39:58,940 Sekarang biarkan aku ketik sesuatu seperti HELLO dan jenis Enter 635 00:39:58,940 --> 00:40:01,080 dan mencetak 1 karakter per baris. 636 00:40:01,080 --> 00:40:04,730 Sampai detik yang lalu, kita akan melakukan ini dengan notasi braket persegi. 637 00:40:04,730 --> 00:40:09,760 Kami akan memiliki untuk loop dan kami akan melakukan printf s [i] dan kami akan melakukannya lagi dan lagi dan lagi 638 00:40:09,760 --> 00:40:11,950 dengan n backslash di akhir setiap baris. 639 00:40:11,950 --> 00:40:16,800 Tapi program ini berbeda. Program ini menggunakan, secara harfiah, aritmatika. 640 00:40:16,800 --> 00:40:18,860 Jadi apa yang terjadi di sini? 641 00:40:18,860 --> 00:40:24,720 Pertama-tama, sebelum loop ini bahkan mengeksekusi, apa, hanya harus jelas, ini sebenarnya? 642 00:40:24,720 --> 00:40:27,270 S? >> [Mahasiswa] Sebuah alamat. >> Sebuah alamat. 643 00:40:27,270 --> 00:40:32,980 >> Dan itu adalah alamat, dalam kasus ini, hello, karakter pertama dalam kata itu, yang h. 644 00:40:32,980 --> 00:40:37,370 Jadi s adalah, dalam contoh ini, alamat h. 645 00:40:37,370 --> 00:40:41,850 Jadi apa artinya melakukan s + i? 646 00:40:41,850 --> 00:40:46,280 Nah, saya mulai pada 0 dalam untuk loop. Kami telah melakukan kali yang banyak. 647 00:40:46,280 --> 00:40:49,760 Saya akan pergi ke panjang string, rupanya. 648 00:40:49,760 --> 00:40:53,950 Jadi pada iterasi pertama dari loop ini, saya jelas 0. 649 00:40:53,950 --> 00:41:01,740 Jadi ungkapan ini mengatakan s + i - lebih tepatnya, s +0--itu jelas hanya s. 650 00:41:01,740 --> 00:41:04,320 Jadi apa * s di sini? 651 00:41:04,320 --> 00:41:08,530 Sekarang kita menggunakan bintang dalam cara yang sedikit berbeda. 652 00:41:08,530 --> 00:41:13,080 Biarkan aku pergi ke depan dan menyingkirkan t karena kita sudah selesai membicarakan t dan salinan s. 653 00:41:13,080 --> 00:41:15,540 Sekarang kita hanya ingin menceritakan sebuah kisah yang melibatkan s. 654 00:41:15,540 --> 00:41:20,090 Dan sehingga pada saat ini, setelah tipe string, dunia kita terlihat cukup seperti itu sebelumnya 655 00:41:20,090 --> 00:41:26,630 dengan hanya s menyimpan alamat h dan lebih umum menunjuk pada string halo. 656 00:41:26,630 --> 00:41:33,170 Jika sekarang saya melakukan baris seperti * (s + i), mari kita mencoba ini. 657 00:41:33,170 --> 00:41:40,140 Jadi * (s + i). Biarkan aku menyederhanakan ini karena ini adalah 0, jadi ini adalah * (s +0). 658 00:41:40,140 --> 00:41:43,790 Nah, tunggu dulu. Sederhanakan lanjut. Ini * (s). 659 00:41:43,790 --> 00:41:47,020 Nah, sekarang kurung adalah agak bodoh, jadi sekarang mari kita lakukan * s. 660 00:41:47,020 --> 00:41:50,540 Jadi pada iterasi pertama dari loop ini, garis yang disorot, 26, 661 00:41:50,540 --> 00:41:53,650 cukup banyak setara dengan mencetak ini. 662 00:41:53,650 --> 00:41:56,040 Apa jenis data * s? 663 00:41:56,040 --> 00:42:00,770 Dalam konteks ini, karena bintang kebetulan di samping s sendiri, 664 00:42:00,770 --> 00:42:04,930 tetapi lebih khusus lagi, karena kita tidak lagi menyatakan s, 665 00:42:04,930 --> 00:42:09,730 kita tidak menciptakan variabel lagi, tidak ada menyebutkan char * sejalan 26, 666 00:42:09,730 --> 00:42:14,280 tidak ada menyebutkan dari string kata kunci, kita hanya menggunakan variabel yang disebut s, 667 00:42:14,280 --> 00:42:19,650 ternyata sekarang bintang memiliki sedikit berbeda dan, diakui, membingungkan makna. 668 00:42:19,650 --> 00:42:26,590 * S di sini berarti pergi ke alamat di s dan mencetak apa pun yang ada. 669 00:42:26,590 --> 00:42:33,750 Jadi s di sini, * s adalah - semacam Chutes dan tangga, ikuti panah - sini. 670 00:42:33,750 --> 00:42:35,850 Jadi ini adalah * s. 671 00:42:35,850 --> 00:42:39,060 >> Jadi apa yang akan dicetak pada iterasi pertama dari loop di jalur 26? 672 00:42:39,060 --> 00:42:42,170 Saya mencetak% c, yang merupakan tempat untuk karakter, 673 00:42:42,170 --> 00:42:48,520 maka \ n untuk baris baru. * (S + i) di mana i adalah 0 hanya ini. 674 00:42:48,520 --> 00:42:53,670 Jadi apa yang Char saya tempatkan di untuk c%? H. 675 00:42:53,670 --> 00:42:56,900 Pada iterasi berikutnya dari loop - Anda mungkin bisa melihat mana hal ini terjadi - 676 00:42:56,900 --> 00:43:01,350 iterasi berikutnya saya jelas 1, jadi ini berarti s +1, 677 00:43:01,350 --> 00:43:05,580 dan kemudian sekarang saya perlu tanda kurung karena sekarang bintang perlu untuk mengatakan 678 00:43:05,580 --> 00:43:08,620 pergi ke alamat memori s +1. 679 00:43:08,620 --> 00:43:14,170 Apa s? Mari kita memutar kembali waktu dan mengatakan panah ini sekarang tidak benar-benar melakukan kita apapun nikmat. 680 00:43:14,170 --> 00:43:18,450 Biar lebih spesifik mengatakan bahwa ini adalah menyimpan nomor 123 681 00:43:18,450 --> 00:43:25,110 karena awal string ini halo, ini adalah alamat 123, ini adalah 124, dan sebagainya. 682 00:43:25,110 --> 00:43:30,550 Jadi pada iterasi kedua ketika saya katakan s +1, itu seperti mengatakan 123 +1, 683 00:43:30,550 --> 00:43:35,340 atau dikenal sebagai 124, jadi apa arang yang akan dicetak pada iterasi kedua? 684 00:43:35,340 --> 00:43:37,850 E di alamat memori 124. 685 00:43:37,850 --> 00:43:44,440 Kemudian + lagi, 125, 126, 127, dan loop ini untungnya berhenti sebelum kita sampai di sini 686 00:43:44,440 --> 00:43:49,040 karena aku menggunakan strlen untuk memastikan bahwa saya tidak menghitung terlalu tinggi. 687 00:43:49,040 --> 00:43:50,810 Jadi itu juga itu. 688 00:43:50,810 --> 00:43:55,000 Sekali lagi, ini hanya seolah-olah kita telah melakukan seminggu yang lalu. 689 00:43:55,000 --> 00:43:59,200 Biarkan aku menulis di baris bawah meskipun kita tidak ingin melakukan keduanya. 690 00:43:59,200 --> 00:44:02,500 Ini identik sekarang untuk ini. 691 00:44:02,500 --> 00:44:08,310 >> Jadi meskipun s adalah string, seperti yang kita sudah menyebutnya selama berminggu-minggu, s benar-benar char *. 692 00:44:08,310 --> 00:44:13,270 Jadi jika kita ingin menjadi anal super, itu benar-benar tepat untuk menulis karakter tertentu 693 00:44:13,270 --> 00:44:17,490 di lokasi engan menggunakan alamat numerik dan operator ini bintang, 694 00:44:17,490 --> 00:44:20,470 tapi terus terang, ini adalah bersih hanya begitu banyak. Jadi ini tidak buruk. 695 00:44:20,470 --> 00:44:26,720 Tidak ada alasan untuk berhenti melakukan baris 27 di sini, tapi 26 secara fungsional sama, 696 00:44:26,720 --> 00:44:31,570 dan itu fungsional sama untuk persis alasan bahwa kita telah membahas sejauh ini. 697 00:44:31,570 --> 00:44:33,650 Dan terakhir, 29 adalah praktik hanya baik. 698 00:44:33,650 --> 00:44:38,420 Memanggil bebas dari s berarti bahwa sekarang Anda memberikan kembali memori yang GetString memberi Anda 699 00:44:38,420 --> 00:44:41,630 karena lagi-lagi, seperti yang saya sebutkan Senin, GetString selama berminggu-minggu 700 00:44:41,630 --> 00:44:44,180 telah memperkenalkan bug dalam kode Anda. 701 00:44:44,180 --> 00:44:46,490 Kode Anda selama berminggu-minggu telah memiliki kebocoran memori 702 00:44:46,490 --> 00:44:49,970 dimana Anda telah meminta GetString untuk memori, tetapi Anda tidak pernah memberikan kembali. 703 00:44:49,970 --> 00:44:53,410 Dan yang sengaja dipilih oleh kami pedagogis 704 00:44:53,410 --> 00:44:55,880 karena itu hanya terlalu banyak untuk berpikir tentang awal. 705 00:44:55,880 --> 00:44:57,710 Tapi sekarang kita perlu lebih simetri. 706 00:44:57,710 --> 00:45:00,830 Jika Anda meminta komputer untuk memori, seperti halnya untuk GetString, 707 00:45:00,830 --> 00:45:02,820 seperti halnya tampaknya untuk malloc, 708 00:45:02,820 --> 00:45:07,970 Anda sekarang harus untuk pset 4 seterusnya juga gratis setiap memori tersebut. 709 00:45:07,970 --> 00:45:11,650 Perhatikan ini berbeda dari mengatakan n int. 710 00:45:11,650 --> 00:45:15,040 Anda tidak perlu membebaskan ini karena Anda tidak menelepon GetString 711 00:45:15,040 --> 00:45:16,890 dan Anda tidak menelepon malloc. 712 00:45:16,890 --> 00:45:20,610 >> Dan bahkan jika Anda disebut GetInt seperti yang kita akhirnya akan melihat, 713 00:45:20,610 --> 00:45:25,520 GetInt tidak mengalokasikan memori untuk Anda karena Anda benar-benar dapat lulus sekitar bilangan bulat 714 00:45:25,520 --> 00:45:29,430 dan mengapung dan karakter hanya cara telah kita lakukan selama berminggu-minggu. 715 00:45:29,430 --> 00:45:33,960 String, meskipun, yang benar-benar istimewa karena mereka adalah gabungan dari beberapa karakter. 716 00:45:33,960 --> 00:45:37,450 Jadi mereka hanya berbeda dari karakter dan mengapung dan ints dan sejenisnya. 717 00:45:37,450 --> 00:45:39,980 Tapi kita akan kembali ke yang lama. 718 00:45:39,980 --> 00:45:44,920 Setiap pertanyaan kemudian pada awal pointer? Ya. 719 00:45:44,920 --> 00:45:49,690 [Pertanyaan siswa tidak terdengar] 720 00:45:49,690 --> 00:45:51,440 Ah, pertanyaan yang sangat baik. 721 00:45:51,440 --> 00:45:55,790 Salah satu dari beberapa hal C sebenarnya untuk Anda, yang nyaman, 722 00:45:55,790 --> 00:46:00,110 apakah angka keluar untuk Anda apa ukuran adalah dari tipe data 723 00:46:00,110 --> 00:46:03,060 dan kemudian melakukan semacam perkalian untuk Anda. 724 00:46:03,060 --> 00:46:06,610 Hal ini tidak relevan dalam kasus chars karena hampir selalu Char adalah 1 byte, 725 00:46:06,610 --> 00:46:08,150 jadi ini hanya bekerja. 726 00:46:08,150 --> 00:46:11,220 Namun untuk kepentingan diskusi, jika Anda benar-benar mencetak bilangan bulat 727 00:46:11,220 --> 00:46:15,500 dan Anda mencoba untuk mencetak beberapa nilai s yang menunjuk integer, 728 00:46:15,500 --> 00:46:20,720 Anda sama tidak perlu melakukan + 4 * saya hanya karena int adalah 4 byte. 729 00:46:20,720 --> 00:46:25,780 Aritmatika pointer berarti bahwa C dan compiler melakukan semua yang matematika untuk Anda. 730 00:46:25,780 --> 00:46:29,190 Yang harus Anda pedulikan adalah penghitungan dalam semacam rasa manusia. Ya. 731 00:46:29,190 --> 00:46:35,200 [Mahasiswa] Jika Anda menyatakan string di dalam untuk loop, apakah Anda harus membebaskan nanti? 732 00:46:35,200 --> 00:46:36,760 Pertanyaan bagus. 733 00:46:36,760 --> 00:46:41,390 >> Jika Anda menyatakan di dalam string untuk loop, Anda perlu membebaskan nanti? 734 00:46:41,390 --> 00:46:47,520 Anda hanya perlu untuk membebaskan memori yang Anda mengalokasikan dengan GetString atau dengan malloc. 735 00:46:47,520 --> 00:46:53,110 Jadi jika Anda hanya mengatakan sesuatu seperti - biarkan aku menempatkan kurung kurawal sekarang jadi semua kode terkait. 736 00:46:53,110 --> 00:46:58,580 Jika Anda melakukan sesuatu, meskipun buggily, seperti ini, char * t = s, 737 00:46:58,580 --> 00:47:03,450 Anda tidak perlu t gratis karena t tidak melibatkan penyebutan malloc atau GetString. 738 00:47:03,450 --> 00:47:08,960 Jika sebaliknya Anda melakukan ini, GetString, maka ya, Anda akan perlu untuk t gratis. 739 00:47:08,960 --> 00:47:14,350 Dan pada kenyataannya, satu-satunya kesempatan Anda untuk melakukan yang sekarang dalam lingkaran ini, untuk masalah yang sama dari lingkup 740 00:47:14,350 --> 00:47:16,060 yang kita bahas di masa lalu. 741 00:47:16,060 --> 00:47:18,830 Jika tidak, Anda akan mengalokasikan memori, mengalokasikan memori, mengalokasikan memori, 742 00:47:18,830 --> 00:47:21,230 dan pada akhir program karena Anda berada di luar dari lingkaran itu, 743 00:47:21,230 --> 00:47:24,240 t tidak ada, tetapi Anda tidak pernah mengatakan kepada sistem operasi 744 00:47:24,240 --> 00:47:26,750 bahwa Anda tidak perlu memori itu lagi. 745 00:47:26,750 --> 00:47:30,430 Dan tak lama, untuk pset 4 atau 5 kami akan membekali Anda dengan sebuah program yang disebut Valgrind, 746 00:47:30,430 --> 00:47:34,160 yang memiliki semangat yang sama dalam GDB bahwa itu punya sedikit dari sebuah antarmuka misterius, 747 00:47:34,160 --> 00:47:35,750 namun tujuannya dalam hidup adalah untuk membantu Anda. 748 00:47:35,750 --> 00:47:39,380 Dan Valgrind adalah sebuah program yang akan di masa depan mencari program Anda 749 00:47:39,380 --> 00:47:42,550 mencari kebocoran memori, baik dari GetString atau malloc, 750 00:47:42,550 --> 00:47:47,800 yang kita akan mulai menggunakan semua lebih karena kita berhenti menggunakan perpustakaan CS50 sebanyak. 751 00:47:47,800 --> 00:47:53,030 Kami akhirnya sekarang memiliki semacam kosa kata dan jenis model mental dalam teori 752 00:47:53,030 --> 00:47:55,170 yang dapat digunakan untuk memecahkan program ini rusak. 753 00:47:55,170 --> 00:47:59,410 >> Jadi dalam program ini rusak, swap bekerja di dalam swap, 754 00:47:59,410 --> 00:48:05,280 tapi tidak pernah benar-benar bekerja di utama karena main disahkan pada x dan y, ingat, 755 00:48:05,280 --> 00:48:07,260 dan mereka yang disahkan oleh nilai-nilai, sehingga untuk berbicara. 756 00:48:07,260 --> 00:48:09,330 Salinan dari mereka diberikan untuk swap. 757 00:48:09,330 --> 00:48:12,520 Pada akhir swap, dan b memang telah dipertukarkan, 758 00:48:12,520 --> 00:48:16,120 tapi tentu saja x dan y, seperti yang kita bahas pada hari Senin, belum. 759 00:48:16,120 --> 00:48:19,940 Jadi saya mengusulkan hijau di sini bahwa ini sebenarnya solusinya di sini. 760 00:48:19,940 --> 00:48:22,640 Dan sebenarnya, biarkan aku menggerakkan bintang saya hanya untuk konsisten 761 00:48:22,640 --> 00:48:24,440 meskipun, sekali lagi, secara fungsional ini tidak masalah. 762 00:48:24,440 --> 00:48:28,730 Dalam minggu-minggu mendatang kami akan menjelaskan kapan dan mengapa itu penting. 763 00:48:28,730 --> 00:48:30,600 Jadi hijau sekarang adalah solusi. 764 00:48:30,600 --> 00:48:33,700 Terus terang, terlihat jauh berantakan karena saya memiliki semua bintang. 765 00:48:33,700 --> 00:48:35,380 Biarkan saya menunjukkan satu hal. 766 00:48:35,380 --> 00:48:40,040 Baris atas sini di mana ia mengatakan int * a dan int b * 767 00:48:40,040 --> 00:48:42,820 secara fundamental melakukan hal yang sama seperti biasa. 768 00:48:42,820 --> 00:48:47,070 Hal ini menyatakan 2 argumen atau parameter untuk swap, 769 00:48:47,070 --> 00:48:49,940 yang pertama adalah sebuah pointer int disebut, 770 00:48:49,940 --> 00:48:53,100 yang kedua yang merupakan pointer int disebut b. 771 00:48:53,100 --> 00:48:55,770 Satu-satunya hal yang baru pada saat ini adalah kenyataan bahwa ada bintang di sana. 772 00:48:55,770 --> 00:48:59,340 >> Apa artinya? Bukanlah int, b tidak int. 773 00:48:59,340 --> 00:49:04,100 A adalah alamat int dan b adalah alamat dari int yang berbeda. 774 00:49:04,100 --> 00:49:06,980 Di sini, ini adalah di mana saya akui C mendapat membingungkan. 775 00:49:06,980 --> 00:49:09,790 Sekarang kita menggunakan bintang, tetapi memiliki arti yang berbeda dalam konteks ini. 776 00:49:09,790 --> 00:49:13,150 Karena kita tidak menyatakan pointer seperti kita di sini, 777 00:49:13,150 --> 00:49:15,500 di sini kita dereferencing hal. 778 00:49:15,500 --> 00:49:21,520 Jadi secara teknis, bintang dalam konteks baris pertama, kedua, dan ketiga dalam swap 779 00:49:21,520 --> 00:49:24,560 adalah operator dereference, yang hanya berarti pergi ke sana. 780 00:49:24,560 --> 00:49:27,400 Jadi sama seperti jari saya mengikuti panah ke h, 781 00:49:27,400 --> 00:49:31,100 * Cara pergi ke alamat tersebut dan menemukan saya int yang ada. 782 00:49:31,100 --> 00:49:34,250 * Berarti b pergi ke alamat dan lulus saya apa yang ada. 783 00:49:34,250 --> 00:49:40,730 Jadi mari kita redraw gambar dari Senin sekarang menggunakan setumpuk frame, 784 00:49:40,730 --> 00:49:43,130 bagian bawah salah satu yang akan menjadi utama, 785 00:49:43,130 --> 00:49:47,600 satu atas yang akan menjadi swap, 786 00:49:47,600 --> 00:49:50,880 sehingga dunia kita terlihat, seperti hari Senin, seperti ini. 787 00:49:50,880 --> 00:49:53,620 Berikut ini adalah sepotong memori yang utama akan digunakan. 788 00:49:53,620 --> 00:49:56,520 >> Ingat dari hari Senin bahwa program ini hanya memiliki 2 variabel, 789 00:49:56,520 --> 00:50:01,930 satu disebut x dan y yang disebut, dan aku telah menempatkan angka 1 dan 2 di sana. 790 00:50:01,930 --> 00:50:06,580 Sekarang ketika saya sebut bertukar seperti saya lakukan pada hari Senin, 791 00:50:06,580 --> 00:50:11,000 sebelumnya ketika saya menggunakan versi merah dari program ini, yang terlihat seperti ini, 792 00:50:11,000 --> 00:50:17,470 Aku punya 2 parameter, a dan b, dan apa yang kita tulis di sini dan di sini? 793 00:50:17,470 --> 00:50:21,160 Hanya 1 dan 2, secara harfiah salinan dari x dan y. 794 00:50:21,160 --> 00:50:23,070 Hari ini kita mengubah itu. 795 00:50:23,070 --> 00:50:28,510 Hari ini bukannya lewat di ints dan b kita akan lulus dalam 2 alamat. 796 00:50:28,510 --> 00:50:34,290 Alamat tersebut terjadi menunjuk ke ints, namun alamat tersebut tidak ints sendiri. 797 00:50:34,290 --> 00:50:37,330 Mereka adalah alamat. Ini seperti alamat pos sebagai gantinya. 798 00:50:37,330 --> 00:50:40,580 Jadi sekarang kita hanya perlu memberi diriku sedikit lebih detail pada layar. 799 00:50:40,580 --> 00:50:43,250 Ini adalah memori komputer saya karena sudah seharian. 800 00:50:43,250 --> 00:50:45,120 Sekarang kita perlu beberapa skema penomoran sewenang-wenang. 801 00:50:45,120 --> 00:50:50,580 Jadi mari kita hanya mengatakan, hanya kebetulan, bahwa ini adalah alamat memori 123, 124. 802 00:50:50,580 --> 00:50:55,660 Anggap saja ini adalah 125, ini adalah 126, dan sebagainya, tapi itu benar-benar sewenang-wenang. 803 00:50:55,660 --> 00:50:58,590 Kita hanya perlu beberapa skema penomoran dalam ingatanku. 804 00:50:58,590 --> 00:51:04,030 Jadi sekarang ketika aku benar-benar lulus dalam x dan y, saya tidak akan lulus dalam x dan y; 805 00:51:04,030 --> 00:51:08,400 Aku akan lulus dalam alamat pos, sehingga untuk berbicara, dari x dan y 806 00:51:08,400 --> 00:51:11,870 sehingga apa yang akan disimpan di sini dan di sini adalah tidak 1 dan 2, 807 00:51:11,870 --> 00:51:16,030 tapi jika Anda dapat melihat teks kecil saya, apa yang akan berlalu di sini dan di sini? 808 00:51:16,030 --> 00:51:23,340 [Respon siswa terdengar] >> Tepat. 123 akan dimasukkan di sini dan 124 akan diletakkan di sini. 809 00:51:23,340 --> 00:51:28,910 >> Sekarang, karena saya menggunakan bintang dalam cara baris pertama di sini di atas, 810 00:51:28,910 --> 00:51:34,340 program saya hanya tahu bahwa 123 dan 124, meskipun mereka jelas bilangan bulat 811 00:51:34,340 --> 00:51:40,160 bahwa setiap manusia bisa melihat, mereka harus ditafsirkan sebagai alamat, alamat numerik. 812 00:51:40,160 --> 00:51:43,250 Mereka tidak dalam dan dari diri mereka ints, mereka alamat, 813 00:51:43,250 --> 00:51:46,120 dan itu karena saya telah secara eksplisit menempatkan bintang-bintang di sana. 814 00:51:46,120 --> 00:51:51,360 Jadi sekarang sejalan saya pertama, kedua, dan ketiga kode aktual apa yang terjadi di sini? 815 00:51:51,360 --> 00:51:53,380 Mari kita menarik seluruh gambar. 816 00:51:53,380 --> 00:51:56,980 Tmp adalah seperti itu pada hari Senin. Khusus tentang tmp apa-apa. 817 00:51:56,980 --> 00:52:03,060 Ini hanya lokal 32 bit variabel, dan dalam bahwa saya ternyata menyimpan nilai * a. 818 00:52:03,060 --> 00:52:08,580 Sekarang, jika saya hanya berkata tmp = a, apa yang akan saya taruh di sini? >> [Mahasiswa] 123. 819 00:52:08,580 --> 00:52:10,370 123. Tapi itu bukan apa yang saya lakukan. 820 00:52:10,370 --> 00:52:13,670 Saya mengatakan tmp = * a. Berarti bintang pergi ke sana. 821 00:52:13,670 --> 00:52:19,370 Jadi di sini adalah, 123. Bagaimana saya pergi ke sana? Berpura-pura seperti ada panah. 822 00:52:19,370 --> 00:52:24,460 Nah, itu dia, 1. Jadi apa yang akan disimpan dalam tmp, rupanya? Hanya 1. 823 00:52:24,460 --> 00:52:29,620 Jadi dengan kata lain, tmp adalah *, * sarana pergi ke alamat yang saat ini dalam, 824 00:52:29,620 --> 00:52:31,320 yang ternyata 123. 825 00:52:31,320 --> 00:52:33,910 >> Oke, di sini kita berada di lokasi 123, saya melihat nomor 1, 826 00:52:33,910 --> 00:52:35,670 jadi aku akan menempatkan nomor 1 di sana. 827 00:52:35,670 --> 00:52:39,020 Sekarang apa yang harus saya lakukan di baris 2, * a = b *? 828 00:52:39,020 --> 00:52:44,570 Yang satu ini sedikit lebih terlibat karena sekarang apa itu? Ini 123. 829 00:52:44,570 --> 00:52:50,220 Jadi * adalah di mana? Tepat di mana aku berada sebelumnya. Jadi pergi ke sana. Oke. 830 00:52:50,220 --> 00:52:53,420 Sekarang, terakhir, dan akhirnya hal ini akan mulai masuk akal, mudah-mudahan, 831 00:52:53,420 --> 00:53:00,280 * B berarti apa yang ada di b? 124. Jadi saya harus pergi ke sana, yang merupakan 2. 832 00:53:00,280 --> 00:53:03,430 Jadi apa yang harus saya ditaruh dimana? 833 00:53:03,430 --> 00:53:10,100 2 masuk ke sini karena * b * masuk ke dalam. Jadi saya akan melakukan itu. 834 00:53:10,100 --> 00:53:13,120 Dan Anda sudah dapat melihat, mungkin, bahwa kita jauh lebih dekat 835 00:53:13,120 --> 00:53:17,710 untuk memecahkan masalah ini, bodoh sederhana dengan benar untuk pertama kalinya 836 00:53:17,710 --> 00:53:20,920 karena sekarang kita masih memiliki ingatan apa x itu, 837 00:53:20,920 --> 00:53:23,230 kami memiliki 2 eksemplar, diakui, dari y, 838 00:53:23,230 --> 00:53:25,850 tapi garis 3 sekarang mengatakan * b. 839 00:53:25,850 --> 00:53:31,080 Jadi, inilah b. * B berarti pergi ke sana. Jadi di mana lokasi 124? 840 00:53:31,080 --> 00:53:35,560 Ini rupanya di sini. Jadi apa yang saya taruh di sini? Jelas, tmp. 841 00:53:35,560 --> 00:53:39,600 Jadi sekarang aku melakukan ini. Jadi saya memiliki 1 dan 2 di sini di sini. 842 00:53:39,600 --> 00:53:43,560 Dan sekarang apa tentang semua ini, 123, 124, dan 1? 843 00:53:43,560 --> 00:53:47,910 Segera setelah kembali swap, memori ini sebagus hilang 844 00:53:47,910 --> 00:53:51,070 karena segera setelah kembali swap, sistem operasi 845 00:53:51,070 --> 00:53:54,190 bebas untuk menggunakan memori itu lagi di masa depan. 846 00:53:54,190 --> 00:53:58,870 Hanya memori utama di bagian bawah dari tumpukan ini disebut tongkat sekitar. 847 00:53:58,870 --> 00:54:01,470 >> Dan jadi kita akhirnya memiliki versi sekarang bekerja. 848 00:54:01,470 --> 00:54:06,310 Biarkan aku pergi ke swap.c, dan perhatikan berikut ini. 849 00:54:06,310 --> 00:54:11,280 Pada bagian atas program saya sudah berubah prototipe saya untuk menjadi int * dan int * b. 850 00:54:11,280 --> 00:54:15,000 Jadi satu-satunya hal saya berubah untuk pergi dari merah, yang buruk, menjadi hijau, yang baik, 851 00:54:15,000 --> 00:54:17,350 adalah saya menambahkan bintang-bintang saat ini. 852 00:54:17,350 --> 00:54:21,520 Tapi kemudian di sini di menukar sendiri saya harus menyalin, paste apa yang hanya pada slide. 853 00:54:21,520 --> 00:54:24,140 Saya memiliki bintang di sini, bintang di sini - yang cocok prototipe - 854 00:54:24,140 --> 00:54:27,930 dan kemudian semua hal ini sekarang memiliki bintang kecuali untuk tmp 855 00:54:27,930 --> 00:54:30,680 karena penggunaan variabel sementara, tidak ada yang baru di sana. 856 00:54:30,680 --> 00:54:33,040 Aku hanya perlu penyimpanan sementara untuk int. 857 00:54:33,040 --> 00:54:34,820 Jadi kita tidak perlu bintang di sana. 858 00:54:34,820 --> 00:54:39,310 Kita hanya perlu bintang sehingga kita bisa menyeberang semacam ini batas sewenang-wenang 859 00:54:39,310 --> 00:54:42,900 antara 2 frame di memori komputer saya. 860 00:54:42,900 --> 00:54:45,630 Tapi satu hal terakhir harus berubah, dan Anda mungkin sudah dilirik. 861 00:54:45,630 --> 00:54:48,810 Apa baris lainnya jelas berbeda sekarang? >> [Mahasiswa] & x. 862 00:54:48,810 --> 00:54:53,270 >> Ya, jadi 25 adalah baris terakhir dari kode saya perlu mengubah untuk bekerja. 863 00:54:53,270 --> 00:54:58,360 Seminggu yang lalu dan bahkan pada hari Senin 25 jalur tampak seperti ini, swap x dan y, 864 00:54:58,360 --> 00:55:02,020 dan ini hanya rusak karena jika Anda mengatakan swap (x, y) 865 00:55:02,020 --> 00:55:05,660 Anda memberikan salinan x dan y untuk swap, maka itu melakukan hal tersebut, 866 00:55:05,660 --> 00:55:09,080 tapi kau pernah benar-benar berubah x dan y sendiri. 867 00:55:09,080 --> 00:55:12,880 Jadi bahkan jika Anda belum pernah melihat karakter ini sebelumnya dengan ampersand dalam kode, 868 00:55:12,880 --> 00:55:15,860 hanya mengambil menebak. Apa ampersand melakukan, rupanya? 869 00:55:15,860 --> 00:55:17,890 [Mahasiswa] Membawa alamat. Membawa >> alamat. 870 00:55:17,890 --> 00:55:21,160 Jadi ampersand yang dikatakan memberi saya alamat dari x. 871 00:55:21,160 --> 00:55:25,590 Siapa yang tahu di mana itu? Itu terjadi menjadi 123. Saya tidak peduli. Hanya memberi saya alamat dari x. 872 00:55:25,590 --> 00:55:28,340 & Y berarti memberi saya alamat y. 873 00:55:28,340 --> 00:55:34,450 Dan pada titik cerita yang sangat konsisten dengan gambar kita menarik beberapa saat yang lalu. 874 00:55:34,450 --> 00:55:38,310 >> Jadi saya akan mengakui pointer, tentu bagi saya ketika saya pertama kali mulai belajar ini, 875 00:55:38,310 --> 00:55:40,570 pasti salah satu hal yang paling sulit untuk membungkus pikiran saya sekitar. 876 00:55:40,570 --> 00:55:43,760 Tapi menyadari, terutama karena kami terus bermain dengan hal-hal seperti, 877 00:55:43,760 --> 00:55:48,030 jika Anda memecahnya tersebut semacam super sederhana dari intelektual menarik masalah 878 00:55:48,030 --> 00:55:52,270 hanya bergerak di sekitar angka, jawaban untuk banyak kebingungan dengan pointer 879 00:55:52,270 --> 00:55:56,590 benar-benar dapat berasal dari para mekanik yang sangat dasar. 880 00:55:56,590 --> 00:55:59,070 Berikut alamat. Pergi ke sana dengan bintang. 881 00:55:59,070 --> 00:56:03,830 Atau sebaliknya, inilah ampersand. Mencari tahu apa alamat sebenarnya. 882 00:56:03,830 --> 00:56:06,270 Baiklah. 883 00:56:06,270 --> 00:56:09,000 Jadi di mana semua memori ini berasal? 884 00:56:09,000 --> 00:56:12,360 Kami telah ditarik gambar ini beberapa kali, dan saya tetap menjanjikan kita akan kembali ke sana, 885 00:56:12,360 --> 00:56:14,920 tapi di sini adalah representasi dari memori komputer Anda 886 00:56:14,920 --> 00:56:17,420 itu sedikit lebih daripada label papan tulis kami di sini adalah. 887 00:56:17,420 --> 00:56:21,590 Segmen teks di atas mewakili apa sehubungan dengan program anda? 888 00:56:21,590 --> 00:56:26,090 [Respon siswa terdengar] >> Maaf? Katakanlah lagi. 889 00:56:26,090 --> 00:56:28,660 [Mahasiswa] Program yang sebenarnya. >> Program yang sebenarnya. 890 00:56:28,660 --> 00:56:32,430 >> Jadi dentang 0s dan 1s yang telah disusun setelah menulis kode C dan kemudian berjalan 891 00:56:32,430 --> 00:56:35,910 dan menghasilkan berakhir 0s dan 1s sampai mendapatkan terselip di sana dalam memori 892 00:56:35,910 --> 00:56:38,570 karena ketika Anda klik dua kali ikon pada Mac atau PC 893 00:56:38,570 --> 00:56:43,010 atau menjalankan perintah seperti mario pada prompt Anda, 0s dan 1s dari disk 894 00:56:43,010 --> 00:56:45,700 mendapatkan dimuat ke memori sehingga komputer dapat memanipulasi mereka 895 00:56:45,700 --> 00:56:47,540 dan mengeksekusi mereka lebih cepat. 896 00:56:47,540 --> 00:56:50,880 Data sehingga diinisialisasi dan data uninitialized, kita tidak akan berbicara banyak tentang mereka, 897 00:56:50,880 --> 00:56:52,420 tetapi mereka hanya variabel global. 898 00:56:52,420 --> 00:56:54,710 Diinisialisasi berarti variabel global yang Anda berikan nilai ke; 899 00:56:54,710 --> 00:56:59,300 uninitialized berarti variabel global yang belum memberikan nilai kepada. 900 00:56:59,300 --> 00:57:01,900 Lalu ada variabel lingkungan ini yang saya benar-benar akan melambaikan tangan saya di, 901 00:57:01,900 --> 00:57:04,860 tetapi mereka ada dan yang menyimpan hal-hal seperti nama pengguna Anda 902 00:57:04,860 --> 00:57:08,090 dan lainnya semacam rincian tingkat yang lebih rendah. 903 00:57:08,090 --> 00:57:12,880 Namun potongan juiciest tata letak memori Anda adalah hal ini disebut stack dan heap. 904 00:57:12,880 --> 00:57:17,470 Tumpukan lagi, harus jelas, adalah memori yang digunakan setiap kali fungsi dipanggil, 905 00:57:17,470 --> 00:57:19,710 setiap kali ada variabel lokal 906 00:57:19,710 --> 00:57:22,120 dan setiap kali ada parameter yang lulus sekitar. 907 00:57:22,120 --> 00:57:24,490 Semua itu terjadi dalam stack. 908 00:57:24,490 --> 00:57:29,570 Tumpukan kami belum dibicarakan, tetapi mengambil menebak yang menggunakan tumpukan. 909 00:57:31,120 --> 00:57:32,690 Hanya sepotong memori yang berbeda. 910 00:57:32,690 --> 00:57:36,620 Hal ini terjadi untuk ditarik di sini di bagian atas, tapi itu konvensi bergambar sewenang-wenang. 911 00:57:36,620 --> 00:57:41,670 Siapa yang tampaknya telah menggunakan memori dari tumpukan selama berminggu-minggu? 912 00:57:41,670 --> 00:57:44,830 Secara teknis Anda, tetapi tidak langsung. >> [Mahasiswa] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString dan malloc. Jadi, inilah perbedaan mendasar. 914 00:57:47,950 --> 00:57:51,300 >> Anda tahu beberapa minggu terakhir bahwa jika Anda memerlukan memori, hanya mendeklarasikan variabel. 915 00:57:51,300 --> 00:57:54,560 Jika Anda membutuhkan banyak memori, mendeklarasikan array yang tepat dalam fungsi Anda. 916 00:57:54,560 --> 00:57:59,620 Namun masalah kita terus hadapi adalah jika Anda mendeklarasikan variabel lokal dalam fungsi, 917 00:57:59,620 --> 00:58:05,340 segera setelah kembali fungsi, apa yang terjadi pada memori dan variabel tersebut? 918 00:58:05,340 --> 00:58:09,620 Hanya semacam itu tidak lagi milikmu, kan? Itu hanya menghilang semacam konseptual. 919 00:58:09,620 --> 00:58:13,950 Itu masih ada secara fisik, jelas, tapi itu tidak lagi hak Anda untuk menggunakan. 920 00:58:13,950 --> 00:58:17,160 Ini jelas bermasalah jika Anda ingin menulis fungsi dalam kehidupan 921 00:58:17,160 --> 00:58:20,440 yang benar-benar mengalokasikan memori dan tidak mengembalikannya segera. 922 00:58:20,440 --> 00:58:24,180 Kasus di titik: Tujuan GetString dalam hidup adalah memiliki tidak tahu di muka 923 00:58:24,180 --> 00:58:26,390 seberapa besar dari string aku akan mengetik pada keyboard, 924 00:58:26,390 --> 00:58:30,390 tapi itu harus dapat mengalokasikan memori untuk menahan David atau halo 925 00:58:30,390 --> 00:58:32,860 atau seluruh esai bahwa pengguna mungkin telah diketik masuk 926 00:58:32,860 --> 00:58:35,280 Jadi GetString telah menggunakan malloc. 927 00:58:35,280 --> 00:58:38,910 Malloc karenanya harus menggunakan tidak stack; 928 00:58:38,910 --> 00:58:40,770 sebagai gantinya ia menggunakan hal ini disebut heap. 929 00:58:40,770 --> 00:58:44,430 Tidak ada yang berbeda tentang memori. Ini tidak lebih cepat atau lebih lambat atau sesuatu seperti itu. 930 00:58:44,430 --> 00:58:46,570 Hanya saja secara fisik di lokasi yang berbeda. 931 00:58:46,570 --> 00:58:50,120 >> Namun aturan adalah bahwa memori yang dialokasikan pada heap 932 00:58:50,120 --> 00:58:56,180 tidak akan diambil dari Anda sampai Anda menelepon - mengambil menebak - bebas. 933 00:58:56,180 --> 00:59:00,510 Sebaliknya, memori apapun Anda meminta pada stack dengan hanya mendeklarasikan array 934 00:59:00,510 --> 00:59:03,320 atau mendeklarasikan variabel seperti yang telah kami lakukan selama berminggu-minggu, 935 00:59:03,320 --> 00:59:05,640 yang secara default berakhir pada stack. 936 00:59:05,640 --> 00:59:09,550 Dan itu baik 90% dari waktu, tetapi pada kesempatan langka 937 00:59:09,550 --> 00:59:12,470 di mana Anda ingin mengalokasikan memori dan tetap sekitar, 938 00:59:12,470 --> 00:59:14,730 maka Anda perlu menggunakan fungsi seperti malloc. 939 00:59:14,730 --> 00:59:19,370 Atau kita telah menggunakan fungsi seperti GetString, yang pada gilirannya menggunakan malloc. 940 00:59:19,370 --> 00:59:23,300 Mari kita lihat di mana hal ini mungkin rusak dan kemudian mengambil mengintip di Binky. 941 00:59:23,300 --> 00:59:25,820 Kami akan datang kembali ke di masa depan. 942 00:59:25,820 --> 00:59:29,270 Berikut adalah program super sederhana bahwa dalam 2 baris pertama melakukan apa? 943 00:59:29,270 --> 00:59:33,460 Dalam bahasa Inggris, apa ini pertama 2 baris kode lakukan dalam main? 944 00:59:33,460 --> 00:59:35,600 [Respon siswa tidak terdengar] 945 00:59:35,600 --> 00:59:37,880 Hati-hati. Ini tidak memberikan alamat dari x atau y. 946 00:59:37,880 --> 00:59:41,840 [Mahasiswa] Memberikan pointer ke ints. >> Baik. Beri aku 2 pointer ke integer. 947 00:59:41,840 --> 00:59:45,130 Dengan kata lain, beri aku 2 potongan memori yang aku terus menggambar hari ini, 948 00:59:45,130 --> 00:59:46,950 meskipun saya terhapus sekarang, sebagai kotak. 949 00:59:46,950 --> 00:59:50,000 Beri aku 2 potongan memori, yang disebut x, yang disebut y - 950 00:59:50,000 --> 00:59:54,320 sebelumnya saya memanggil mereka s dan t - dan apa jenis yang sepotong memori? 951 00:59:54,320 --> 00:59:57,160 Ini akan menyimpan alamat. 952 00:59:57,160 --> 00:59:59,110 Ini dari * tipe int. 953 00:59:59,110 --> 01:00:01,630 >> Jadi alamat int akhirnya akan tinggal di x, 954 01:00:01,630 --> 01:00:03,860 alamat int akhirnya akan tinggal di y, 955 01:00:03,860 --> 01:00:08,460 tapi awalnya, apa dalam x dan y? Siapa yang tahu? Sampah nilai. 956 01:00:08,460 --> 01:00:10,180 Ini tidak ada hubungannya dengan pointer. 957 01:00:10,180 --> 01:00:12,720 Jika kita tidak menempatkan sesuatu di sana, siapa tahu apa yang sebenarnya ada? 958 01:00:12,720 --> 01:00:18,950 Sekarang, x. Apa yang terjadi di sini? Hal ini legit sekarang karena x adalah pointer. Ini adalah * int. 959 01:00:18,950 --> 01:00:21,870 Jadi itu berarti saya bisa dimasukkan ke dalam x alamat beberapa potongan memori. 960 01:00:21,870 --> 01:00:25,120 Apa malloc kembali? Sempurna, ia mengembalikan alamat, 961 01:00:25,120 --> 01:00:28,510 alamat dari byte pertama dalam sepotong seluruh memori. 962 01:00:28,510 --> 01:00:31,140 Berapa banyak byte ini tampaknya mengalokasikan, misalnya, dalam alat? 963 01:00:31,140 --> 01:00:33,510 Apa ukuran int? 4. 964 01:00:33,510 --> 01:00:36,600 Jika Anda berpikir kembali ke minggu 1, itu tidak super penting untuk selalu ingat bahwa, 965 01:00:36,600 --> 01:00:38,870 tetapi dalam kasus ini itu berguna untuk mengetahui, 4 byte. 966 01:00:38,870 --> 01:00:41,770 Jadi ini mengalokasikan pada 4 byte tumpukan 967 01:00:41,770 --> 01:00:46,110 dan itu kembali alamat yang pertama bagi saya sewenang-wenang. 968 01:00:46,110 --> 01:00:47,700 Sekarang, apa yang x lakukan? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 melakukan apa? 970 01:00:52,200 --> 01:00:57,150 Jika pada titik ini dalam cerita kita memiliki x, yang terlihat seperti ini dengan beberapa nilai sampah, 971 01:00:57,150 --> 01:01:04,120 ini sekarang y dengan beberapa nilai sampah, sekarang di baris 3 saya telah dialokasikan 4 byte. 972 01:01:04,120 --> 01:01:06,950 Gambar ini pada dasarnya terlihat seperti ini. 973 01:01:06,950 --> 01:01:12,010 Atau lebih spesifik, jika ini adalah alamat sewenang-wenang 123, ini adalah apa cerita kita sekarang tampak seperti. 974 01:01:12,010 --> 01:01:23,940 * X = 42 sekarang berarti apa? Itu berarti pergi ke 123 alamat dan menempatkan nomor 42 di sana. 975 01:01:23,940 --> 01:01:26,220 Saya tidak perlu menggambar garis-garis karena kita tidak melakukan string. 976 01:01:26,220 --> 01:01:29,480 >> Aku seharusnya hanya ditulis seperti ini, dan hanya untuk kepentingan demonstrasi ini, 977 01:01:29,480 --> 01:01:33,240 42 sebagai jenis int memakan banyak ruang, 4 byte. 978 01:01:33,240 --> 01:01:35,960 Jadi itulah apa yang terjadi di sana, tapi ada masalah sekarang. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Apa yang akan terjadi di sini? 980 01:01:40,580 --> 01:01:46,470 Masalahnya adalah * y di dunia disederhanakan kami hanya berarti pergi ke alamat di y. 981 01:01:46,470 --> 01:01:48,590 Apa yang ada di y? Ini adalah beberapa nilai sampah. 982 01:01:48,590 --> 01:01:53,150 Jadi mari kita asumsikan bahwa nilai sampah adalah 5551212, sesuatu yang gila seperti itu. 983 01:01:53,150 --> 01:01:56,750 * Y cara pergi untuk mengatasi 5.551.212. 984 01:01:56,750 --> 01:02:00,450 Itu seperti di sini. Ini tidak ada, misalnya. 985 01:02:00,450 --> 01:02:05,310 Jadi * y mendapat 13 berarti saya sedang mencoba untuk menarik 13 di sini. Itu tidak ada. 986 01:02:05,310 --> 01:02:08,790 Saya sudah melebihi segmen papan tulis. Apa yang saya dapatkan? 987 01:02:08,790 --> 01:02:14,930 Itu segmentasi samar pesan kesalahan karena saya sedang mencoba untuk dimasukkan ke dalam memori 988 01:02:14,930 --> 01:02:19,470 nilai seperti 13 di tempat yang tidak ada. 989 01:02:19,470 --> 01:02:23,900 Sisa program bisa bekerja baik-baik saja, tapi sampai saat itu tidak. 990 01:02:23,900 --> 01:02:25,350 Jadi mari kita coba untuk menceritakan kisah ini. 991 01:02:25,350 --> 01:02:27,830 Kami akan kembali ke bahwa sekali kita telah berbicara tentang hex. 992 01:02:27,830 --> 01:02:30,290 Mari kita kembali ke ini dan menyimpulkan dengan hal ini disebut Binky, 993 01:02:30,290 --> 01:02:33,710 yang recall adalah seorang profesor Stanford duduk di rumah bermain dengan claymation, 994 01:02:33,710 --> 01:02:36,380 untuk menceritakan kisah persis bahwa program yang sama. 995 01:02:36,380 --> 01:02:40,580 Ini hanya sekitar 3 menit. Disini kita memiliki Binky. 996 01:02:40,580 --> 01:02:45,030 [Speaker pria di video] Hey Binky, bangun. Sudah waktunya untuk bersenang-senang pointer. 997 01:02:45,030 --> 01:02:50,080 [Binky] Apa itu? Pelajari tentang pointer? Oh, goody! 998 01:02:50,080 --> 01:02:53,700 [Speaker laki-laki] Nah, untuk memulai, saya kira kita akan membutuhkan beberapa pointer. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Oke. Kode ini mengalokasikan 2 pointer yang dapat menunjuk ke bilangan bulat. 1000 01:02:57,890 --> 01:03:02,220 [Speaker laki-laki] Oke. Nah, saya melihat 2 pointer, tetapi mereka tampaknya tidak akan menunjuk ke apapun. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Itu benar. Awalnya, pointer tidak menunjukkan apa pun. 1002 01:03:05,550 --> 01:03:09,270 Hal-hal yang mereka menunjuk disebut pointees, dan pengaturan mereka adalah langkah terpisah. 1003 01:03:09,270 --> 01:03:12,330 [Speaker laki-laki] Oh, benar, benar. Aku tahu itu. Para pointees terpisah. 1004 01:03:12,330 --> 01:03:15,630 Eh, jadi bagaimana Anda mengalokasikan sebuah Pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Oke. Kode ini mengalokasikan Pointee integer baru, dan bagian ini menetapkan x untuk menunjukkan hal itu. 1006 01:03:21,510 --> 01:03:23,500 [Speaker laki-laki] Hei, yang terlihat lebih baik. 1007 01:03:23,500 --> 01:03:26,030 Jadi membuatnya melakukan sesuatu. >> [Binky] Oke. 1008 01:03:26,030 --> 01:03:30,300 Aku akan dereference x pointer untuk menyimpan nomor 42 ke Pointee nya. 1009 01:03:30,300 --> 01:03:34,410 Untuk trik ini saya akan membutuhkan tongkat sihir saya dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Speaker laki-laki] tongkat sihir Anda dari dereferencing? Itu bagus. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Ini adalah apa yang tampak seperti kode. Aku hanya akan mengatur jumlah dan ... [Bermunculan suara] 1012 01:03:44,230 --> 01:03:46,100 [Speaker laki-laki] Hei lihat, ada kelanjutannya. 1013 01:03:46,100 --> 01:03:50,990 Jadi melakukan dereference pada x mengikuti panah untuk mengakses Pointee nya, 1014 01:03:50,990 --> 01:03:53,230 dalam hal ini untuk menyimpan 42 di sana. 1015 01:03:53,230 --> 01:03:57,630 Hei, coba gunakan untuk menyimpan angka 13 melalui pointer lain, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Oke. Aku hanya akan pergi ke sini untuk y dan mendapatkan nomor 13 mengatur 1017 01:04:03,250 --> 01:04:08,360 dan kemudian mengambil tongkat dereferencing dan hanya ... [Berdengung suara] Whoa! 1018 01:04:08,360 --> 01:04:10,980 [Laki speaker] Oh hey, itu tidak berhasil. 1019 01:04:10,980 --> 01:04:14,870 >> Katakanlah, Binky, saya tidak berpikir dereferencing y adalah ide yang baik 1020 01:04:14,870 --> 01:04:17,880 karena pengaturan Pointee merupakan langkah terpisah 1021 01:04:17,880 --> 01:04:19,850 dan saya tidak berpikir kita pernah melakukannya. 1022 01:04:19,850 --> 01:04:21,770 [Binky] Hmm, titik yang baik. 1023 01:04:21,770 --> 01:04:26,640 [Speaker laki-laki] Ya. Kami dialokasikan y pointer tapi kami tidak pernah mengaturnya untuk menunjuk ke sebuah Pointee. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, sangat jeli. 1025 01:04:28,780 --> 01:04:30,690 [Speaker laki-laki] Hei, Anda mencari baik di sana, Binky. 1026 01:04:30,690 --> 01:04:34,160 Dapatkah Anda memperbaikinya sehingga poin y ke Pointee yang sama sebagai x? >> [Binky] Tentu. 1027 01:04:34,160 --> 01:04:37,100 Saya akan menggunakan tongkat sihir saya penempatan penunjuk. 1028 01:04:37,100 --> 01:04:39,070 [Speaker laki-laki] Apakah itu akan menjadi masalah seperti sebelumnya? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Tidak, ini tidak menyentuh pointees. 1030 01:04:40,840 --> 01:04:44,780 Itu hanya berubah satu pointer untuk menunjuk ke hal yang sama seperti yang lain. [Bermunculan suara] 1031 01:04:44,780 --> 01:04:48,570 [Speaker laki-laki] Oh, saya melihat. Sekarang y poin ke tempat yang sama sebagai x. 1032 01:04:48,570 --> 01:04:51,140 Jadi tunggu. Sekarang y adalah tetap. Memiliki Pointee a. 1033 01:04:51,140 --> 01:04:54,520 Jadi Anda dapat mencoba tongkat dereferencing lagi untuk mengirim lebih 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Uh, oke. Ini dia. [Bermunculan suara] 1035 01:04:58,130 --> 01:05:01,250 [Speaker laki-laki] Hei, lihat itu. Sekarang dereferencing bekerja pada y. 1036 01:05:01,250 --> 01:05:05,200 Dan karena pointer berbagi bahwa satu Pointee, mereka berdua melihat 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Ya, berbagi. Apapun. 1038 01:05:06,910 --> 01:05:08,880 >> Jadi kita akan beralih tempat sekarang? 1039 01:05:08,880 --> 01:05:11,420 [Speaker laki-laki] Oh lihat, kita kehabisan waktu. >> [Binky] Tapi - 1040 01:05:11,420 --> 01:05:13,880 [Speaker laki-laki] Hanya ingat 3 aturan pointer. 1041 01:05:13,880 --> 01:05:18,630 Nomor 1, struktur dasar adalah bahwa Anda memiliki pointer dan menunjuk ke sebuah Pointee. 1042 01:05:18,630 --> 01:05:23,120 Tetapi pointer dan Pointee terpisah, dan kesalahan umum adalah untuk mengatur pointer 1043 01:05:23,120 --> 01:05:25,680 tetapi lupa untuk memberikan suatu Pointee. 1044 01:05:25,680 --> 01:05:29,580 Nomor 2, dereferencing pointer dimulai pada pointer dan mengikuti panah yang selama 1045 01:05:29,580 --> 01:05:31,060 untuk mengakses Pointee nya. 1046 01:05:31,060 --> 01:05:34,340 Seperti yang kita semua tahu, ini hanya bekerja jika ada suatu Pointee, 1047 01:05:34,340 --> 01:05:36,460 yang jenis akan kembali ke aturan nomor 1. 1048 01:05:36,460 --> 01:05:39,870 Nomor 3, penempatan penunjuk mengambil satu pointer dan mengubahnya 1049 01:05:39,870 --> 01:05:42,390 untuk menunjuk ke Pointee sama dengan pointer lain. 1050 01:05:42,390 --> 01:05:45,890 Jadi setelah penugasan, 2 pointer akan menunjuk ke Pointee yang sama. 1051 01:05:45,890 --> 01:05:47,800 Kadang-kadang itu disebut berbagi. 1052 01:05:47,800 --> 01:05:50,910 >> Dan itu semua ada untuk itu benar. Bye-bye sekarang. 1053 01:05:50,910 --> 01:05:55,840 Ini Binky. Ini adalah CS50. Kita akan melihat Anda minggu depan. [Tepuk tangan] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]