1 00:00:00,000 --> 00:00:02,310 [Powered by Google Translate] [Week 4, Sambungan] 2 00:00:02,310 --> 00:00:04,240 [David J. Malan - Universiti 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 4 minggu. 5 00:00:11,290 --> 00:00:14,030 Jadi beberapa berita baik dan ada berita buruk. 6 00:00:14,030 --> 00:00:26,240 Tiada kuliah pada hari Isnin, tiada masalah menetapkan minggu depan. [Pelajar bersorak] 7 00:00:26,240 --> 00:00:28,680 Anda tidak akan suka di mana ini akan. 8 00:00:28,680 --> 00:00:31,590 Tetapi kita tidak mempunyai ini bukan Rabu depan, 9 00:00:31,590 --> 00:00:37,740 dan terdapat juga satu sukatan pelajaran 1 Jumaat kuliah Jumaat depan supaya kita boleh tinggal di landasan yang betul. 10 00:00:37,740 --> 00:00:40,580 Tetapi segala-galanya akan difilemkan seperti biasa, jadi tidak perlu bimbang. 11 00:00:40,580 --> 00:00:44,100 >> Dan berkenaan dengan kuiz 0 apa yang kita akan lakukan ke arah hujung minggu 12 00:00:44,100 --> 00:00:47,140 pos di cs50.net laman web kursus penjelasan 13 00:00:47,140 --> 00:00:50,160 apa jenis jangkaan anda perlu mempunyai apabila ia datang kepada kuiz yang pertama. 14 00:00:50,160 --> 00:00:55,100 Secara umum, ia akan menjadi pilihan berganda, benar-palsu, jawapan pendek, pendek pengekodan masalah. 15 00:00:55,100 --> 00:00:57,360 Anda tidak akan dijangka untuk melaksanakan bersamaan 16 00:00:57,360 --> 00:01:00,030 masalah yang anda akan lihat di pset satu, yang mana anda mempunyai sebuah komputer 17 00:01:00,030 --> 00:01:03,240 dan penyahpepijat dan sebagainya, tetapi akan ada kecil pengekodan masalah. 18 00:01:03,240 --> 00:01:06,900 >> Dan sesungguhnya, panduan terbaik untuk mendapatkan rasa apa yang CS50 kuiz adalah seperti 19 00:01:06,900 --> 00:01:09,180 pergi ke cs50.net, pergi ke link Kuiz, 20 00:01:09,180 --> 00:01:11,920 dan anda boleh lihat beberapa tahun yang lalu bernilai kuiz. 21 00:01:11,920 --> 00:01:16,600 Hanya sedar bahawa kurikulum tidak sentiasa sama sejak bertahun-tahun. 22 00:01:16,600 --> 00:01:18,510 Kadang-kadang kita menambah, kadang-kadang tolak, 23 00:01:18,510 --> 00:01:20,670 jadi jika anda melihat beberapa topik di salah satu daripada orang-orang tua kuiz 24 00:01:20,670 --> 00:01:25,380 bahawa anda tidak mempunyai idea apa yang ia bercakap tentang, ia adalah sama ada yang kita tidak menutupinya 25 00:01:25,380 --> 00:01:27,210 atau bahawa kita tidak menutupinya. 26 00:01:27,210 --> 00:01:31,110 Tetapi dalam bentuk ulasan, Ahad ini, Isnin, dan Selasa 27 00:01:31,110 --> 00:01:34,770 serta seluruh kursus-ulasan sesi pada malam Ahad - 28 00:01:34,770 --> 00:01:37,500 masa dan lokasi akan diumumkan pada halaman utama kursus - 29 00:01:37,500 --> 00:01:40,120 anda semua mempunyai peluang untuk mengkaji dengan felo pengajaran kursus 30 00:01:40,120 --> 00:01:44,830 bahan bagi tahun ini, kedua-dua dalam seksyen dan sebagai kelas penuh, 31 00:01:44,830 --> 00:01:48,400 dan mereka akan difilemkan seperti biasa juga. 32 00:01:48,400 --> 00:01:53,380 >> Semua hak. Jadi, tanpa berlengah-lengah lagi, satu komen pada pas / gagal dan menambah / menggugurkan. 33 00:01:53,380 --> 00:01:57,980 Anda mungkin telah melihat nota saya malam tadi, dan ini adalah benar-benar hanya beberapa jaminan tambahan 34 00:01:57,980 --> 00:02:01,250 bahawa jika anda berada di kalangan orang-orang yang kurang selesa atau di suatu tempat di antara 35 00:02:01,250 --> 00:02:04,870 dan anda rasa hanya sedikit di atas kepala anda, 36 00:02:04,870 --> 00:02:08,430 menyedari bahawa memang agak biasa, dan terdapat struktur sokongan yang mencukupi di tempat, 37 00:02:08,430 --> 00:02:13,530 salah satu yang waktu pejabat adalah niat untuk memperbaiki semua lebih setiap malam lepas e-mel saya, 38 00:02:13,530 --> 00:02:16,520 dan menyedari juga bahawa pilihan seperti pas / gagal untuk kelas seperti ini 39 00:02:16,520 --> 00:02:21,540 benar-benar dimaksudkan sebagai mekanisme untuk mengambil kelebihan luar kursus seperti ini, 40 00:02:21,540 --> 00:02:24,200 supaya sekali lagi jika anda menghabiskan masa mereka 10, 15, 20 jam 41 00:02:24,200 --> 00:02:28,160 hanya cuba untuk mendapatkan beberapa pset untuk bekerja dan anda tahu anda 90-95% cara di sana 42 00:02:28,160 --> 00:02:32,100 tetapi anda tidak boleh menemui beberapa pepijat sialan, dalam pas / gagal model yang jenis okay. 43 00:02:32,100 --> 00:02:36,230 >> Idea ini adalah bahawa dengan mekanisme itu maka anda boleh pergi tumpuan pada psets anda yang lain 44 00:02:36,230 --> 00:02:39,530 atau tidur atau apa sahaja ia adalah yang anda mahu memberi tumpuan kepada. 45 00:02:39,530 --> 00:02:43,390 Jadi, menyedari bahawa anda mempunyai sehingga ini Selasa akan datang - teknikal 5th Isnin, 46 00:02:43,390 --> 00:02:50,840 tetapi ia adalah hari cuti, jadi ini hari selasa - untuk beralih dari pas / gagal untuk gred atau sebaliknya. 47 00:02:50,840 --> 00:02:54,450 Dan jika anda benar-benar pada jurang dan ingin menjatuhkan sama sekali, 48 00:02:54,450 --> 00:02:56,440 sila menangkap saya selepas kuliah atau menggugurkan saya nota. 49 00:02:56,440 --> 00:02:59,990 Kami suka untuk sembang sekurang-kurangnya sebelum anda tawaran kata perpisahan. 50 00:02:59,990 --> 00:03:03,470 Semua hak. Jadi kita mula mengambil roda latihan off kali terakhir. 51 00:03:03,470 --> 00:03:06,030 Secara khususnya, kami memberi tumpuan pada tali. 52 00:03:06,030 --> 00:03:09,740 Rentetan adalah sesuatu yang diisytiharkan di perpustakaan CS50, 53 00:03:09,740 --> 00:03:14,340 khusus dalam fail yang dipanggil cs50.h yang kita akan mula kelihatan pada minggu ini dan seterusnya. 54 00:03:14,340 --> 00:03:17,250 Tetapi rentetan adalah benar-benar hanya pemudahan sesuatu 55 00:03:17,250 --> 00:03:20,980 itulah sedikit lebih arcanely digambarkan sebagai * char. 56 00:03:20,980 --> 00:03:24,090 Char kita sudah biasa dengan. Ia hanya watak tunggal. 57 00:03:24,090 --> 00:03:28,010 Tetapi * Isnin ditandakan apa? >> [Pelajar] penunjuk A. 58 00:03:28,010 --> 00:03:31,290 Penunjuk. Dan apa yang penunjuk? >> [Pelajar] address. 59 00:03:31,290 --> 00:03:33,420 >> Ia seperti alamat, lokasi dalam ingatan. 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 mempunyai komputer riba dengan persembahan atau 2 Gigabyte RAM kemungkinan besar hari ini, 62 00:03:40,290 --> 00:03:44,160 dan ini bermakna anda mempunyai bilion atau 2 bilion bytes bernilai ingatan. 63 00:03:44,160 --> 00:03:46,240 Dan ia tidak benar-benar perkara apa yang secara fizikal kelihatan seperti, 64 00:03:46,240 --> 00:03:51,220 tetapi mengambil iman yang anda boleh bilangannya semua bait individu bahawa komputer riba anda sendiri mempunyai - 65 00:03:51,220 --> 00:03:54,580 ini adalah bait 0, ini adalah bait 1, ini adalah bait 2000000000 - 66 00:03:54,580 --> 00:03:56,100 dan itulah apa yang dilakukan oleh komputer. 67 00:03:56,100 --> 00:04:00,030 Apabila anda memperuntukkan ruang untuk watak tunggal, misalnya, 68 00:04:00,030 --> 00:04:02,480 ia jelas mempunyai hidup di suatu tempat di dalam memori komputer anda, 69 00:04:02,480 --> 00:04:05,860 dan mungkin ia adalah di beberapa bait 12345, 70 00:04:05,860 --> 00:04:08,470 dan itulah tempat di sini di dalam memori komputer anda. 71 00:04:08,470 --> 00:04:12,630 Dan alamat maka watak itu adalah 12345. 72 00:04:12,630 --> 00:04:16,140 >> Kini, 0 minggu melalui kini setakat, kita tidak benar-benar dijaga 73 00:04:16,140 --> 00:04:19,170 di mana dalam perkara-perkara memori disimpan kerana kita biasanya menggunakan simbol, 74 00:04:19,170 --> 00:04:22,540 pembolehubah, dan array untuk benar-benar mendapat sekurang-data kami. 75 00:04:22,540 --> 00:04:24,950 Tetapi seperti Isnin dan semua lebih hari ini, anda kini akan mempunyai 76 00:04:24,950 --> 00:04:27,710 semua keupayaan yang lebih ekspresif dengan program-program bertulis 77 00:04:27,710 --> 00:04:31,330 untuk benar-benar memanipulasi memori komputer tetapi anda lihat patut, 78 00:04:31,330 --> 00:04:33,720 bagi kedua-dua tujuan yang baik dan buruk, 79 00:04:33,720 --> 00:04:39,620 pepijat menjadi hasil yang sangat biasa pada ketika ini dalam pembelajaran barangan ini. 80 00:04:39,620 --> 00:04:42,460 Tetapi apakah ia benar-benar bermakna untuk menjadi * char? 81 00:04:42,460 --> 00:04:46,140 Mari pergi ke hadapan kembali ke - dan kita akan kembali Binky seperti yang dijanjikan hari ini. 82 00:04:46,140 --> 00:04:48,670 Mari kita pergi ke contoh yang mudah di sini. 83 00:04:48,670 --> 00:04:53,060 Biar saya menyelamatkan fail ini sebagai compare.c, dan biarlah saya hanya mendapat beberapa kod template sini 84 00:04:53,060 --> 00:05:00,490 begitu termasuk stdio.h, izinkan saya juga memberi diri saya termasuk cs50.h. Saya akan mengezum masuk di sana. 85 00:05:00,490 --> 00:05:05,850 Biar saya mulakan menulis int utama, utama (tidak sah), dan sekarang saya mahu melakukan sesuatu seperti ini: 86 00:05:05,850 --> 00:05:13,520 printf ("Berikan saya rentetan:") dan kemudian saya akan menggunakan s rentetan mendapat GetString 87 00:05:13,520 --> 00:05:16,750 untuk mendapatkan rentetan daripada pengguna, maka saya akan meminta pengguna untuk satu lagi. 88 00:05:16,750 --> 00:05:21,870 ("Berikan saya satu lagi rentetan:") dan saya akan bertanya kepada mereka melalui GetString untuk mendapatkan. 89 00:05:21,870 --> 00:05:27,020 Saya akan memanggilnya t kerana t datang selepas s dan s adalah nama yang bagus untuk rentetan jika ia agak generik. 90 00:05:27,020 --> 00:05:30,030 Jadi GetString, dan sekarang saya hanya mahu melakukan pemeriksaan kewarasan dan saya akan katakan 91 00:05:30,030 --> 00:05:39,770 jika (s == t) dan kemudian saya hanya akan memberitahu pengguna printf ("Anda ditaip perkara yang sama \ n!"); 92 00:05:39,770 --> 00:05:45,520 lain saya akan mencetak keluar sesuatu seperti ("Anda ditaip sesuatu yang berbeza! \ n") 93 00:05:45,520 --> 00:05:48,460 atau apa-apa hukuman akan menjadi. Jadi sesuatu seperti itu. 94 00:05:48,460 --> 00:05:52,200 Kemudian seperti biasa, saya akan kembali 0 yang hanya menandakan bahawa tiada perkara buruk berlaku, 95 00:05:52,200 --> 00:05:54,400 dan saya akan pergi ke hadapan dan menyusun dan menjalankan program ini. 96 00:05:54,400 --> 00:05:56,540 >> Tetapi pada hari Isnin kita berlari program ini, 97 00:05:56,540 --> 00:06:00,420 dan sebenarnya diberitahu bahawa HELLO tidak HELLO dan SELAMAT TINGGAL adalah tidak SELAMAT TINGGAL. 98 00:06:00,420 --> 00:06:03,140 Tingkah laku yang kita lihat adalah sedikit lebih seperti ini. 99 00:06:03,140 --> 00:06:11,450 Biar saya pergi ke dalam direktori sumber saya, zoom di sini, dan mari kita lakukan membuat bandingkan. 100 00:06:11,450 --> 00:06:14,570 Disusun okay. Membiarkan saya menjalankan membandingkan. Beri saya rentetan: HELLO. 101 00:06:14,570 --> 00:06:16,300 Berikan saya satu lagi rentetan: HELLO. 102 00:06:16,300 --> 00:06:18,000 Anda menaip sesuatu yang berbeza! 103 00:06:18,000 --> 00:06:22,650 Baiklah, biar saya mencuba sesuatu yang mudah seperti 50, 50. Anda menaip sesuatu yang berbeza! 104 00:06:22,650 --> 00:06:25,740 hi, hi. Jadi jelas, sesuatu yang berlaku di sini. 105 00:06:25,740 --> 00:06:28,440 Tetapi apa yang adalah penjelasan mengapa? 106 00:06:28,440 --> 00:06:33,850 Rupa-rupanya, talian 12 adalah benar-benar berfungsi. 107 00:06:34,300 --> 00:06:39,430 Apakah masalah asas di sini? Yeah. >> [Pelajar] Ia membandingkan alamat. 108 00:06:39,430 --> 00:06:41,850 Ya, sebenarnya. Ia sebenarnya membandingkan alamat 109 00:06:41,850 --> 00:06:44,580 di mana HELLO dan HELLO disimpan. 110 00:06:44,580 --> 00:06:48,290 Ia tidak membandingkan huruf HELLO sekali lagi dan sekali lagi, 111 00:06:48,290 --> 00:06:52,370 kerana apa yang benar-benar berlaku, semua masa ini kita telah menggunakan GetString - 112 00:06:52,370 --> 00:06:56,130 Papan hitam ini sekali lagi memori komputer kita, 113 00:06:56,130 --> 00:07:00,100 dan katakan saya panggil GetString selepas mengisytiharkan s berubah-ubah. 114 00:07:00,100 --> 00:07:01,930 Apakah ingatan saya kelihatan seperti? 115 00:07:01,930 --> 00:07:07,070 Mari kita sewenang-wenangnya mengatakan bahawa s kelihatan seperti ini. Ia adalah persegi. 116 00:07:07,070 --> 00:07:09,040 Dan cukup banyak bila-bila masa saya menarik sekeping memori pada skrin 117 00:07:09,040 --> 00:07:12,860 jika ia adalah 32-bit saya telah menarik dataran seperti ini kerana sesungguhnya di dalam perkakas, 118 00:07:12,860 --> 00:07:17,380 penunjuk, alamat, adalah 32-bit. Ia adalah sama seperti int. 119 00:07:17,380 --> 00:07:19,420 Yang boleh berbeza-beza berdasarkan sistem komputer. 120 00:07:19,420 --> 00:07:24,630 Orang-orang yang samar-samar biasa dengan hakikat bahawa Mac atau PC anda adalah 64-bit, 121 00:07:24,630 --> 00:07:28,120 yang sebenarnya menandakan bahawa komputer anda menggunakan petunjuk 64-bit, 122 00:07:28,120 --> 00:07:33,730 Alamat 64-bit, dan di kalangan upsides bahawa komputer anda 123 00:07:33,730 --> 00:07:35,560 boleh mempunyai RAM lebih daripada tadi. 124 00:07:35,560 --> 00:07:39,240 Cerita panjang pendek, kembali pada hari apabila komputer hanya digunakan 32 bit 125 00:07:39,240 --> 00:07:42,740 untuk mewakili alamat, bilangan terbesar bait anda boleh mewakili 126 00:07:42,740 --> 00:07:46,280 dalam kes itu adalah apa yang jika anda mempunyai 32 bit? 127 00:07:46,280 --> 00:07:49,590 Jadi 4 bilion, kanan, kerana 2 daripada 32 adalah 4 bilion. 128 00:07:49,590 --> 00:07:51,370 Nombor ini telah berulang dalam kursus ini. 129 00:07:51,370 --> 00:07:55,240 >> Jadi jika anda hanya mempunyai 32 bit, bilangan tertinggi anda boleh bergantung kepada adalah kira-kira 4 bilion. 130 00:07:55,240 --> 00:07:58,750 Tetapi itu adalah had asas komputer sehingga beberapa tahun yang lalu 131 00:07:58,750 --> 00:08:01,180 kerana jika anda hanya boleh dikira sebagai tinggi sebagai 4 bilion, 132 00:08:01,180 --> 00:08:05,270 ia tidak kira jika anda membeli 8 gigabait RAM atau lebih 5 gigabait RAM; 133 00:08:05,270 --> 00:08:07,780 anda tidak boleh mengharapkan yang tinggi, jadi ia adalah sia-sia. 134 00:08:07,780 --> 00:08:11,430 Anda hanya boleh mengakses pertama 3 atau 4 gigabait memori komputer anda. 135 00:08:11,430 --> 00:08:14,410 Itu kurang daripada satu isu sekarang, dan anda boleh membeli MacBook Pro dan Dells 136 00:08:14,410 --> 00:08:17,680 dengan 8 gigabait RAM atau lebih hari ini. 137 00:08:17,680 --> 00:08:24,100 Tetapi jika saya memperuntukkan agak hanya dalam program ini penunjuk, penunjuk dipanggil s, 138 00:08:24,100 --> 00:08:28,370 ia mungkin kelihatan seperti ini pada skrin kerana sesungguhnya kita perlu mengupas kembali lapisan ini. 139 00:08:28,370 --> 00:08:33,520 Saya menyimpan rentetan berkata, tetapi seperti hari Isnin, tali adalah benar-benar * char, 140 00:08:33,520 --> 00:08:35,590 alamat beberapa watak. 141 00:08:35,590 --> 00:08:39,280 Jadi mari kita mengambil roda latihan luar walaupun kita akan terus menggunakan GetString sekarang. 142 00:08:39,280 --> 00:08:42,600 Jadi saya telah diisytiharkan s, dan ini adalah sebahagian memori, 32-bit. 143 00:08:42,600 --> 00:08:47,370 Apakah di sini dalam ingatan secara lalai? >> [Sambutan pelajar didengar] 144 00:08:47,370 --> 00:08:50,040 Apa itu? >> [Pelajar] Sampah. Sampah. >> Tepat sekali. 145 00:08:50,040 --> 00:08:54,610 Jika anda pengaturcara tidak meletakkan nilai dalam pembolehubah, yang tahu apa itu? 146 00:08:54,610 --> 00:08:57,990 Kadang-kadang anda mendapatkan bertuah dan ia adalah 0, yang merupakan jenis yang bagus, default nilai bersih, 147 00:08:57,990 --> 00:09:00,310 tetapi seperti yang kita lihat hari Isnin, kadang-kadang ia adalah karut lengkap, 148 00:09:00,310 --> 00:09:04,130 beberapa benar-benar besar nombor positif atau negatif yang datang dari mana? 149 00:09:05,350 --> 00:09:07,010 Yeah. >> [Pelajar] Fungsi sebelum. >> Yeah. 150 00:09:07,010 --> 00:09:10,170 >> Selalunya fungsi yang mendapat dipanggil sebelum ini kerana ingat, 151 00:09:10,170 --> 00:09:13,920 kerana anda memanggil fungsi dalam ingatan, mereka mengambil lebih banyak ruang dan lebih dari bawah ke atas, 152 00:09:13,920 --> 00:09:17,040 dan secepat pulangan fungsi, memori yang mendapat semula 153 00:09:17,040 --> 00:09:20,890 oleh seorang lelaki seterusnya yang mendapat dipanggil, yang menggunakan keping sama anda memori. 154 00:09:20,890 --> 00:09:23,450 Dan jika anda telah sampah kiri sana, nilai sebelumnya, 155 00:09:23,450 --> 00:09:28,190 kita mungkin kesilapan s sebagai mempunyai nilai tertentu apabila benar-benar kita tidak letakkan apa-apa di sana. 156 00:09:28,190 --> 00:09:30,960 Jadi RAM kami pada ketika ini kelihatan seperti ini. 157 00:09:30,960 --> 00:09:36,030 Kini di sebelah kanan garis 7 kita memanggil GetString, 158 00:09:36,030 --> 00:09:40,150 yang kita telah lakukan sekarang untuk minggu, tetapi apa yang GetString benar-benar melakukan? 159 00:09:40,150 --> 00:09:43,350 GetString ditulis oleh kakitangan CS50 adalah sedikit pintar 160 00:09:43,350 --> 00:09:46,500 bahawa sebaik sahaja pengguna mula menaip kunci dan hits Masukkan, 161 00:09:46,500 --> 00:09:50,010 GetString angka keluar berapa banyak ketukan kekunci melakukan melanda pengguna, 162 00:09:50,010 --> 00:09:53,360 berapa banyak watak-watak yang saya perlukan untuk memperuntukkan RAM untuk. 163 00:09:53,360 --> 00:09:55,660 Dan di mana RAM yang datang, siapa tahu? 164 00:09:55,660 --> 00:09:58,930 Ia adalah tempat di gigabait 2 komputer anda atau barang kecil memori. 165 00:09:58,930 --> 00:10:05,200 Tetapi mari kita andaikan bahawa komputer mendapati ruang untuk perkataan HELLO di sini. 166 00:10:05,200 --> 00:10:08,710 Perkataan yang saya taipkan adalah H-E-L-L-O. 167 00:10:08,710 --> 00:10:13,510 Dan jika kita menarik ini sebagai urutan aksara, kita mungkin menarik seperti ini. 168 00:10:13,510 --> 00:10:17,860 Tetapi saya perlu melakukan 1 perkara tambahan. Apa yang dimiliki pada akhir rentetan apa-apa dalam C? 169 00:10:17,860 --> 00:10:20,710 Watak batal, yang kita menulis sebagai \ 0. 170 00:10:20,710 --> 00:10:23,980 Ia teknikal nombor 0, tetapi backslash membuat semua lebih jelas 171 00:10:23,980 --> 00:10:28,150 bahawa ini adalah benar-benar nombor 0, 0 integer; 172 00:10:28,150 --> 00:10:32,440 ia tidak, bagi contoh, 0 quote-unquote bahawa anda mungkin menaip 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 mengatakan pada hari Isnin bahawa fungsi seperti GetString 175 00:10:36,350 --> 00:10:39,580 sebenarnya kembali semua ini minggu? 176 00:10:39,580 --> 00:10:43,960 Ia tidak kembali rentetan per se kerana itu tidak benar-benar mempunyai makna 177 00:10:43,960 --> 00:10:47,710 kerana rentetan tidak wujud. Mereka jenis fabrikasi di perpustakaan CS50. 178 00:10:47,710 --> 00:10:51,300 Apakah benar-benar rentetan, lebih teknikal? >> [Pelajar] Ia adalah watak pertama. 179 00:10:51,300 --> 00:10:55,950 Tepat sekali. Ia agak hanya alamat aksara pertama yang pengguna ditaip masuk 180 00:10:55,950 --> 00:11:02,810 Jadi, jika kata-kata saya HELLO berakhir sehingga ia di 123 bilangan bait dan kemudian di beberapa bait 124, 181 00:11:02,810 --> 00:11:08,320 125, 126, dan sebagainya, jika saya hanya beberapa bait saya dari 0 sehingga, 182 00:11:08,320 --> 00:11:12,650 apa yang benar-benar GetString kembali literal nombor 123. 183 00:11:12,650 --> 00:11:19,270 Jadi apa yang mendapat dimasukkan ke dalam s adalah 123 nombor, bukan huruf H, bukan perkataan HELLO, 184 00:11:19,270 --> 00:11:23,130 cukup sekadar alamat di mana saya boleh mencari huruf pertama HELLO. 185 00:11:23,130 --> 00:11:26,500 Tetapi itu tidak kelihatan seperti cukup. Saya meminta anda untuk rentetan, bukan watak. 186 00:11:26,500 --> 00:11:32,970 Jadi bagaimana kita atau komputer tahu bahawa ello jenis yang datang bersama-sama dengan H? 187 00:11:35,760 --> 00:11:37,460 Apakah jenis perjanjian kita? Yeah. 188 00:11:37,460 --> 00:11:40,100 [Pelajar] Ia terus memberitahu dirinya untuk mencari beberapa lebih aksara. >> Tepat sekali. 189 00:11:40,100 --> 00:11:44,570 >> Ada konvensyen ini manusia-komputer di mana apabila anda berurusan dengan rentetan, 190 00:11:44,570 --> 00:11:49,410 atau dikenali sekarang sebagai bintang char, anda hanya perlu memikirkan 191 00:11:49,410 --> 00:11:54,350 mana akhir rentetan setiap dalam kehidupan adalah dengan benar-benar hanya iterating atasnya dengan bagi gelung, 192 00:11:54,350 --> 00:11:57,820 gelung sementara, apa sahaja, supaya apabila anda mencari hujung tali 193 00:11:57,820 --> 00:12:02,160 kini anda boleh membuat kesimpulan daripada itu, oh, perkataan penuh HELLO. 194 00:12:02,160 --> 00:12:04,820 Orang-orang dengan pengalaman pengaturcaraan terlebih dahulu mungkin tahu di Jawa 195 00:12:04,820 --> 00:12:09,880 anda hanya boleh memanggil panjang dan dalam bahasa lain, anda boleh memanggil panjang atau serupa. 196 00:12:09,880 --> 00:12:14,060 Ini kerana dalam banyak bahasa, terutama perkara-perkara yang dipanggil bahasa berorientasi objek, 197 00:12:14,060 --> 00:12:18,580 panjang sesuatu adalah jenis dalam terkandung sekeping data itu sendiri, 198 00:12:18,580 --> 00:12:24,000 lebih suka kita terkandung ID dan nama dan rumah-rumah di dalam pelajar pada hari Isnin. 199 00:12:24,000 --> 00:12:28,700 Tetapi C adalah tahap yang lebih rendah. Tiada objek atau kelas, jika anda pernah mendengar istilah sebelum. 200 00:12:28,700 --> 00:12:31,490 Apa yang anda perlu benar-benar adalah alamat-alamat ingatan. 201 00:12:31,490 --> 00:12:35,540 Jadi ini adalah sejenis cara lama mewakili menarik struktur data. 202 00:12:35,540 --> 00:12:38,760 Anda mempunyai nilai permulaan seperti alamat watak pertama 203 00:12:38,760 --> 00:12:42,340 dan kemudian hanya beberapa konvensyen sewenang-wenangnya bahawa semua orang bersetuju untuk diikuti. 204 00:12:42,340 --> 00:12:46,420 Jadi bagaimana panjang rentetan dilaksanakan, adakah kami mencadangkan? 205 00:12:46,420 --> 00:12:51,360 Strlen, strlen, yang sesetengah daripada anda kini telah digunakan beberapa kali. Ia agak mudah, bukan? 206 00:12:51,360 --> 00:12:53,060 Ia seperti 2 baris kod. 207 00:12:53,060 --> 00:12:56,140 Ia cukup banyak gelung untuk beberapa jenis, mungkin dengan pembolehubah tempatan tambahan. 208 00:12:56,140 --> 00:13:00,540 Tetapi strlen hanya untuk mengambil penunjuk dan kemudian mula mencari \ 0. 209 00:13:00,540 --> 00:13:05,190 >> Dan sebaik sahaja ia mendapati ia, ia boleh kembali jumlah langkah-langkah yang diambil dalam rentetan itu. 210 00:13:05,190 --> 00:13:07,150 Jadi, kita boleh membuat kesimpulan daripada ini apa yang berlaku di depan. 211 00:13:07,150 --> 00:13:11,850 Katakan kemudian Saya mengaku t seperti yang saya lakukan di baris 10. 212 00:13:11,850 --> 00:13:14,280 Ini adalah beberapa nilai sampah. Siapa tahu pada mulanya? 213 00:13:14,280 --> 00:13:18,490 Tetapi di sebelah kanan garis 10 Saya memanggil GetString lagi. 214 00:13:18,490 --> 00:13:20,050 Siapa tahu di mana ini berakhir? 215 00:13:20,050 --> 00:13:23,830 Mari kita sewenang-wenangnya mengatakan bahawa sistem operasi mendapati bilik untuk cara di sini. 216 00:13:23,830 --> 00:13:28,610 Saya berlaku untuk kebetulan menaip H-E-L-L-O lagi, 217 00:13:28,610 --> 00:13:31,260 dan sebagainya kita boleh menarik jenis yang sama gambar. 218 00:13:31,260 --> 00:13:34,290 Tetapi hakikat bahawa saya telah dilakar semula gambar ini adalah sengaja 219 00:13:34,290 --> 00:13:37,720 kerana itu adalah berbeza HELLO daripada yang satu ini. 220 00:13:37,720 --> 00:13:43,920 Jadi di sini ini mungkin menjadi lokasi 456, ini adalah 457, dan sebagainya. 221 00:13:43,920 --> 00:13:47,170 Jadi apa yang mendapat dimasukkan ke mana tanda tanya sekali? 222 00:13:47,170 --> 00:13:50,190 Dalam kes ini 456. 223 00:13:50,190 --> 00:13:53,540 Kami memilih nombor-nombor sewenang-wenangnya kerana benar-benar selepas hari ini 224 00:13:53,540 --> 00:13:57,110 kita tidak akan peduli begitu banyak tentang apa yang alamat apa-apa. 225 00:13:57,110 --> 00:14:02,690 Semua yang kita mengambil berat tentang adalah bahawa kita boleh memikirkan alamat sekeping beberapa data seperti HELLO. 226 00:14:02,690 --> 00:14:07,100 >> Jadi benar-benar apa yang kebanyakan orang lakukan dalam bidang sains komputer apabila bercakap tentang alamat-alamat ingatan 227 00:14:07,100 --> 00:14:10,210 dan bercakap mengenai petunjuk khusus, 228 00:14:10,210 --> 00:14:14,220 bukannya bersusah payah memikirkan 123 - yang peduli di mana barangan ini sebenarnya adalah, 229 00:14:14,220 --> 00:14:17,440 kita hanya tahu bahawa ia adalah di alamat beberapa berangka - 230 00:14:17,440 --> 00:14:22,180 kita memudahkan dunia dan hanya mengatakan bahawa s menunjuk kepada watak yang 231 00:14:22,180 --> 00:14:25,080 dan t menunjuk kepada watak itu. 232 00:14:25,080 --> 00:14:27,430 Dan hakikat bahawa ia adalah anak panah adalah agak sengaja 233 00:14:27,430 --> 00:14:31,610 kerana harfiah kini s menunjuk di H dan t menunjuk di H lain 234 00:14:31,610 --> 00:14:34,720 kerana pada akhir hari, ia tidak kira apa alamat, 235 00:14:34,720 --> 00:14:40,240 tetapi ia tidak perkara yang kita mempunyai keupayaan untuk meluahkan alamat itu dengan sekeping beberapa kod. 236 00:14:40,240 --> 00:14:42,730 Kita tidak benar-benar dimanipulasi alamat ini sahaja lagi 237 00:14:42,730 --> 00:14:47,770 jadi kita akan melihat di mana kita boleh mencelah dan menyusun melakukan perkara-perkara dengan petunjuk, 238 00:14:47,770 --> 00:14:52,030 tetapi untuk sekarang sejajar 12 literal apakah nilai-nilai yang kita membandingkan 239 00:14:52,030 --> 00:14:55,500 mengikut cerita ini dalam 12 baris? 240 00:14:56,570 --> 00:15:01,290 Kami mengatakan adalah 123 sama sama kepada 456? Dan yang pasti tidak berlaku. 241 00:15:01,290 --> 00:15:05,320 Dan walaupun konsepnya, penunjuk ini pastinya tidak sama seperti ini 242 00:15:05,320 --> 00:15:09,500 kerana anda dipanggil GetString dua kali, dan GetString tidak cuba untuk menjadi super bijak, 243 00:15:09,500 --> 00:15:12,470 ia tidak cuba untuk sedar, oh, anda taip HELLO 5 minit yang lalu; 244 00:15:12,470 --> 00:15:15,090 biarlah saya memberikan anda penunjuk yang sama kerana saya memberikan anda sebelum, 245 00:15:15,090 --> 00:15:18,450 ia hanya memperuntukkan sebahagian memori yang baru setiap kali anda memanggilnya. 246 00:15:18,450 --> 00:15:20,350 >> Jadi bagaimana kita menyelesaikan masalah ini? 247 00:15:20,350 --> 00:15:24,270 Jika tahap yang lebih tinggi, saya mahu membandingkan tali HELLO dan HELLO - 248 00:15:24,270 --> 00:15:28,680 Saya tidak peduli tentang petunjuk - bagaimana saya boleh pergi tentang menjawab soalan, 249 00:15:28,680 --> 00:15:31,980 pengguna menaip perkara yang sama? Apa yang perlu di sini? Yeah. 250 00:15:31,980 --> 00:15:35,200 [Pelajar] Gunakan fungsi. >> Saya boleh menggunakan fungsi keluar dari kotak. 251 00:15:35,200 --> 00:15:38,170 Saya boleh menggunakan fungsi dipanggil strcmp, s-t-r-c-m p, 252 00:15:38,170 --> 00:15:41,190 hanya versi singkatan berkata rentetan bandingkan. 253 00:15:41,190 --> 00:15:45,070 Dan jika kita pergi ke, misalnya, bandingkan 2, yang merupakan antara pemberian hari ini, 254 00:15:45,070 --> 00:15:46,690 Saya lakukan betul-betul itu. 255 00:15:46,690 --> 00:15:51,750 Saya terus segala-galanya yang sama dari baris 1 ke 26 atau jadi, 256 00:15:51,750 --> 00:15:54,360 dan kini melihat bahagian ini telah berubah hanya sedikit. 257 00:15:54,360 --> 00:15:57,690 Mari kita mengabaikan garis 28 untuk seketika dan memberi tumpuan hanya pada yang satu ini. 258 00:15:57,690 --> 00:16:00,410 Apa yang kita katakan Isnin yang membandingkan str tidak? 259 00:16:00,410 --> 00:16:05,200 Ia mengendalikan proses mengambil 2 petunjuk, s dan t dalam kes ini, 260 00:16:05,200 --> 00:16:08,480 jenis hampir meletakkan jari pada mereka 2 huruf, 261 00:16:08,480 --> 00:16:11,530 dan apa yang ia perlu lakukan adalah sesuatu seperti gelung sementara atau untuk gelung, 262 00:16:11,530 --> 00:16:16,050 dan ia mengatakan ini sama? Jika ya, ia menggerakkan jari atau petunjuk ke hadapan. 263 00:16:16,050 --> 00:16:17,970 Adakah ini yang sama, sama, ini, sama 264 00:16:17,970 --> 00:16:22,710 ini sama, ini sama? Dan aduh, saya pada akhir tali di kedua-dua s dan t. 265 00:16:22,710 --> 00:16:26,780 Saya tidak menemui sebarang percanggahan. Ya, ini adalah rentetan yang sama. 266 00:16:26,780 --> 00:16:31,940 Dan apakah str membandingkan pulangan jika 2 rentetan adalah sama, nampaknya? Sifar. 267 00:16:31,940 --> 00:16:35,900 Jadi 0 adalah baik dalam kes ini kerana jika ia mengembalikan -1 atau +1, 268 00:16:35,900 --> 00:16:40,560 yang bermaksud bahawa s hanya berlaku untuk datang sebelum t abjad atau selepas t. 269 00:16:40,560 --> 00:16:43,760 Dan mengapa yang akan berguna untuk mempunyai fungsi yang memberitahu anda yang rentetan datang sebelum 270 00:16:43,760 --> 00:16:46,720 atau selepas dalam kamus? 271 00:16:46,720 --> 00:16:48,740 [Pelajar] Mencari. >> Mencari dan sorting. 272 00:16:48,740 --> 00:16:51,730 >> Jadi, anda boleh melakukan perkara-perkara seperti carian binari atau apapun gelembung atau bergabung apapun 273 00:16:51,730 --> 00:16:53,230 di mana anda perlu membandingkan perkara. 274 00:16:53,230 --> 00:16:56,420 Setakat ini kita telah jenis memotong beberapa sudut dan hanya bercakap tentang sorting 275 00:16:56,420 --> 00:16:59,430 dalam konteks nombor kerana ia adalah bagus dan mudah untuk bercakap tentang, 276 00:16:59,430 --> 00:17:02,430 tetapi anda pasti boleh membandingkan tali, epal dan pisang, 277 00:17:02,430 --> 00:17:05,349 kerana jika epal dikenali untuk datang sebelum pisang, sama, 278 00:17:05,349 --> 00:17:09,319 anda boleh bergerak rentetan sekitar dalam ingatan seperti Rob lakukan dengan apapun merge dalam video 279 00:17:09,319 --> 00:17:15,880 dan kita lakukan di sini di atas pentas dengan apapun pemilihan, jenis kemasukan, dan apapun gelembung. 280 00:17:15,880 --> 00:17:18,710 Jadi di mana lagi kita boleh mengambil ini? Mari kita cuba ini. 281 00:17:18,710 --> 00:17:23,980 Apapun mari kita lupa bahawa pelajaran untuk seketika dan cuba sekarang dan menyalin 1.c untuk melakukan perkara berikut. 282 00:17:23,980 --> 00:17:26,800 Dalam baris 21 saya mengatakan sesuatu cetak, 283 00:17:26,800 --> 00:17:28,520 maka saya mendapat rentetan daripada pengguna, 284 00:17:28,520 --> 00:17:30,690 maka saya memeriksa ini. 285 00:17:30,690 --> 00:17:33,620 Kami telah tidak benar-benar mendapat ke tabiat ini lagi, tetapi mari kita kini melakukan ini. 286 00:17:33,620 --> 00:17:40,990 Mari kita sebenarnya mengupas kembali lapisan ini. Ini adalah benar-benar char *. Lelaki ini adalah benar-benar char *. 287 00:17:40,990 --> 00:17:45,690 Jadi apakah maknanya untuk memeriksa jika s == NULL? 288 00:17:45,690 --> 00:17:48,380 Ia ternyata bahawa apabila anda memanggil fungsi seperti GetString 289 00:17:48,380 --> 00:17:51,540 atau lebih umumnya hanya meminta komputer untuk memberi anda beberapa memori, 290 00:17:51,540 --> 00:17:53,030 sesuatu yang boleh pergi salah. 291 00:17:53,030 --> 00:17:56,630 Anda boleh menjadi gila dan meminta komputer untuk terabyte memori 292 00:17:56,630 --> 00:18:01,780 dengan meminta trilion bait memori yang hanya tidak wujud dalam komputer, 293 00:18:01,780 --> 00:18:05,130 tetapi fungsi GetString dan lain-lain perlu beberapa cara menjerit pada anda 294 00:18:05,130 --> 00:18:06,820 jika anda telah diminta untuk terlalu banyak. 295 00:18:06,820 --> 00:18:10,450 Dan cara GetString melakukan ini jika anda telah diminta untuk memori yang lebih 296 00:18:10,450 --> 00:18:14,250 daripada yang terdapat dalam komputer, walaupun itulah super, kebarangkalian rendah super 297 00:18:14,250 --> 00:18:17,730 kerana tiada seorang pun daripada kami akan menaip satu trilion watak dan kemudian tekan Enter, 298 00:18:17,730 --> 00:18:21,980 tetapi kebarangkalian rendah walaupun ia mungkin, saya masih mahu untuk memeriksa ia hanya dalam kes, 299 00:18:21,980 --> 00:18:26,120 dan nilai khas yang GetString, jawapan, dan fungsi-fungsi lain pulangan 300 00:18:26,120 --> 00:18:30,630 jika sesuatu yang telah silapnya adalah NULL dalam semua topi. 301 00:18:30,630 --> 00:18:36,520 >> Dan apakah NULL? NULL hanya kebetulan untuk mewakili penunjuk. Ia adalah alamat 0 memori. 302 00:18:36,520 --> 00:18:40,800 Dunia memutuskan bahawa sewenang-wenangnya, jika ini adalah memori komputer saya - anda tahu apa? - 303 00:18:40,800 --> 00:18:46,260 kita pergi untuk mencuri hanya 1 bait memori setiap komputer, dan ini adalah lokasi 0. 304 00:18:46,260 --> 00:18:49,560 Kami akan memberikan ia nama samaran NULL, dan kita akan menjanjikan 305 00:18:49,560 --> 00:18:52,660 bahawa kita sebenarnya tidak akan meletakkan data sebenar di sana 306 00:18:52,660 --> 00:18:56,770 kerana kita hanya sewenang-wenangnya perlu nilai khas, 0, NULL aka, 307 00:18:56,770 --> 00:19:00,230 supaya kita boleh menjerit pada pengguna jika sesuatu berlaku. 308 00:19:00,230 --> 00:19:03,590 Jika tidak, anda mungkin tidak tahu tidak 0 bermakna meletakkan sesuatu di sini 309 00:19:03,590 --> 00:19:05,490 atau adakah ia bermakna sesuatu silapnya? 310 00:19:05,490 --> 00:19:09,190 Kami mempunyai semua bersetuju bahawa tiada apa-apa jua cara NULL telah dipulangkan, 311 00:19:09,190 --> 00:19:11,700 tiada alamat sebenar telah dipulangkan. 312 00:19:11,700 --> 00:19:15,210 Sekarang, di sini saya hanya mengguna pakai konvensyen manusia saya saya kembali 1 daripada utama 313 00:19:15,210 --> 00:19:17,040 jika sesuatu berlaku. 314 00:19:17,040 --> 00:19:20,650 Itu kerana konvensyen pulangan 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 Tetapi GetString dan apa-apa fungsi yang berurusan pulangan memori NULL jika sesuatu yang buruk. 317 00:19:28,200 --> 00:19:33,480 >> Okay. Jadi malangnya, line 27, super mudah walaupun ia adalah, sepenuhnya gagal untuk menyalin rentetan. 318 00:19:33,480 --> 00:19:35,740 Mengapa? Kita boleh melihat ini seperti berikut. 319 00:19:35,740 --> 00:19:40,120 Saya menuntut dalam 27 baris untuk membuat salinan s dan memanggil ia t. 320 00:19:40,120 --> 00:19:45,790 Jadi, saya tidak meminta pengguna untuk 2 rentetan masa ini, saya hanya mengatakan nilai dalam s 321 00:19:45,790 --> 00:19:47,870 harus diletakkan di t juga. 322 00:19:47,870 --> 00:19:52,890 Jadi sekarang hanya untuk menunjukkan betapa patah ini, sejajar 29 seterusnya apa yang saya lakukan? 323 00:19:52,890 --> 00:19:56,980 Pertama saya memeriksa jika panjang t adalah lebih besar daripada 0. 324 00:19:56,980 --> 00:19:59,330 Terdapat beberapa rentetan sana. Pengguna menaip sesuatu masuk 325 00:19:59,330 --> 00:20:03,410 Apakah garis 32 lakukan, nampaknya? 326 00:20:03,410 --> 00:20:08,910 [Pelajar tindak balas didengar] >> Hak. Anda jenis boleh membuat kesimpulan dari apa yang saya katakan ia melakukan. 327 00:20:08,910 --> 00:20:13,200 Tetapi dari segi teknikal, apa ini lakukan? t [0] mewakili apa? 328 00:20:13,200 --> 00:20:15,140 [Pelajar] Watak 0. >> [Malan] Watak 0. 329 00:20:15,140 --> 00:20:19,620 Atau, lebih seperti manusia, watak pertama dalam t, apa sahaja yang, H mungkin dalam kes ini. 330 00:20:19,620 --> 00:20:24,990 Dan toupper melakukan apa yang ia berkata. Ia capitalizes watak 0 t dan ia mengubah ia. 331 00:20:24,990 --> 00:20:28,430 Jadi ini bermakna mengambil watak 0 t, membuat ia huruf besar, 332 00:20:28,430 --> 00:20:30,320 dan meletakkannya kembali di lokasi yang sama. 333 00:20:30,320 --> 00:20:35,540 Jadi jika saya menaip hello dalam huruf kecil, ini perlu mengubah h huruf kecil untuk H. modal 334 00:20:35,540 --> 00:20:41,400 Tetapi masalahnya ialah bahawa dalam baris 35 dan 36 apa yang saya kira-kira untuk melakukan adalah mencetak untuk kita s dan t. 335 00:20:41,400 --> 00:20:43,120 Dan apa yang firasat anda? 336 00:20:43,120 --> 00:20:47,250 Apa yang saya benar-benar akan melihat jika saya taip dalam hello dalam huruf kecil semua? 337 00:20:47,250 --> 00:20:52,280 Apa yang berlaku untuk mendapatkan dicetak? >> [Sambutan pelajar didengar] >> Apa itu? 338 00:20:52,280 --> 00:20:58,360 [Pelajar] Big H dan selebihnya kecil. >> H besar dan selebihnya kecil yang, s atau t? 339 00:20:58,360 --> 00:21:03,170 [Pelajar] Kedua-dua. >> Kedua-dua. Tepat sekali. Jadi mari kita lihat apa yang berlaku di sini. 340 00:21:03,170 --> 00:21:08,380 >> Biar saya pergi ke hadapan dan menyusun ini. Ini adalah copy1, jadi membuat copy1. Semua hak. 341 00:21:08,380 --> 00:21:14,840 Zum masuk Biar saya pergi ke hadapan dan menjalankan copy1, Masukkan, Katakanlah (wahai Muhammad) sesuatu: hello dalam huruf kecil. 342 00:21:14,840 --> 00:21:19,570 Ia dipermodalkan salinan, tetapi ia nampaknya dipermodalkan asal serta, 343 00:21:19,570 --> 00:21:22,070 kerana apa yang kini berlaku dalam cerita ini? 344 00:21:22,070 --> 00:21:27,030 Dalam baris 27 saya tidak benar-benar seolah-olah menyalin rentetan, 345 00:21:27,030 --> 00:21:30,450 tetapi walaupun anda mungkin telah intuitif berharap bahawa kes itu, 346 00:21:30,450 --> 00:21:33,680 jika anda berfikir tentang gambar ini, apa yang benar-benar telah saya lakukan? 347 00:21:33,680 --> 00:21:35,410 Separuh daripada gambar adalah sama. 348 00:21:35,410 --> 00:21:39,390 Jadi mari kita melancarkan kembali ke masa supaya t tidak lagi wujud dalam cerita. 349 00:21:39,390 --> 00:21:43,160 S boleh wujud dalam cerita, tetapi mari huruf kecil hello masa ini. 350 00:21:43,160 --> 00:21:46,710 Jadi biarlah saya menetapkan apa yang saya sebenarnya ditaip masuk 351 00:21:46,710 --> 00:21:51,280 Dalam kes ini di sini kita mempunyai h-e-l-l-o. 352 00:21:51,280 --> 00:21:58,050 Kami akan menarik sebagai urutan aksara, meletakkan garis pemisah saya di sini dan 0 \ saya. 353 00:21:58,050 --> 00:22:05,980 Jadi ini adalah di mana kita berada secepat baris 1 melalui 24-ish, memberikan atau mengambil, telah dilaksanakan. 354 00:22:05,980 --> 00:22:07,800 Ini adalah gambar ingatan saya. 355 00:22:07,800 --> 00:22:10,800 Apabila saya mendapat kepada 27 baris, apa yang berlaku? 356 00:22:10,800 --> 00:22:14,730 Sama seperti sebelum ini, saya mendapat penunjuk, yang saya akan menarik sebagai dataran ini. 357 00:22:14,730 --> 00:22:19,740 Ia dipanggil t. Dan apa nilai secara lalai? Siapa 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 secepat sebelah kanan sebanyak 27 baris melaksanakan, apa yang saya meletakkan di dalam t? 360 00:22:27,670 --> 00:22:30,770 Perkara yang sama yang dalam s. 361 00:22:30,770 --> 00:22:34,120 Jadi jika kita untuk seketika mengeluarkan abstraksi ini anak panah dan kita katakan, 362 00:22:34,120 --> 00:22:40,330 oh, ini adalah alamat ingatan beban 123, apabila anda mengatakan t mendapat s, koma bertitik, 363 00:22:40,330 --> 00:22:42,700 anda benar-benar meletakkan 123 di sini. 364 00:22:42,700 --> 00:22:45,200 Sekarang jika kita jenis memudahkan dunia kita sekali lagi dengan gambar, 365 00:22:45,200 --> 00:22:48,750 apa yang anda telah benar-benar dilakukan hanya menambah anak panah lain untuk dunia anda 366 00:22:48,750 --> 00:22:52,910 itu menunjuk dari t kepada rentetan yang tepat sama. 367 00:22:52,910 --> 00:22:59,730 Jadi, apabila di baris 31 dan 32 saya sebenarnya pergi tentang menukar t [0], 368 00:22:59,730 --> 00:23:05,580 apa t [0] nampaknya sinonim dengan sekarang? [0] 369 00:23:05,580 --> 00:23:07,030 Jadi itulah segala yang berlaku. 370 00:23:07,030 --> 00:23:09,900 Dan walaupun jenis ini merasakan sedikit tahap rendah dan batin 371 00:23:09,900 --> 00:23:12,760 dan ini jenis berasa seperti mungkin intuitif ini sepatutnya hanya bekerja - 372 00:23:12,760 --> 00:23:15,410 Saya telah membuat salinan perkara sebelum dan ia hanya bekerja - 373 00:23:15,410 --> 00:23:18,590 jika anda benar-benar berfikir tentang apa yang benar-benar adalah rentetan, ia adalah * char. 374 00:23:18,590 --> 00:23:21,700 Nah, apakah itu? Ia alamat beberapa watak. 375 00:23:21,700 --> 00:23:24,930 Maka mungkin ia lebih masuk akal bahawa apabila anda cuba untuk melakukan sesuatu 376 00:23:24,930 --> 00:23:29,220 super seolah-olah mudah seperti ini, semua yang anda lakukan adalah menyalin alamat memori. 377 00:23:29,220 --> 00:23:32,530 Anda sebenarnya tidak melakukan apa-apa dengan tali sendiri. 378 00:23:32,530 --> 00:23:37,500 Jadi, walaupun anda tidak mempunyai idea bagaimana anda akan menyelesaikan masalah ini dalam kod, 379 00:23:37,500 --> 00:23:45,080 tahap yang tinggi, konsep, apa yang kita perlu lakukan untuk membuat ta salinan benar s, nampaknya? 380 00:23:46,670 --> 00:23:48,820 Yeah. >> [Pelajar] Berikan lokasi baru? >> Tepat sekali. 381 00:23:48,820 --> 00:23:50,800 >> Kita perlu memberi t lokasi baru. 382 00:23:50,800 --> 00:23:55,230 Kita perlu entah bagaimana mewujudkan sebuah dunia di mana kita akan mendapat sebahagian memori yang baru, 383 00:23:55,230 --> 00:24:00,090 yang hanya untuk demi kejelasan itu saya akan menarik hak di bawah satu ini, tetapi ia tidak perlu berada di sana. 384 00:24:00,090 --> 00:24:04,880 Tetapi ia perlu menjadi saiz yang sama, jadi saya akan melukis garisan menegak di tempat yang sama. 385 00:24:04,880 --> 00:24:09,720 Ia adalah baik jika ini adalah semua sampah pada mulanya. Siapa tahu apa yang berada di sana? 386 00:24:09,720 --> 00:24:13,850 Tetapi langkah 1 akan mempunyai akan memberi saya sebagai memori banyak seperti yang saya perlukan 387 00:24:13,850 --> 00:24:18,630 patut salinan hello, kemudian memikirkan bagaimana untuk menyalin h di sini, e di sini, 388 00:24:18,630 --> 00:24:20,390 l di sini dan sebagainya. 389 00:24:20,390 --> 00:24:24,880 Tetapi ini seharusnya berasa sedikit jelas walaupun beberapa butiran masih abstrak. 390 00:24:24,880 --> 00:24:28,690 Untuk menyalin rentetan ini ke dalam ini, ia hanya untuk gelung atau gelung sementara 391 00:24:28,690 --> 00:24:31,580 atau sesuatu yang anda telah menjadi semua lebih akrab. 392 00:24:31,580 --> 00:24:35,970 Jadi mari kita cuba ini. Mari saya pergi ke copy2.c. 393 00:24:35,970 --> 00:24:43,270 Di copy2.c kita mempunyai hampir program yang sama kecuali selama 27 baris. 394 00:24:43,270 --> 00:24:47,260 Ia kelihatan agak kompleks, tetapi jika kita asingkan sekeping oleh sekeping, 395 00:24:47,260 --> 00:24:48,950 sebelah kiri adalah sama. 396 00:24:48,950 --> 00:24:52,790 Char * t mencipta perkara ini dalam ingatan, walaupun dengan tanda tanya 397 00:24:52,790 --> 00:24:54,680 kerana kita tidak mempunyai idea apa yang ada secara lalai. 398 00:24:54,680 --> 00:24:57,920 Pada sebelah kanan kita sedang memperkenalkan fungsi baru, malloc, 399 00:24:57,920 --> 00:25:00,640 untuk ingatan memperuntukkan, memberi saya ingatan, 400 00:25:00,640 --> 00:25:06,900 dan ia nampaknya mengambil berapa banyak hujah, berapa banyak perkara di dalam kurungan? 401 00:25:09,660 --> 00:25:12,130 Saya mendengar sungutmu 1 dan 2, tetapi ia adalah hanya 1. 402 00:25:12,130 --> 00:25:15,320 Tiada koma, yang bermakna terdapat hanya 1 perkara di dalam kurungan. 403 00:25:15,320 --> 00:25:17,720 Walaupun terdapat kurungan lain, izinkan saya menyerlahkan 404 00:25:17,720 --> 00:25:21,460 apa yang di dalam kurungan terluar, dan ia adalah 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 berfikir ini melalui, ini mengatakan memberikan saya panjang s. 407 00:25:29,190 --> 00:25:34,440 Mengapa saya, walaupun, sambil menambah 1 ke panjang? >> [Sambutan pelajar didengar] 408 00:25:34,440 --> 00:25:40,200 Tepat sekali. Kami perlukan ruang untuk lelaki ini pada ekor, watak keenam yang tidak mempunyai makna Inggeris 409 00:25:40,200 --> 00:25:42,250 tetapi tidak mempunyai makna perancangan khas. 410 00:25:42,250 --> 00:25:46,800 >> Jadi kita memerlukan + 1 untuk itu kerana strlen pulangan jangkaan manusia panjang, 411 00:25:46,800 --> 00:25:50,890 hello atau 5, ia tidak memberi anda watak null tambahan. 412 00:25:50,890 --> 00:25:52,980 Jadi saya manual menambah ini dengan + 1. 413 00:25:52,980 --> 00:25:56,060 Dan kemudian ini, saiz * (char), kita tidak dilihat sebelum ini. 414 00:25:56,060 --> 00:25:57,480 Ini bukan teknikal fungsi. 415 00:25:57,480 --> 00:26:04,150 Ia adalah kata kunci khas yang hanya memberitahu anda apa saiz beberapa jenis data pada komputer 416 00:26:04,150 --> 00:26:06,980 kerana pada hakikatnya, sebahagian daripada kita mempunyai komputer 32-bit. 417 00:26:06,980 --> 00:26:10,900 Saya mempunyai sebuah komputer yang agak lama di rumah, dan ia hanya menggunakan 32 bit untuk mewakili petunjuk. 418 00:26:10,900 --> 00:26:13,900 Dan sebagainya jika saya lakukan saiz jenis data, ia mungkin menjadi 32 bit. 419 00:26:13,900 --> 00:26:18,300 Tetapi jika saya menggunakan komputer baru saya mewah, saya mungkin akan mendapat 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 kes ini, hanya untuk selamat super, kami tidak pergi kepada sesuatu kod keras seperti - 422 00:26:25,400 --> 00:26:28,740 baik, apa yang saiz char mengikut kepada apa yang kita telah berkata setakat ini? 423 00:26:28,740 --> 00:26:34,450 Kami telah cukup banyak berkata secara lisan bahawa ia adalah 1 bait, dan itulah cukup banyak benar di seluruh papan. 424 00:26:34,450 --> 00:26:37,000 Tetapi sekali lagi, andaian cenderung menjadi buruk. 425 00:26:37,000 --> 00:26:40,850 Mereka membawa kepada perisian kereta jika orang menggunakan perisian anda dengan cara yang anda tidak berniat. 426 00:26:40,850 --> 00:26:44,750 Jadi abstrak mari ini jauh dan hanya lebih generik mengatakan 427 00:26:44,750 --> 00:26:46,830 Saya perlukan ini ketulan banyak memori 428 00:26:46,830 --> 00:26:50,210 dan setiap sebahagian memori harus bersamaan dengan saiz watak, 429 00:26:50,210 --> 00:26:54,870 yang sebenarnya bersamaan 1 dalam kes ini, tetapi ia adalah cara yang lebih generik menulisnya. 430 00:26:54,870 --> 00:27:00,460 Jadi, jika perkataan hello, berapa banyak bait tidak malloc nampaknya memperuntukkan bagi hello? 431 00:27:00,460 --> 00:27:04,980 [Pelajar] Enam. >> Enam. Tepat seperti yang banyak seperti yang kita mempunyai tanda soal pada skrin. 432 00:27:04,980 --> 00:27:07,800 Dan kemudian mengambil guess kini berdasarkan pemahaman anda GetString 433 00:27:07,800 --> 00:27:12,790 apakah malloc mungkin kembali? >> [Pelajar] address. 434 00:27:12,790 --> 00:27:17,020 Satu alamat apa? Daripada sebahagian pertama memori. 435 00:27:17,020 --> 00:27:20,670 >> Kami tidak mempunyai idea apa yang ada kerana beberapa fungsi lain 436 00:27:20,670 --> 00:27:23,010 mungkin telah menggunakan memori ini sebelumnya. 437 00:27:23,010 --> 00:27:28,380 Tetapi malloc, seperti GetString, mengembalikan alamat bait pertama memori 438 00:27:28,380 --> 00:27:30,540 bahawa ia telah diketepikan untuk anda. 439 00:27:30,540 --> 00:27:38,380 Walau bagaimanapun, apa yang ia tidak berbuat mengisi ruang kosong ini dengan watak null backslash 440 00:27:38,380 --> 00:27:43,030 kerana ia ternyata anda boleh menggunakan malloc untuk memperuntukkan apa-apa: ints, rentetan, tatasusunan, 441 00:27:43,030 --> 00:27:45,700 terapung, struktur pelajar. 442 00:27:45,700 --> 00:27:47,750 Anda boleh menggunakan malloc sepenuhnya generik. 443 00:27:47,750 --> 00:27:51,470 Ia tidak peduli atau perlu tahu apa yang anda memperuntukkan memori untuk. 444 00:27:51,470 --> 00:27:55,810 Jadi ia akan menjadi angkuh untuk malloc meletakkan 0 \ 445 00:27:55,810 --> 00:27:58,340 pada akhir Sebahagian setiap memori ia memberi anda 446 00:27:58,340 --> 00:28:02,620 kerana ini \ 0 perkara hanya satu konvensyen untuk rentetan. 447 00:28:02,620 --> 00:28:06,310 Ia tidak digunakan untuk ints, ia tidak digunakan untuk terapung, ia tidak digunakan untuk pelajar. 448 00:28:06,310 --> 00:28:11,730 Dan sebagainya gotcha dengan malloc adalah bahawa beban sepenuhnya kepada anda pengaturcara 449 00:28:11,730 --> 00:28:16,790 ingat berapa banyak bait anda diperuntukkan dan tidak pernah menggunakan untuk gelung 450 00:28:16,790 --> 00:28:21,570 atau gelung sementara dan pergi lepas sempadan sebahagian memori anda telah diberikan. 451 00:28:21,570 --> 00:28:23,540 Letakkan satu lagi cara, secepat anda memperuntukkan memori, 452 00:28:23,540 --> 00:28:28,510 anda tidak boleh meminta sistem operasi, oh, dengan cara itu, bagaimana besar sebahagian memori ini? 453 00:28:28,510 --> 00:28:32,080 Ia terpulang kepada anda untuk ingat jika anda perlu nilai itu. 454 00:28:32,080 --> 00:28:34,330 >> Jadi mari kita lihat bagaimana saya meneruskan untuk menggunakan memori ini. 455 00:28:34,330 --> 00:28:38,430 Dalam baris 28 dan 29 mengapa saya melakukan ini? 456 00:28:39,850 --> 00:28:42,260 Hanya jumlah cek kewarasan. 457 00:28:42,260 --> 00:28:45,110 Hanya dalam kes sesuatu silapnya, saya meminta beberapa jumlah gila memori 458 00:28:45,110 --> 00:28:48,690 atau saya telah banyak perkara yang berjalan pada komputer yang hanya ada memori tidak mencukupi, 459 00:28:48,690 --> 00:28:51,780 sesuatu seperti itu, saya sekurang-kurangnya mahu untuk memeriksa for null. 460 00:28:51,780 --> 00:28:55,260 Pada hakikatnya, kebanyakan komputer akan memberi anda ilusi bahawa setiap program 461 00:28:55,260 --> 00:28:57,080 boleh menggunakan keseluruhan RAM anda, 462 00:28:57,080 --> 00:29:00,740 tetapi walaupun begitu, jika jenis pengguna dalam rentetan beberapa lama gila mungkin kerana mereka seorang lelaki yang buruk 463 00:29:00,740 --> 00:29:03,440 dan mereka sebenarnya cuba untuk crash program anda atau hack ke dalamnya, 464 00:29:03,440 --> 00:29:07,300 anda mahu sekurang-kurangnya menyemak nilai pulangan malloc dan sama ada ia sama batal. 465 00:29:07,300 --> 00:29:11,630 Dan jika ia tidak, mari kita hanya berhenti sekarang kerana saya tidak tahu apa yang perlu dilakukan dalam kes itu. 466 00:29:11,630 --> 00:29:13,950 Bagaimana saya menyalin rentetan? Terdapat beberapa cara untuk melakukan ini. 467 00:29:13,950 --> 00:29:18,850 Terdapat str menyalin fungsi dalam C, tetapi ia adalah sangat mudah bagi kita untuk melakukan ini cara lama. 468 00:29:18,850 --> 00:29:23,110 >> Pertama izinkan saya memikirkan apa yang panjang s. 469 00:29:23,110 --> 00:29:26,930 Saya boleh meletakkan ini di dalam gelung tetapi sebaliknya saya hanya meletakkan ia keluar di sini untuk kejelasan. 470 00:29:26,930 --> 00:29:30,610 Jadi n kini menyimpan panjang rentetan asal, yang nampaknya 5. 471 00:29:30,610 --> 00:29:35,290 Kemudian dalam gelung untuk saya saya iterating dari 0 sehingga n, 472 00:29:35,290 --> 00:29:40,940 dan pada setiap lelaran Saya meletakkan [i] dalam t [i]. 473 00:29:40,940 --> 00:29:45,060 Jadi itulah apa yang saya tersirat dengan jari 2 saya menunjuk pada tali sebelum. 474 00:29:45,060 --> 00:29:49,260 Seperti ini untuk gelung lelaran seperti ini, saya akan menyalin h ke sini, 475 00:29:49,260 --> 00:29:52,890 e ke sini, l sini kerana ini adalah s, ini adalah t. 476 00:29:52,890 --> 00:29:58,770 Dan kemudian akhir sekali, dalam 35 baris mengapa saya melakukan ini? 477 00:29:58,770 --> 00:30:03,770 Saya perlu memastikan bahawa saya menamatkan rentetan t. 478 00:30:03,770 --> 00:30:06,170 Dan saya melakukannya dengan cara ini untuk menjadi super jelas. 479 00:30:06,170 --> 00:30:09,510 Tetapi mencadangkan, seseorang, jika anda boleh, cara yang berbeza untuk melakukan ini. 480 00:30:09,510 --> 00:30:13,930 Saya tidak benar-benar memerlukan satu line 35. Ada satu lagi cara untuk melakukan ini. 481 00:30:13,930 --> 00:30:18,880 Yeah. >> [Sambutan pelajar didengar] >> Katakanlah ia kuat. 482 00:30:18,880 --> 00:30:20,960 [Pelajar] Kurang daripada atau sama dengan. >> Tepat sekali. 483 00:30:20,960 --> 00:30:24,450 Kami hanya boleh berkata kurang daripada atau sama dengan n, yang secara umum telah buruk 484 00:30:24,450 --> 00:30:28,190 kerana hampir selalu apabila kita pergi kepada yang bersamaan dengan perkara yang kita sedang mengira 485 00:30:28,190 --> 00:30:30,000 kita pergi langkah 1 terlalu jauh. 486 00:30:30,000 --> 00:30:32,170 Tetapi ingat, berapa banyak bait adakah kita memperuntukkan? 487 00:30:32,170 --> 00:30:37,210 Kami memperuntukkan strlen s, jadi 5 + 1 untuk total 6. 488 00:30:37,210 --> 00:30:39,980 Jadi dalam kes ini, kita boleh melakukan sesuatu seperti ini 489 00:30:39,980 --> 00:30:46,450 supaya kita menyalin bukan hanya hello tetapi juga 0 \ pada akhir sangat. 490 00:30:46,450 --> 00:30:49,860 Selain itu, kita boleh menggunakan fungsi yang dipanggil salinan str, strcpy, 491 00:30:49,860 --> 00:30:51,700 tetapi itu tidak akan menjadi hampir yang banyak keseronokan. 492 00:30:51,700 --> 00:30:54,000 Tetapi itu semua ia tidak di bawah hood. 493 00:30:54,000 --> 00:30:56,050 Kemudian akhir sekali, kita melakukan perkara yang sama seperti sebelum ini. 494 00:30:56,050 --> 00:31:01,620 Saya mengambil kesempatan t dan kemudian saya mendakwa bahawa asal kelihatan seperti ini dan salinan kelihatan seperti itu. 495 00:31:01,620 --> 00:31:08,570 Jadi mari kita cuba ini sekarang. Biar saya pergi di sini. Buat copy2. Kami akan mengezum masuk dan menjalankan copy2. 496 00:31:08,570 --> 00:31:13,840 Saya akan menaip hello dalam huruf kecil, dan sememangnya saya mendapatkan huruf kecil hello seperti yang asal 497 00:31:13,840 --> 00:31:16,930 tetapi modal Hello untuk salinan. 498 00:31:16,930 --> 00:31:20,300 Tetapi saya tidak dilakukan hanya lagi. Saya perlu lakukan 1 perkara terakhir di sini. 499 00:31:20,300 --> 00:31:28,000 46 dan 47 jelas membebaskan memori, tetapi apakah yang sebenarnya bermakna? 500 00:31:28,000 --> 00:31:33,250 Apa yang saya lakukan, adakah anda fikir, dengan memanggil line 46 dan line 47? 501 00:31:33,250 --> 00:31:38,900 Apakah kesan yang ada? Yeah. 502 00:31:38,900 --> 00:31:43,140 [Sambutan pelajar didengar] >> Tepat sekali. 503 00:31:43,140 --> 00:31:46,380 >> Anda hanya memberitahu sistem operasi, hey, terima kasih atas ingatan ini. 504 00:31:46,380 --> 00:31:48,320 Anda kini boleh menggunakan ia untuk orang lain. 505 00:31:48,320 --> 00:31:50,790 Dan di sini adalah satu contoh yang sempurna nilai sampah. 506 00:31:50,790 --> 00:31:55,430 Saya telah hanya digunakan memori ini untuk menulis perkataan hello dalam 2 tempat, 507 00:31:55,430 --> 00:31:57,490 sini, sini, 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 Tetapi kemudian saya panggil line 46 dan line 47, dan anda tahu apa yang berlaku di sana dari segi gambar? 510 00:32:06,960 --> 00:32:10,010 Sebenarnya, tunggu, gambar ini adalah yang lama. 511 00:32:10,010 --> 00:32:12,550 Apabila kita membuat salinan, lelaki ini sebenarnya menunjuk sini, 512 00:32:12,550 --> 00:32:16,110 jadi mari kita membuang nombor dan hanya abstrak jauh sebagai anak panah kami lagi. 513 00:32:16,110 --> 00:32:19,370 Apa yang berlaku dalam gambar ini apabila saya panggil bebas? 514 00:32:19,370 --> 00:32:22,750 [Pelajar tindak balas didengar] >> Tidak juga. 515 00:32:22,750 --> 00:32:29,510 Jika saya panggil percuma di s dan t - jenis soalan helah - gambar ini tidak berubah pada semua 516 00:32:29,510 --> 00:32:33,880 kerana memanggil s dan memanggil t hanya memberitahu sistem operasi, 517 00:32:33,880 --> 00:32:39,010 hey, anda boleh menggunakan memori ini lagi, tetapi ia tidak mengubah ini untuk menyeimbangkan 518 00:32:39,010 --> 00:32:41,840 atau beberapa aksara khas, ia tidak menukar ini, 519 00:32:41,840 --> 00:32:47,350 ia tidak mengubah h atau e atau l atau l atau o di tempat sama ada apa-apa lagi. 520 00:32:47,350 --> 00:32:51,610 Dari segi gambar, secepat anda memanggil percuma, tiada perubahan. 521 00:32:51,610 --> 00:32:56,570 Dan di dalamnya terletak asal nilai sampah kerana jika saya kemudian dalam program ini 522 00:32:56,570 --> 00:33:01,010 minta sistem operasi untuk ingatan lebih dengan malloc GetString atau atau sesuatu seperti yang 523 00:33:01,010 --> 00:33:04,900 dan sistem operasi mengatakan, pasti, saya mempunyai 12 bait memori hanya dibebaskan, 524 00:33:04,900 --> 00:33:08,080 menggunakan, apa yang anda akan perlu diserahkan? 525 00:33:08,080 --> 00:33:10,830 Anda akan menyerahkan sebahagian memori yang kita biasanya akan menarik 526 00:33:10,830 --> 00:33:13,700 dengan tanda soalan, tetapi apa yang mereka tanda tanya? 527 00:33:13,700 --> 00:33:17,000 Mereka berada h-e-l-l-o, h-e-l-l-o. 528 00:33:17,000 --> 00:33:20,940 Ini adalah nilai sampah baru kami dengan seberapa segera seperti yang anda membebaskan memori yang. 529 00:33:20,940 --> 00:33:22,750 >> Terdapat implikasi dunia sebenar di sini juga. 530 00:33:22,750 --> 00:33:24,720 Ini berlaku untuk melakukan dengan RAM, tetapi komputer anda 531 00:33:24,720 --> 00:33:26,720 sebenarnya melakukan perkara yang sama dengan cakera. 532 00:33:26,720 --> 00:33:30,620 Kami akan bercakap tentang perkara ini khususnya dengan set masalah masa depan yang memberi tumpuan kepada forensik. 533 00:33:30,620 --> 00:33:36,170 Tetapi apa sebenarnya yang berlaku jika anda mempunyai beberapa fail kewangan sensitif pada desktop anda 534 00:33:36,170 --> 00:33:39,600 atau beberapa JPEG lengkap dan anda mengheret ke dalam tong sampah anda, 535 00:33:39,600 --> 00:33:44,390 apa yang berlaku apabila anda mengheret ke dalam tong sampah atau tong kitar semula? 536 00:33:44,390 --> 00:33:47,240 Anda tahu apa yang saya bercakap tentang. [Ketawa] 537 00:33:47,240 --> 00:33:52,370 Apa yang berlaku apabila anda telah mengheret bukti bahawa ke dalam tong kitar semula anda atau sampah boleh? 538 00:33:52,370 --> 00:33:55,920 [Sambutan pelajar didengar] 539 00:33:55,920 --> 00:33:58,000 Nah, jadi berhati-hati. Apa yang berlaku apabila anda berbuat demikian? 540 00:33:58,000 --> 00:34:01,030 Jawapan ringkasnya adalah apa-apa, kan? 541 00:34:01,030 --> 00:34:04,790 Fail lengkap atau sensitif masih hanya duduk di sana tempat dalam cakera keras anda. 542 00:34:04,790 --> 00:34:07,940 Kebanyakan kita sekurang-kurangnya telah belajar cara keras bahawa anda perlu untuk mengosongkan sampah anda 543 00:34:07,940 --> 00:34:10,429 atau tong kitar semula anda untuk benar-benar memadam fail. 544 00:34:10,429 --> 00:34:13,440 Dan sesungguhnya, apabila anda klik kanan atau Kawalan klik pada sampah anda boleh 545 00:34:13,440 --> 00:34:15,580 atau memilih File, Sampah kosong atau apa sahaja 546 00:34:15,580 --> 00:34:21,420 dan anda sebenarnya mengosongkan sampah boleh atau tong kitar semula, apa sebenarnya yang berlaku kemudian kepada gambar ini? 547 00:34:22,810 --> 00:34:25,969 Tidak lebih. Jadi apa-apa yang sebenarnya berlaku pada cakera. 548 00:34:25,969 --> 00:34:30,880 >> Dan jika kita hanya sementara menyimpang dan menulis - I'll hanya menggunakan belakang ini. 549 00:34:30,880 --> 00:34:34,639 Jadi sekarang cerita berubah dari RAM, yang mana program wujud 550 00:34:34,639 --> 00:34:39,250 semasa anda menjalankan mereka, cakera, yang mana mereka disimpan jangka panjang 551 00:34:39,250 --> 00:34:42,920 walaupun apabila kuasa akan keluar, buat masa sekarang - dan kita akan kembali kepada ini pada masa depan - 552 00:34:42,920 --> 00:34:46,380 mari kita hanya berpura-pura bahawa ini mewakili dalam cakera keras komputer anda 553 00:34:46,380 --> 00:34:50,110 kerana kembali pada hari mereka digunakan untuk menjadi cakera bulat, sama seperti cakera liut. 554 00:34:50,110 --> 00:34:55,130 Jadi, jika anda mempunyai beberapa fail Excel sensitif, ia mungkin mengambil masa sehingga ini sebahagian memori 555 00:34:55,130 --> 00:34:59,770 pada cakera komputer anda, dan saya hanya melukis 1s dan 0-an sama sewenang-wenangnya. 556 00:34:59,770 --> 00:35:03,970 Apabila anda menyeret fail seperti itu ke tong sampah anda atau boleh kitar semula bin, 557 00:35:03,970 --> 00:35:07,750 benar-benar tiada apa yang berlaku kerana Apple dan Microsoft telah memutuskan 558 00:35:07,750 --> 00:35:10,450 sampah boleh dan tong kitar semula adalah benar-benar hanya placeholder sementara. 559 00:35:10,450 --> 00:35:14,710 Mungkin akhirnya OS akan mengosongkannya untuk anda, tetapi biasanya, ia tidak berbuat apa-apa, 560 00:35:14,710 --> 00:35:17,090 sekurang-kurangnya sehingga anda benar-benar rendah pada ruang. 561 00:35:17,090 --> 00:35:20,870 >> Walau bagaimanapun, apabila anda pergi ke sampah kosong atau kosong recycle bin, 562 00:35:20,870 --> 00:35:23,460 sama, tiada apa yang berlaku kepada gambar ini. 563 00:35:23,460 --> 00:35:28,590 Semua yang berlaku adalah di tempat lain di komputer anda, terdapat beberapa jenis jadual. 564 00:35:28,590 --> 00:35:35,400 Ia adalah jenis seperti lembaran menipu sedikit yang mengatakan bahawa, katakan, resume.doc, 565 00:35:35,400 --> 00:35:40,920 supaya resume anda dalam fail Microsoft Word yang digunakan untuk hidup di 123 lokasi pada cakera keras anda, 566 00:35:40,920 --> 00:35:43,710 bukan dalam ingatan dan tidak dalam RAM tetapi pada cakera keras anda, 567 00:35:43,710 --> 00:35:49,050 dan kehidupan JPEG lengkap anda pada 456, dan fail Excel anda tinggal di 789 atau mana-mana jua. 568 00:35:49,050 --> 00:35:53,640 Apabila anda padam fail dengan sebenarnya mengosongkan sampah atau tong kitar semula, 569 00:35:53,640 --> 00:35:59,530 gambar ini tidak berubah. 0 dan 1s pada cakera keras anda tidak pergi ke mana-mana. 570 00:35:59,530 --> 00:36:03,930 Tetapi jadual ini, pangkalan data ini sedikit pelbagai, adakah perubahan. 571 00:36:03,930 --> 00:36:08,750 Apabila anda memadam resume anda, ia seolah-olah fail dipadam dalam erti kata lain, 572 00:36:08,750 --> 00:36:12,790 tetapi semua komputer tidak lupa di mana perkara yang tinggal pada pemacu keras anda. 573 00:36:12,790 --> 00:36:17,870 0 dan 1s yang mengarang resume anda atau mana-mana fail-fail lain masih utuh. 574 00:36:17,870 --> 00:36:21,960 >> Jadi, jika anda melakukan ini sengaja, masih ada kebarangkalian bukan sifar 575 00:36:21,960 --> 00:36:25,800 bahawa anda boleh memulihkan data anda menggunakan Norton Utilities atau beberapa perisian komersial 576 00:36:25,800 --> 00:36:29,810 maksud yang dalam kehidupan adalah untuk mencari 0s dan 1s yang telah jenis telah yatim, 577 00:36:29,810 --> 00:36:33,300 lupa di sini tetapi meninggalkan di sini, supaya anda boleh mendapatkan kembali data anda. 578 00:36:33,300 --> 00:36:38,410 Atau penyiasat forensik dengan polis atau FBI sebenarnya akan mengambil cakera keras 579 00:36:38,410 --> 00:36:42,550 dan sebenarnya mencari corak 0 dan 1s yang kelihatan seperti JPEG, kelihatan seperti fail Excel, 580 00:36:42,550 --> 00:36:46,400 dan memulihkan mereka bahawa cara walaupun komputer telah lupa mereka di sana. 581 00:36:46,400 --> 00:36:49,820 Jadi satu-satunya cara untuk benar-benar memadam data, seperti yang kita akan membincangkan di masa hadapan, 582 00:36:49,820 --> 00:36:54,190 adalah untuk gosok atau mengelap fail atau cakera keras oleh - 583 00:36:54,190 --> 00:36:56,540 Anda tidak boleh benar-benar menghilangkan 0s dan 1s 584 00:36:56,540 --> 00:36:59,440 kerana jika tidak, anda akan bermula dengan pemacu keras gigabit 585 00:36:59,440 --> 00:37:02,380 dan anda akan berakhir dengan cakera keras megabait jika anda sentiasa telah memotong, 586 00:37:02,380 --> 00:37:04,380 secara literal, 0 dan 1s. 587 00:37:04,380 --> 00:37:06,310 Jadi apa yang akan anda lakukan jika anda benar-benar mahu untuk menutup trek anda 588 00:37:06,310 --> 00:37:10,510 dan masalah asas adalah bahawa masih ada 0s dan 1s pada cakera? 589 00:37:10,510 --> 00:37:14,930 Saya melihat seseorang gesticulating bahawa anda secara fizikal akan memecahkan peranti. Yang akan bekerja. 590 00:37:14,930 --> 00:37:19,600 [Ketawa] Tetapi jika itulah jenis penyelesaian yang mahal, apa yang akan menjadi lebih munasabah? 591 00:37:19,600 --> 00:37:23,270 Yeah. >> [Pelajar] Overwrite mereka. >> Overwrite mereka dengan apa? >> [Pelajar] Data-data lain. 592 00:37:23,270 --> 00:37:29,070 Data lain. Anda hanya boleh menimpa cakera anda dengan 0s atau 1s atau semua 0s, 1s semua. 593 00:37:29,070 --> 00:37:31,230 >> Dan itulah sesungguhnya apa yang sesetengah perisian tidak. 594 00:37:31,230 --> 00:37:33,570 Anda boleh membeli perisian atau bahkan mendapatkan perisian percuma, 595 00:37:33,570 --> 00:37:36,610 dan juga dibina dalam Mac OS hari ini, kurang jadi dalam Windows, 596 00:37:36,610 --> 00:37:38,660 adalah keupayaan untuk selamat memadam. 597 00:37:38,660 --> 00:37:41,960 Sebenarnya, jika anda mahu kepada semua rumah run hari ini jika anda mempunyai Mac dan melakukan ini, 598 00:37:41,960 --> 00:37:45,740 jika anda telah mendapat beberapa perkara dalam tong sampah anda boleh, anda boleh melakukan Kosongkan Sampah yang selamat, 599 00:37:45,740 --> 00:37:47,610 yang tidak tepat. 600 00:37:47,610 --> 00:37:53,350 Bukannya hanya memadam fail di sini, ia tidak memadam sini 0 dan 1s, 601 00:37:53,350 --> 00:38:01,240 sebaliknya, ia hanya menukar mereka semua, misalnya, kepada 0 dan dot, dot, dot. 602 00:38:01,240 --> 00:38:05,330 Jadi salah psets masa depan anda sebenarnya akan untuk memulihkan data dengan sengaja - 603 00:38:05,330 --> 00:38:08,430 gambar-gambar yang kita telah diambil orang, tempat, dan perkara-perkara di kampus 604 00:38:08,430 --> 00:38:12,810 yang kita akan membuat imej forensik kad memori kamera digital, 605 00:38:12,810 --> 00:38:17,120 yang merupakan idea yang sama yang tepat - dan anda akan perlu dicabar untuk mencari sebenarnya 606 00:38:17,120 --> 00:38:20,160 corak yang mewakili JPEG pada cakera keras anda, 607 00:38:20,160 --> 00:38:23,610 banyak seperti bekas pelajar yang emelnya saya membaca beberapa minggu yang lalu 608 00:38:23,610 --> 00:38:25,860 untuk memulihkan gambar kakaknya. 609 00:38:25,860 --> 00:38:30,300 Mengapa tidak kita mengambil 5-minit rehat di sini, dan kami akan berkumpul semula dengan lebih pada ingatan. 610 00:38:33,030 --> 00:38:38,610 Jadi di sini adalah di mana perkara mendapatkan sedikit minda-lentur, tetapi ini adalah satu langkah yang sangat kuat 611 00:38:38,610 --> 00:38:40,480 ke arah memahami ini semua lebih. 612 00:38:40,480 --> 00:38:42,900 Berikut adalah program yang dipanggil pointers.c. 613 00:38:42,900 --> 00:38:45,430 Ia adalah antara contoh kod hari ini. 614 00:38:45,430 --> 00:38:51,280 Perhatikan bahawa dalam beberapa baris pertama, 19 melalui 22, semua yang kita lakukan adalah sesuatu seperti GetString 615 00:38:51,280 --> 00:38:54,460 dan kembali alamat, menyimpan ia dalam s. 616 00:38:54,460 --> 00:38:58,380 Seterusnya untuk walaupun 3 pset jika anda mahu tetapi pset 4 dan pada 617 00:38:58,380 --> 00:39:01,030 di mana anda boleh mula mengambil ini roda latihan luar diri, 618 00:39:01,030 --> 00:39:04,030 tidak ada sebab untuk berpura-pura bahawa rentetan wujud lagi. 619 00:39:04,030 --> 00:39:07,030 Ia sudah tentu okay hanya mula berkata * char. 620 00:39:07,030 --> 00:39:12,610 >> Sebagai mengetepikan, dalam rujukan dalam talian dan di dalam buku-buku anda sering boleh melihat bintang di sebelah pembolehubah. 621 00:39:12,610 --> 00:39:15,600 Anda juga mungkin melihat ruang di sekitar kedua-dua belah. 622 00:39:15,600 --> 00:39:17,680 Semua mereka berfungsi betul. 623 00:39:17,680 --> 00:39:21,180 Buat masa sekarang, walaupun, kita akan menyeragamkan pada pendekatan ini untuk membuat super jelas 624 00:39:21,180 --> 00:39:24,000 bahawa * char adalah seperti mengatakan penunjuk watak. 625 00:39:24,000 --> 00:39:25,680 Itu adalah jenis data. 626 00:39:25,680 --> 00:39:28,730 Dan kemudian nama pembolehubah adalah s dalam kes ini. 627 00:39:28,730 --> 00:39:31,180 Jadi kita telah mendapat rentetan dan kita telah dipanggil ia s. 628 00:39:31,180 --> 00:39:35,180 Dan kemudian turun di sini melihat bahawa saya lakukan sebenarnya sedikit tipu muslihat. 629 00:39:35,180 --> 00:39:39,080 Ini dipanggil penunjuk aritmetik, yang merupakan jenis mudah super. 630 00:39:39,080 --> 00:39:41,790 Ia hanya bermakna tambah dan tolak nombor untuk petunjuk. 631 00:39:41,790 --> 00:39:43,660 Tetapi ini sebenarnya berfungsi. 632 00:39:43,660 --> 00:39:49,170 Program ini nampaknya mencetak watak 1 rentetan s per baris seperti yang hasil akhir - 633 00:39:49,170 --> 00:39:54,920 Hanya supaya kita boleh merosakkan mana ini akan, membuat petunjuk, menjalankan petunjuk, izinkan saya zum masuk 634 00:39:54,920 --> 00:39:58,940 Sekarang mari saya jenis dalam sesuatu seperti HELLO dan jenis Masukkan 635 00:39:58,940 --> 00:40:01,080 dan ia mencetak 1 aksara per baris. 636 00:40:01,080 --> 00:40:04,730 Sehingga saat lalu, kita akan melakukan ini dengan notasi kurungan persegi. 637 00:40:04,730 --> 00:40:09,760 Kita akan mempunyai untuk gelung dan kita akan lakukan printf s [i] dan kita akan melakukannya lagi dan lagi dan lagi 638 00:40:09,760 --> 00:40:11,950 dengan n backslash pada akhir setiap baris. 639 00:40:11,950 --> 00:40:16,800 Tetapi program ini adalah berbeza. Program ini menggunakan, secara literal, aritmetik. 640 00:40:16,800 --> 00:40:18,860 Jadi apa yang berlaku di sini? 641 00:40:18,860 --> 00:40:24,720 Pertama sekali, sebelum gelung ini walaupun melaksanakan, apa, hanya perlu jelas, adalah s sebenarnya? 642 00:40:24,720 --> 00:40:27,270 S adalah? >> [Pelajar] address. >> Satu alamat. 643 00:40:27,270 --> 00:40:32,980 >> Dan ia alamat, dalam kes-hello, watak pertama dalam perkataan itu, yang merupakan h. 644 00:40:32,980 --> 00:40:37,370 Jadi s adalah, dalam contoh ini tertentu, alamat h. 645 00:40:37,370 --> 00:40:41,850 Jadi, apakah ia bermakna untuk melakukan s + i? 646 00:40:41,850 --> 00:40:46,280 Well, i bermula pada 0 dalam hal ini untuk gelung. Kami telah melakukan yang banyak kali. 647 00:40:46,280 --> 00:40:49,760 Saya akan pergi sehingga panjang tali, nampaknya. 648 00:40:49,760 --> 00:40:53,950 Jadi pada lelaran pertama gelung ini, i adalah jelas 0. 649 00:40:53,950 --> 00:41:01,740 Jadi ungkapan ini mengatakan s + i - bukan, s +0- yang jelas hanya s. 650 00:41:01,740 --> 00:41:04,320 Jadi apakah * s di sini? 651 00:41:04,320 --> 00:41:08,530 Sekarang kita sedang menggunakan bintang dengan cara yang sedikit berbeza. 652 00:41:08,530 --> 00:41:13,080 Biar saya pergi ke hadapan dan menghilangkan t kerana kita sudah selesai bercakap tentang t dan salinan s. 653 00:41:13,080 --> 00:41:15,540 Sekarang kita hanya mahu untuk memberitahu cerita yang melibatkan s. 654 00:41:15,540 --> 00:41:20,090 Dan sebagainya pada masa ini, setelah rentetan jenis, dunia kita kelihatan agak seperti ia lakukan sebelum 655 00:41:20,090 --> 00:41:26,630 dengan hanya s menyimpan alamat h dan lebih amnya menunjuk pada tali hello. 656 00:41:26,630 --> 00:41:33,170 Jika sekarang saya lakukan satu garis seperti * (s + i), mari kita mencuba ini. 657 00:41:33,170 --> 00:41:40,140 Jadi * (s + i). Biar saya memudahkan ini kerana ini adalah 0, jadi ini adalah * (s +0). 658 00:41:40,140 --> 00:41:43,790 Well, tunggu satu minit. Memudahkan lagi. Ini adalah * (s). 659 00:41:43,790 --> 00:41:47,020 Nah, sekarang kurungan adalah jenis bodoh, jadi sekarang mari kita hanya melakukan * s. 660 00:41:47,020 --> 00:41:50,540 Jadi, dalam lelaran pertama gelung ini, bahawa garis itu diserlahkan, 26, 661 00:41:50,540 --> 00:41:53,650 adalah cukup banyak bersamaan dengan percetakan ini. 662 00:41:53,650 --> 00:41:56,040 Apakah jenis data * s? 663 00:41:56,040 --> 00:42:00,770 Dalam konteks ini, kerana bintang yang berlaku akan datang kepada s sendiri, 664 00:42:00,770 --> 00:42:04,930 tetapi lebih khusus, kerana kita tidak lagi mengisytiharkan s, 665 00:42:04,930 --> 00:42:09,730 kita tidak mewujudkan pemboleh ubah lagi, tidak ada menyebut * char di baris 26, 666 00:42:09,730 --> 00:42:14,280 tidak ada menyebut tentang rentetan kata kunci, kami hanya menggunakan pembolehubah yang dipanggil s, 667 00:42:14,280 --> 00:42:19,650 ia ternyata kini bintang mempunyai sedikit berbeza dan, diakui, mengelirukan makna. 668 00:42:19,650 --> 00:42:26,590 * S di sini bermakna pergi ke alamat di s dan cetak apa yang ada di sana. 669 00:42:26,590 --> 00:42:33,750 Jadi s di sini, * s - jenis seperti pelongsor dan Tangga, ikut anak panah - di 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 mendapat dicetak pada lelaran pertama gelung yang di baris 26? 672 00:42:39,060 --> 00:42:42,170 Saya mencetak% c, yang merupakan placeholder untuk watak, 673 00:42:42,170 --> 00:42:48,520 maka \ n bagi barisan baru. * (S + i) di mana i ialah 0 hanya ini. 674 00:42:48,520 --> 00:42:53,670 Jadi apa char saya letakkan untuk c%? H. 675 00:42:53,670 --> 00:42:56,900 Dalam lelaran berikutnya gelung - anda mungkin boleh melihat di mana ini akan - 676 00:42:56,900 --> 00:43:01,350 lelaran seterusnya i adalah jelas 1, jadi ini bermakna +1 ku, 677 00:43:01,350 --> 00:43:05,580 dan kemudian sekarang saya perlu kurungan kerana kini bintang itu perlu untuk mengatakan 678 00:43:05,580 --> 00:43:08,620 pergi kepada alamat ingatan +1 ku. 679 00:43:08,620 --> 00:43:14,170 Apakah s? Mari kita melancarkan kembali dalam masa dan mengatakan anak panah ini kini sebenarnya tidak melakukan sebarang nikmat. 680 00:43:14,170 --> 00:43:18,450 Biarkan lebih khusus mengatakan bahawa ini menyimpan nombor 123 681 00:43:18,450 --> 00:43:25,110 kerana permulaan rentetan ini hello, ini adalah alamat 123, ini adalah 124, dan sebagainya. 682 00:43:25,110 --> 00:43:30,550 Maka pada lelaran kedua apabila saya cakapkan +1 ku, bahawa seperti mengatakan 123 +1, 683 00:43:30,550 --> 00:43:35,340 atau dikenali sebagai 124, jadi apa char mendapat dicetak pada lelaran kedua? 684 00:43:35,340 --> 00:43:37,850 E pada alamat ingatan 124. 685 00:43:37,850 --> 00:43:44,440 Kemudian + lagi, 125, 126, 127, dan gelung ini bersyukur berhenti sebelum kita sampai ke sini 686 00:43:44,440 --> 00:43:49,040 kerana saya menggunakan strlen untuk memastikan bahawa saya tidak mengira terlalu tinggi. 687 00:43:49,040 --> 00:43:50,810 Jadi yang juga adalah ia. 688 00:43:50,810 --> 00:43:55,000 Sekali lagi, ini adalah hanya seolah-olah kita telah dilakukan seminggu yang lalu. 689 00:43:55,000 --> 00:43:59,200 Izinkan saya menulis pada baris bawah walaupun kita tidak mahu melakukan kedua-duanya. 690 00:43:59,200 --> 00:44:02,500 Ini adalah sama sekarang ini. 691 00:44:02,500 --> 00:44:08,310 >> Jadi walaupun s adalah rentetan, seperti yang kita telah memanggil ia selama beberapa minggu, s adalah benar-benar * char. 692 00:44:08,310 --> 00:44:13,270 Jadi, jika kita mahu menjadi super dubur, ia adalah benar-benar yang betul untuk menulis watak tertentu 693 00:44:13,270 --> 00:44:17,490 pada lokasi engan menggunakan alamat-alamat angka dan ini pengendali bintang, 694 00:44:17,490 --> 00:44:20,470 tetapi terus terang, ini adalah pembersih yang hanya begitu banyak. Jadi ini tidak buruk. 695 00:44:20,470 --> 00:44:26,720 Tiada sebab untuk berhenti melakukan baris 27 di sini, tetapi 26 adalah fungsi yang sama, 696 00:44:26,720 --> 00:44:31,570 dan ia berfungsi sama untuk betul-betul sebab-sebab yang kita telah membincangkan setakat. 697 00:44:31,570 --> 00:44:33,650 Dan akhir sekali, 29 adalah amalan yang hanya baik. 698 00:44:33,650 --> 00:44:38,420 Panggilan percuma s bermakna bahawa kini anda memberi kembali memori bahawa GetString memberikan anda 699 00:44:38,420 --> 00:44:41,630 kerana sekali lagi, seperti yang saya disebutkan Isnin, GetString untuk minggu 700 00:44:41,630 --> 00:44:44,180 telah memperkenalkan bug ke dalam kod anda. 701 00:44:44,180 --> 00:44:46,490 Kod untuk minggu anda mempunyai kebocoran memori 702 00:44:46,490 --> 00:44:49,970 di mana anda telah meminta GetString untuk memori tetapi anda tidak pernah memberikan ia kembali. 703 00:44:49,970 --> 00:44:53,410 Dan yang sengaja dipilih oleh kami pedagogically 704 00:44:53,410 --> 00:44:55,880 kerana ia hanya terlalu banyak untuk berfikir tentang awal. 705 00:44:55,880 --> 00:44:57,710 Tetapi sekarang kita memerlukan lebih simetri. 706 00:44:57,710 --> 00:45:00,830 Jika anda bertanya kepada komputer untuk ingatan, seperti kes GetString, 707 00:45:00,830 --> 00:45:02,820 seperti kes itu nampaknya malloc, 708 00:45:02,820 --> 00:45:07,970 anda mesti sekarang terus pset 4 juga bebas apa-apa memori itu. 709 00:45:07,970 --> 00:45:11,650 Notis ini adalah berbeza daripada mengatakan n int. 710 00:45:11,650 --> 00:45:15,040 Anda tidak perlu untuk membebaskan ini kerana anda tidak memanggil GetString 711 00:45:15,040 --> 00:45:16,890 dan anda tidak memanggil malloc. 712 00:45:16,890 --> 00:45:20,610 >> Dan walaupun anda dipanggil GetInt kerana akhirnya kita akan melihat, 713 00:45:20,610 --> 00:45:25,520 GetInt tidak memperuntukkan memori untuk anda kerana anda sebenarnya boleh lulus sekitar integer 714 00:45:25,520 --> 00:45:29,430 dan terapung dan aksara hanya cara yang kita telah lakukan untuk minggu. 715 00:45:29,430 --> 00:45:33,960 Rentetan, walaupun, adalah istimewa kerana benar-benar mereka dinamika aksara berganda. 716 00:45:33,960 --> 00:45:37,450 Jadi mereka hanya berbeza dari aksara dan terapung dan ints dan sebagainya. 717 00:45:37,450 --> 00:45:39,980 Tetapi kita akan kembali yang lama. 718 00:45:39,980 --> 00:45:44,920 Sebarang pertanyaan kemudian pada permulaan ini petunjuk? Yeah. 719 00:45:44,920 --> 00:45:49,690 [Soalan pelajar didengar] 720 00:45:49,690 --> 00:45:51,440 Ah, soalan yang sangat baik. 721 00:45:51,440 --> 00:45:55,790 Salah satu perkara yang beberapa C sebenarnya tidak untuk anda, yang mudah, 722 00:45:55,790 --> 00:46:00,110 ia angka untuk anda apa saiz jenis data 723 00:46:00,110 --> 00:46:03,060 dan kemudian tidak bahawa jenis penggandaan untuk anda. 724 00:46:03,060 --> 00:46:06,610 Ini adalah tidak relevan dalam kes aksara kerana hampir selalu char 1 bait, 725 00:46:06,610 --> 00:46:08,150 jadi ini hanya berfungsi. 726 00:46:08,150 --> 00:46:11,220 Tetapi demi perbincangan, jika anda sebenarnya percetakan integer 727 00:46:11,220 --> 00:46:15,500 dan anda telah cuba untuk mencetak beberapa nilai yang telah menunjuk pada integer, 728 00:46:15,500 --> 00:46:20,720 anda sama tidak akan perlu untuk melakukan + 4 * i hanya kerana int 4 bait. 729 00:46:20,720 --> 00:46:25,780 Aritmetik pointer bermakna bahawa C dan pengkompil melakukan semua bahawa matematik untuk anda. 730 00:46:25,780 --> 00:46:29,190 Semua yang anda perlu mengambil berat tentang pengiraan dalam jenis rasa manusia. Yeah. 731 00:46:29,190 --> 00:46:35,200 [Pelajar] Jika anda mengisytiharkan rentetan di dalam gelung, adakah anda mempunyai untuk membebaskan kemudian? 732 00:46:35,200 --> 00:46:36,760 Soalan yang baik. 733 00:46:36,760 --> 00:46:41,390 >> Jika anda mengisytiharkan dalam rentetan bagi gelung, adakah anda perlu untuk membebaskan kemudian? 734 00:46:41,390 --> 00:46:47,520 Anda hanya perlu memori bebas yang anda memperuntukkan dengan GetString atau dengan malloc. 735 00:46:47,520 --> 00:46:53,110 Jadi jika anda hanya mengatakan sesuatu seperti - izinkan saya meletakkan pendakap kerinting sekarang supaya semua kod berkaitan. 736 00:46:53,110 --> 00:46:58,580 Jika anda melakukan sesuatu, walaupun buggily, seperti ini, char * t = s, 737 00:46:58,580 --> 00:47:03,450 anda tidak perlu t percuma kerana t tidak melibatkan apa-apa sebutan malloc atau GetString. 738 00:47:03,450 --> 00:47:08,960 Jika sebaliknya anda lakukan ini, GetString, maka ya, anda akan perlu t percuma. 739 00:47:08,960 --> 00:47:14,350 Dan pada hakikatnya, satunya peluang anda untuk berbuat demikian adalah sekarang dalam gelung ini, isu yang sama skop 740 00:47:14,350 --> 00:47:16,060 bahawa kita telah dibincangkan pada masa lalu. 741 00:47:16,060 --> 00:47:18,830 Jika tidak, anda akan memperuntukkan memori, memperuntukkan memori, memperuntukkan memori, 742 00:47:18,830 --> 00:47:21,230 dan di akhir program ini kerana anda berada di luar gelung itu, 743 00:47:21,230 --> 00:47:24,240 t tidak wujud, tetapi anda tidak pernah memberitahu sistem operasi 744 00:47:24,240 --> 00:47:26,750 bahawa anda tidak memerlukan memori yang lagi. 745 00:47:26,750 --> 00:47:30,430 Dan tidak lama lagi, bagi pset 4 atau 5 kita akan melengkapkan anda dengan program yang dipanggil Valgrind, 746 00:47:30,430 --> 00:47:34,160 yang sama dalam semangat untuk GDB bahawa ia mendapat agak antara muka batin, 747 00:47:34,160 --> 00:47:35,750 tetapi tujuan dalam hidup adalah untuk membantu anda. 748 00:47:35,750 --> 00:47:39,380 Dan Valgrind merupakan satu program yang pada masa depan akan mencari program anda 749 00:47:39,380 --> 00:47:42,550 mencari kebocoran memori, sama ada dari GetString atau malloc, 750 00:47:42,550 --> 00:47:47,800 yang kita akan mula menggunakan semua lebih kerana kita berhenti menggunakan perpustakaan CS50 sebagai banyak. 751 00:47:47,800 --> 00:47:53,030 Kami akhirnya kini mempunyai jenis perbendaharaan kata dan jenis model mental dalam teori 752 00:47:53,030 --> 00:47:55,170 dengan yang untuk menyelesaikan program ini patah. 753 00:47:55,170 --> 00:47:59,410 >> Jadi dalam program ini patah, swap berfungsi dalam swap, 754 00:47:59,410 --> 00:48:05,280 tetapi ia tidak pernah benar-benar bekerja di utama kerana utama diluluskan dalam x dan y, ingat, 755 00:48:05,280 --> 00:48:07,260 dan mereka telah diluluskan oleh nilai-nilai, jadi untuk bercakap. 756 00:48:07,260 --> 00:48:09,330 Salinan daripada mereka telah diberikan untuk menukar. 757 00:48:09,330 --> 00:48:12,520 Menjelang akhir swap, a dan b itu memang telah ditukar, 758 00:48:12,520 --> 00:48:16,120 tetapi sudah tentu x dan y, seperti yang kita dibincangkan pada hari Isnin, tidak pernah. 759 00:48:16,120 --> 00:48:19,940 Jadi saya mencadangkan hijau di sini bahawa ini adalah sebenarnya penyelesaian di sini. 760 00:48:19,940 --> 00:48:22,640 Dan sebenarnya, biarlah saya bergerak bintang saya hanya untuk menjadi konsisten 761 00:48:22,640 --> 00:48:24,440 walaupun, sekali lagi, fungsi ini tidak mengapa. 762 00:48:24,440 --> 00:48:28,730 Pada minggu-minggu akan datang, kami akan menjelaskan bila dan mengapa ia perkara. 763 00:48:28,730 --> 00:48:30,600 Jadi hijau kini adalah penyelesaian. 764 00:48:30,600 --> 00:48:33,700 Terus terang, ia kelihatan banyak keseluruhan Messier kerana saya mempunyai semua bintang-bintang ini. 765 00:48:33,700 --> 00:48:35,380 Izinkan saya menunjukkan satu perkara. 766 00:48:35,380 --> 00:48:40,040 Top line di sini di mana ia mengatakan int * dan int * b 767 00:48:40,040 --> 00:48:42,820 asasnya melakukan perkara yang sama kerana ia sentiasa mempunyai. 768 00:48:42,820 --> 00:48:47,070 Ia mengisytiharkan 2 hujah atau parameter untuk menukar, 769 00:48:47,070 --> 00:48:49,940 di mana yang pertama adalah penunjuk int dipanggil, 770 00:48:49,940 --> 00:48:53,100 kedua yang merupakan penunjuk int dipanggil b. 771 00:48:53,100 --> 00:48:55,770 Satu-satunya perkara yang baru pada ketika ini adalah hakikat bahawa terdapat bintang di sana. 772 00:48:55,770 --> 00:48:59,340 >> Apa maksudnya? Tidak int, b tidak adalah satu int. 773 00:48:59,340 --> 00:49:04,100 Adalah alamat int dan b adalah alamat int yang berbeza. 774 00:49:04,100 --> 00:49:06,980 Turun di sini, ini adalah di mana saya mengakui C mendapat mengelirukan. 775 00:49:06,980 --> 00:49:09,790 Sekarang kita sedang menggunakan bintang, tetapi ia mempunyai makna yang berbeza dalam konteks ini. 776 00:49:09,790 --> 00:49:13,150 Kerana kita tidak mengisytiharkan petunjuk seperti kita di sini, 777 00:49:13,150 --> 00:49:15,500 di sini kita dereferencing perkara. 778 00:49:15,500 --> 00:49:21,520 Jadi secara teknikal, bintang dalam konteks ini baris pertama, kedua, dan ketiga di dalam swap 779 00:49:21,520 --> 00:49:24,560 pengendali dereference, yang hanya bermakna pergi ke sana. 780 00:49:24,560 --> 00:49:27,400 Jadi hanya jari saya diikuti anak panah untuk h, 781 00:49:27,400 --> 00:49:31,100 * Cara pergi ke alamat tersebut dan mencari saya int yang ada. 782 00:49:31,100 --> 00:49:34,250 * Cara b pergi ke alamat dan lulus saya apa yang ada. 783 00:49:34,250 --> 00:49:40,730 Jadi mari kita melukis gambar dari Isnin kini menggunakan timbunan bingkai, 784 00:49:40,730 --> 00:49:43,130 satu bawah 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 supaya dunia kita kelihatan, sama seperti hari Isnin, seperti ini. 787 00:49:50,880 --> 00:49:53,620 Berikut adalah sebahagian memori yang utama akan menggunakan. 788 00:49:53,620 --> 00:49:56,520 >> Ingat dari hari Isnin bahawa program ini hanya mempunyai 2 pembolehubah, 789 00:49:56,520 --> 00:50:01,930 yang dipanggil x dan satu dipanggil y, dan saya telah meletakkan nombor 1 dan 2 di sana. 790 00:50:01,930 --> 00:50:06,580 Sekarang apabila saya panggil swap seperti yang saya lakukan pada hari Isnin, 791 00:50:06,580 --> 00:50:11,000 sebelum ini apabila saya menggunakan versi merah program ini, yang kelihatan seperti ini, 792 00:50:11,000 --> 00:50:17,470 Saya mendapat 2 parameter, a dan b, dan apa yang kita menulis di sini dan di sini? 793 00:50:17,470 --> 00:50:21,160 Hanya 1 dan 2, secara literal salinan 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 lulus dalam ints a dan b kita pergi untuk lulus dalam 2 alamat. 796 00:50:28,510 --> 00:50:34,290 Alamat tersebut berlaku untuk menunjukkan ints, tetapi alamat tidak ints diri. 797 00:50:34,290 --> 00:50:37,330 Mereka adalah alamat. Ia seperti alamat pos sebaliknya. 798 00:50:37,330 --> 00:50:40,580 Jadi sekarang kita hanya perlu memberi diri saya sedikit lebih terperinci pada skrin. 799 00:50:40,580 --> 00:50:43,250 Ini adalah memori komputer saya kerana ia telah sepanjang hari. 800 00:50:43,250 --> 00:50:45,120 Sekarang kita perlu beberapa skim penomboran sewenang-wenangnya. 801 00:50:45,120 --> 00:50:50,580 Jadi mari kita hanya mengatakan, hanya secara kebetulan, bahawa ini adalah alamat ingatan 123, 124. 802 00:50:50,580 --> 00:50:55,660 Mari kita hanya mengatakan ini ialah 125, ini adalah 126, dan sebagainya, tetapi yang benar-benar sewenang-wenangnya. 803 00:50:55,660 --> 00:50:58,590 Kita hanya perlu beberapa skim penomboran dalam ingatan saya. 804 00:50:58,590 --> 00:51:04,030 Jadi sekarang apabila saya benar-benar lulus dalam x dan y, saya tidak akan lulus dalam x dan y; 805 00:51:04,030 --> 00:51:08,400 Saya akan lulus dalam alamat pos, jadi untuk bercakap, x dan y 806 00:51:08,400 --> 00:51:11,870 supaya apa yang mendapat disimpan di sini dan di sini tidak adalah 1 dan 2, 807 00:51:11,870 --> 00:51:16,030 tetapi jika anda boleh melihat teks kecil saya, apa yang mendapat diluluskan di sini dan di sini? 808 00:51:16,030 --> 00:51:23,340 [Sambutan pelajar didengar] >> Tepat sekali. 123 mendapat diletakkan di sini dan 124 mendapat diletakkan di sini. 809 00:51:23,340 --> 00:51:28,910 >> Sekarang, kerana saya menggunakan bintang dalam cara ini garis yang pertama di sini di atas, 810 00:51:28,910 --> 00:51:34,340 program saya hanya tahu bahawa 123 dan 124, walaupun mereka jelas integer 811 00:51:34,340 --> 00:51:40,160 bahawa mana-mana manusia boleh notis, mereka harus ditafsirkan sebagai alamat, alamat berangka. 812 00:51:40,160 --> 00:51:43,250 Mereka tidak berada di dalam dan diri mereka sendiri ints, mereka alamat, 813 00:51:43,250 --> 00:51:46,120 dan itulah kerana saya telah jelas meletakkan bintang di sana. 814 00:51:46,120 --> 00:51:51,360 Jadi sekarang dalam baris pertama, kedua, dan ketiga saya kod sebenar apa yang berlaku di sini? 815 00:51:51,360 --> 00:51:53,380 Mari kita lukiskan rehat gambar. 816 00:51:53,380 --> 00:51:56,980 Tmp adalah sama seperti ia adalah pada hari Isnin. Tiada apa-apa yang istimewa tentang tmp. 817 00:51:56,980 --> 00:52:03,060 Ia adalah hanya 32 bit tempatan berubah-ubah, dan di dalam yang saya nampaknya menyimpan nilai a *. 818 00:52:03,060 --> 00:52:08,580 Sekarang, jika saya hanya berkata tmp = a, apa yang saya akan meletakkan di sini? >> [Pelajar] 123. 819 00:52:08,580 --> 00:52:10,370 123. Tetapi itu bukan apa yang saya lakukan. 820 00:52:10,370 --> 00:52:13,670 Saya katakan tmp = * a. Cara 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 anak panah. 822 00:52:19,370 --> 00:52:24,460 Nah, ada ia adalah, 1. Jadi apa yang mendapat disimpan di tmp, nampaknya? Hanya 1. 823 00:52:24,460 --> 00:52:29,620 Jadi dalam erti kata lain, tmp *, * satu cara pergi ke alamat yang kini dalam, 824 00:52:29,620 --> 00:52:31,320 yang nampaknya 123. 825 00:52:31,320 --> 00:52:33,910 >> Okay, di sini kita adalah di 123 lokasi, saya melihat nombor 1, 826 00:52:33,910 --> 00:52:35,670 jadi saya akan meletakkan nombor 1 di sana. 827 00:52:35,670 --> 00:52:39,020 Sekarang apa yang saya lakukan dalam 2 baris, * = * b? 828 00:52:39,020 --> 00:52:44,570 Ini adalah sedikit lebih terlibat kerana kini apa yang dikatakan? Ia adalah 123. 829 00:52:44,570 --> 00:52:50,220 So * adalah di mana? Tepat di mana saya sebelum ini. Jadi pergi ke sana. Okay. 830 00:52:50,220 --> 00:52:53,420 Sekarang, akhirnya, dan akhirnya ini akan mula masuk akal, mudah-mudahan, 831 00:52:53,420 --> 00:53:00,280 * B bermakna apa yang di b? 124. Jadi saya perlu pergi ke sana, yang terletak 2. 832 00:53:00,280 --> 00:53:03,430 Jadi, apa yang saya meletakkan di mana? 833 00:53:03,430 --> 00:53:10,100 2 masuk ke sini kerana * b masuk ke dalam * satu. Jadi, saya akan berbuat demikian. 834 00:53:10,100 --> 00:53:13,120 Dan anda sudah boleh melihat, mungkin, bahawa kita lebih dekat 835 00:53:13,120 --> 00:53:17,710 untuk menyelesaikan ini bodoh, masalah yang mudah dengan betul untuk kali pertama 836 00:53:17,710 --> 00:53:20,920 kerana sekarang kita masih mempunyai ingatan apa x, 837 00:53:20,920 --> 00:53:23,230 kami mempunyai 2 salinan, diakui, y, 838 00:53:23,230 --> 00:53:25,850 tetapi baris 3 sekarang kata * b. 839 00:53:25,850 --> 00:53:31,080 Jadi di sini adalah b. * B cara pergi ke sana. Jadi di mana lokasi 124? 840 00:53:31,080 --> 00:53:35,560 Ia nampaknya di sini. Jadi apa yang saya letakkan di sini? Jelas sekali, tmp. 841 00:53:35,560 --> 00:53:39,600 Jadi sekarang saya melakukan ini. Jadi saya mempunyai 1 di sini dan 2 di sini. 842 00:53:39,600 --> 00:53:43,560 Dan kini apa tentang semua ini, 123, 124, dan 1? 843 00:53:43,560 --> 00:53:47,910 Secepat pulangan swap, ingatan ini adalah sebagai baik sebagai hilang 844 00:53:47,910 --> 00:53:51,070 kerana secepat pulangan swap, sistem operasi 845 00:53:51,070 --> 00:53:54,190 adalah bebas untuk menggunakan memori yang sekali lagi pada masa depan. 846 00:53:54,190 --> 00:53:58,870 Hanya ingatan utama di bawah timbunan ini kononnya melekat sekitar. 847 00:53:58,870 --> 00:54:01,470 >> Dan supaya kita akhirnya mempunyai kini versi bekerja. 848 00:54:01,470 --> 00:54:06,310 Biar saya pergi ke swap.c, dan notis berikut. 849 00:54:06,310 --> 00:54:11,280 Pada bahagian atas program saya telah berubah prototaip saya untuk menjadi int * dan int * b. 850 00:54:11,280 --> 00:54:15,000 Jadi, perkara yang hanya saya berubah untuk pergi dari merah, yang buruk, hijau, yang baik, 851 00:54:15,000 --> 00:54:17,350 saya tambah bintang ini hari ini. 852 00:54:17,350 --> 00:54:21,520 Tetapi kemudian turun di sini di swap sendiri saya terpaksa untuk menyalin, paste apa yang hanya pada slaid. 853 00:54:21,520 --> 00:54:24,140 Saya mempunyai bintang di sini, bintang di sini - yang sepadan prototaip - 854 00:54:24,140 --> 00:54:27,930 dan kemudian semua perkara ini kini mempunyai bintang kecuali tmp 855 00:54:27,930 --> 00:54:30,680 kerana penggunaan pembolehubah sementara, tiada apa-apa yang baru di sana. 856 00:54:30,680 --> 00:54:33,040 Saya hanya perlu penyimpanan sementara untuk int. 857 00:54:33,040 --> 00:54:34,820 Jadi kita tidak memerlukan bintang di sana. 858 00:54:34,820 --> 00:54:39,310 Kita hanya perlu bintang supaya kita boleh menyeberang ini jenis sempadan sewenang-wenangnya 859 00:54:39,310 --> 00:54:42,900 antara 2 bingkai dalam ingatan komputer saya. 860 00:54:42,900 --> 00:54:45,630 Tetapi satu perkara yang lepas telah berubah, dan anda mungkin telah celah ia sudah. 861 00:54:45,630 --> 00:54:48,810 Apa barisan lain jelas berbeza sekarang? >> [Pelajar] & x. 862 00:54:48,810 --> 00:54:53,270 >> Ya, jadi 25 adalah barisan terakhir kod saya perlu menukar untuk ini untuk bekerja. 863 00:54:53,270 --> 00:54:58,360 Seminggu yang lalu dan walaupun pada hari Isnin line 25 kelihatan seperti ini, menukar x dan y, 864 00:54:58,360 --> 00:55:02,020 dan ini hanya dipecahkan kerana jika anda mengatakan swap (x, y) 865 00:55:02,020 --> 00:55:05,660 anda memberi salinan x dan y untuk menukar, maka ia melakukan perkara, 866 00:55:05,660 --> 00:55:09,080 tetapi anda sebenarnya tidak pernah berubah-ubah x dan y sendiri. 867 00:55:09,080 --> 00:55:12,880 Jadi, walaupun anda tidak pernah melihat watak ini sebelum dengan #: glib dalam kod, 868 00:55:12,880 --> 00:55:15,860 hanya mengambil tekaan. Apakah #: glib lakukan, nampaknya? 869 00:55:15,860 --> 00:55:17,890 [Pelajar] Mengambil alamat. >> Mengambil alamat. 870 00:55:17,890 --> 00:55:21,160 Jadi #: glib mengatakan memberikan saya alamat x. 871 00:55:21,160 --> 00:55:25,590 Siapa tahu di mana ia? Ia berlaku untuk menjadi 123. Saya tidak peduli. Hanya memberikan saya alamat x. 872 00:55:25,590 --> 00:55:28,340 & Y bermakna memberi saya alamat y. 873 00:55:28,340 --> 00:55:34,450 Dan pada ketika itu cerita ini adalah sempurna konsisten dengan gambar kita menarik seketika lalu. 874 00:55:34,450 --> 00:55:38,310 >> Jadi saya akan mengakui petunjuk, sudah tentu bagi saya apabila saya mula belajar ini, 875 00:55:38,310 --> 00:55:40,570 pasti salah satu perkara yang paling sukar untuk membalut fikiran saya sekitar. 876 00:55:40,570 --> 00:55:43,760 Tetapi sedar, terutamanya seperti yang kita terus bermain dengan jenis-jenis perkara, 877 00:55:43,760 --> 00:55:48,030 jika anda memecahkan ia turun untuk menyusun ini super mudah intelektual tidak menarik masalah 878 00:55:48,030 --> 00:55:52,270 hanya nombor bergerak di sekitar, jawapannya kepada banyak kekeliruan dengan petunjuk 879 00:55:52,270 --> 00:55:56,590 benar-benar boleh diperolehi daripada mekanik ini sangat asas. 880 00:55:56,590 --> 00:55:59,070 Berikut adalah alamat. Pergi ke sana dengan bintang. 881 00:55:59,070 --> 00:56:03,830 Atau sebaliknya, di sini #: glib. Memikirkan apa yang sebenarnya adalah alamat. 882 00:56:03,830 --> 00:56:06,270 Semua hak. 883 00:56:06,270 --> 00:56:09,000 Jadi di mana semua ingatan ini datang dari? 884 00:56:09,000 --> 00:56:12,360 Kami telah menarik gambar ini beberapa kali, dan saya terus menjanjikan kita akan kembali kepadanya, 885 00:56:12,360 --> 00:56:14,920 tetapi di sini adalah perwakilan memori komputer anda 886 00:56:14,920 --> 00:56:17,420 yang sedikit lebih dilabelkan daripada papan hitam kami di sini adalah. 887 00:56:17,420 --> 00:56:21,590 Segmen teks di atas mewakili apa yang berkenaan dengan program anda? 888 00:56:21,590 --> 00:56:26,090 [Sambutan pelajar didengar] >> Maaf? Katakanlah lagi. 889 00:56:26,090 --> 00:56:28,660 [Pelajar] Program sebenar. >> Program sebenar. 890 00:56:28,660 --> 00:56:32,430 >> Jadi dilafaz 0s dan 1s bahawa anda telah disusun selepas menulis kod C dan kemudian berjalan 891 00:56:32,430 --> 00:56:35,910 dan menjana hujung 0s dan 1s sehingga mendapat terletak di sana dalam ingatan 892 00:56:35,910 --> 00:56:38,570 kerana apabila anda klik dua kali ikon pada Mac atau PC anda 893 00:56:38,570 --> 00:56:43,010 atau menjalankan arahan seperti mario pada segera anda, 0s dan 1s daripada cakera 894 00:56:43,010 --> 00:56:45,700 dimuatkan ke dalam memori supaya komputer boleh memanipulasi mereka 895 00:56:45,700 --> 00:56:47,540 dan melaksanakan mereka dengan lebih cepat. 896 00:56:47,540 --> 00:56:50,880 Jadi dimulakan data dan data yang tidak diisytiharkan, kita tidak akan bercakap banyak tentang mereka, 897 00:56:50,880 --> 00:56:52,420 tetapi mereka hanya pembolehubah global. 898 00:56:52,420 --> 00:56:54,710 Dimulakan bermakna pembolehubah global yang anda berikan nilai kepada; 899 00:56:54,710 --> 00:56:59,300 tidak diisytiharkan bermakna pembolehubah global bahawa anda tidak lagi memberi nilai kepada. 900 00:56:59,300 --> 00:57:01,900 Kemudian terdapat pembolehubah persekitaran yang saya benar-benar akan melambai tangan saya pada, 901 00:57:01,900 --> 00:57:04,860 tetapi mereka berada di sana dan yang menyimpan perkara-perkara seperti nama pengguna anda 902 00:57:04,860 --> 00:57:08,090 dan jenis lain butiran tahap yang lebih rendah. 903 00:57:08,090 --> 00:57:12,880 Tetapi keping juiciest susun atur memori anda adalah perkara ini dipanggil timbunan dan longgokan itu. 904 00:57:12,880 --> 00:57:17,470 Timbunan sekali lagi, perlu jelas, adalah memori yang digunakan apabila fungsi dipanggil, 905 00:57:17,470 --> 00:57:19,710 apabila terdapat pembolehubah tempatan 906 00:57:19,710 --> 00:57:22,120 dan apabila terdapat parameter yang diluluskan sekitar. 907 00:57:22,120 --> 00:57:24,490 Semua yang berlaku dalam timbunan. 908 00:57:24,490 --> 00:57:29,570 Timbunan itu kita tidak bercakap tentang, tetapi mengambil tekaan yang menggunakan timbunan. 909 00:57:31,120 --> 00:57:32,690 Hanya sebahagian memori yang berbeza. 910 00:57:32,690 --> 00:57:36,620 Ia berlaku untuk diambil di sini di atas, tetapi itulah konvensyen bergambar sewenang-wenangnya. 911 00:57:36,620 --> 00:57:41,670 Siapa yang nampaknya telah menggunakan memori dari timbunan itu selama beberapa minggu? 912 00:57:41,670 --> 00:57:44,830 Ia teknikal anda tetapi secara tidak langsung. >> [Pelajar] GetString. 913 00:57:44,830 --> 00:57:47,950 GetString dan malloc. Jadi di sini adalah perbezaan asas. 914 00:57:47,950 --> 00:57:51,300 >> Anda tahu untuk beberapa minggu lalu bahawa jika anda memerlukan ingatan, hanya mengisytiharkan pembolehubah. 915 00:57:51,300 --> 00:57:54,560 Jika anda memerlukan banyak memori, mengisytiharkan pelbagai kanan di dalam fungsi anda. 916 00:57:54,560 --> 00:57:59,620 Tetapi masalah kita telah disimpan menghadapi adalah jika anda mengisytiharkan pembolehubah tempatan dalam fungsi, 917 00:57:59,620 --> 00:58:05,340 secepat pulangan fungsi, apa yang berlaku kepada memori dan pembolehubah-pembolehubah? 918 00:58:05,340 --> 00:58:09,620 Hanya apapun ia tidak lagi milik anda, bukan? Ia hanya hilang jenis konsep. 919 00:58:09,620 --> 00:58:13,950 Ia masih fizikal di sana, jelas, tetapi ia tidak lagi hak anda untuk menggunakan. 920 00:58:13,950 --> 00:58:17,160 Ini adalah jelas bermasalah jika anda mahu menulis fungsi dalam kehidupan 921 00:58:17,160 --> 00:58:20,440 yang sebenarnya memperuntukkan memori dan tidak memberikan kembali segera. 922 00:58:20,440 --> 00:58:24,180 Kes di titik: tujuan GetString dalam kehidupan adalah untuk tidak mempunyai idea terlebih dahulu 923 00:58:24,180 --> 00:58:26,390 betapa besar rentetan saya akan menaip di keyboard, 924 00:58:26,390 --> 00:58:30,390 tetapi ia mendapat untuk dapat memperuntukkan memori untuk memegang Daud atau hello 925 00:58:30,390 --> 00:58:32,860 atau keseluruhan esei bahawa pengguna mungkin telah ditaip 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 itu mesti menggunakan bukan timbunan; 928 00:58:38,910 --> 00:58:40,770 sebaliknya ia menggunakan perkara ini dipanggil timbunan itu. 929 00:58:40,770 --> 00:58:44,430 Ada apa-apa yang berbeza tentang memori. Ia bukan cepat atau perlahan atau apa-apa seperti itu. 930 00:58:44,430 --> 00:58:46,570 Ia hanya fizikal di lokasi yang berbeza. 931 00:58:46,570 --> 00:58:50,120 >> Tetapi pemerintahan adalah bahawa memori yang diperuntukkan pada timbunan 932 00:58:50,120 --> 00:58:56,180 tidak akan diambil dari anda sehingga anda memanggil - mengambil tekaan bebas. 933 00:58:56,180 --> 00:59:00,510 Sebaliknya, ingatan-mana anda bertanya pada timbunan dengan hanya mengisytiharkan array 934 00:59:00,510 --> 00:59:03,320 atau mengisytiharkan pembolehubah seperti yang kita telah lakukan untuk minggu, 935 00:59:03,320 --> 00:59:05,640 bahawa secara lalai berakhir pada timbunan. 936 00:59:05,640 --> 00:59:09,550 Dan bahawa kerja-kerja yang besar 90% daripada masa itu, tetapi pada masa-masa yang jarang 937 00:59:09,550 --> 00:59:12,470 di mana anda mahu untuk memperuntukkan memori dan menyimpan di sekeliling, 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 seterusnya menggunakan malloc. 940 00:59:19,370 --> 00:59:23,300 Mari kita lihat di mana ini mungkin memecahkan dan kemudian mengambil mengintip di Binky. 941 00:59:23,300 --> 00:59:25,820 Kita akan kembali itu di masa depan. 942 00:59:25,820 --> 00:59:29,270 Berikut adalah program super mudah bahawa dalam 2 baris pertama melakukan apa? 943 00:59:29,270 --> 00:59:33,460 Dalam bahasa Inggeris, apa yang ini 2 baris pertama kod lakukan dalam utama? 944 00:59:33,460 --> 00:59:35,600 [Sambutan pelajar didengar] 945 00:59:35,600 --> 00:59:37,880 Berhati-hati. Ia tidak memberi saya alamat x atau y. 946 00:59:37,880 --> 00:59:41,840 [Pelajar] Memberi petunjuk kepada ints. Baik >>. Berikan saya 2 petunjuk untuk integer. 947 00:59:41,840 --> 00:59:45,130 Dalam erti kata lain, memberi saya 2 ketulan ingatan bahawa saya menyimpan lukisan hari ini, 948 00:59:45,130 --> 00:59:46,950 walaupun saya terpadam sekarang, sebagai dataran. 949 00:59:46,950 --> 00:59:50,000 Berikan saya 2 ketulan memori, satu dipanggil x, satu dipanggil y - 950 00:59:50,000 --> 00:59:54,320 sebelum saya memanggil mereka s dan t - dan apakah jenis Sebahagian bahawa memori? 951 00:59:54,320 --> 00:59:57,160 Ia akan menyimpan alamat. 952 00:59:57,160 --> 00:59:59,110 Ia adalah * int jenis. 953 00:59:59,110 --> 01:00:01,630 >> Jadi alamat int akhirnya akan hidup dalam x, 954 01:00:01,630 --> 01:00:03,860 alamat int akhirnya akan hidup dalam y, 955 01:00:03,860 --> 01:00:08,460 tetapi pada mulanya, apa yang di dalam x dan y? Siapa tahu? Sampah nilai. 956 01:00:08,460 --> 01:00:10,180 Ia mempunyai tiada kaitan dengan penunjuk. 957 01:00:10,180 --> 01:00:12,720 Jika kita tidak meletakkan sesuatu di sana, siapa tahu apa sebenarnya ada? 958 01:00:12,720 --> 01:00:18,950 Sekarang, x. Apa yang berlaku di sini? Ini adalah legit kini kerana x penunjuk. Ia merupakan satu * int. 959 01:00:18,950 --> 01:00:21,870 Jadi ini bermakna saya boleh meletakkan di x alamat Sebahagian beberapa memori. 960 01:00:21,870 --> 01:00:25,120 Apakah malloc kembali? Sempurna, ia kembali alamat, 961 01:00:25,120 --> 01:00:28,510 alamat bait pertama dalam sebahagian keseluruhan ingatan. 962 01:00:28,510 --> 01:00:31,140 Berapa banyak bait ini nampaknya memperuntukkan, misalnya, dalam perkakas? 963 01:00:31,140 --> 01:00:33,510 Apakah saiz int? 4. 964 01:00:33,510 --> 01:00:36,600 Jika anda berfikir kembali ke 1 minggu, ia bukan super penting untuk sentiasa ingat bahawa, 965 01:00:36,600 --> 01:00:38,870 tetapi dalam kes ini ia adalah berguna untuk mengetahui, 4 bait. 966 01:00:38,870 --> 01:00:41,770 Jadi ini memperuntukkan pada 4 bytes timbunan 967 01:00:41,770 --> 01:00:46,110 dan ia kembali alamat yang pertama kepada saya dengan sewenang-wenangnya. 968 01:00:46,110 --> 01:00:47,700 Kini, apa yang x buat? 969 01:00:47,700 --> 01:00:52,200 A * x = 42 adalah melakukan apa? 970 01:00:52,200 --> 01:00:57,150 Jika pada ketika ini dalam cerita kita mempunyai x, yang kelihatan seperti ini dengan nilai sampah beberapa, 971 01:00:57,150 --> 01:01:04,120 ini kini y dengan nilai sampah beberapa, sekarang dalam 3 baris saya telah diperuntukkan 4 bait. 972 01:01:04,120 --> 01:01:06,950 Gambar ini pada dasarnya kelihatan seperti ini. 973 01:01:06,950 --> 01:01:12,010 Atau lebih khusus, jika ini adalah alamat sewenang-wenangnya 123, ini adalah apa cerita kita kini kelihatan seperti. 974 01:01:12,010 --> 01:01:23,940 * X = 42 sekarang bermakna apa? Ini bermakna pergi hingga 123 alamat dan meletakkan nombor 42 di sana. 975 01:01:23,940 --> 01:01:26,220 Saya tidak perlu untuk menarik garis-garis kerana kita tidak melakukan rentetan. 976 01:01:26,220 --> 01:01:29,480 >> Saya sepatutnya hanya ditulis seperti ini, dan hanya kerana demonstrasi itu, 977 01:01:29,480 --> 01:01:33,240 42 sebagai sejenis int mengambil banyak ruang, 4 bait. 978 01:01:33,240 --> 01:01:35,960 Jadi itulah apa yang berlaku di sana, tetapi ada masalah sekarang. 979 01:01:35,960 --> 01:01:40,580 * Y = 13. Apa yang akan berlaku di sini? 980 01:01:40,580 --> 01:01:46,470 Masalahnya ialah y * di dunia dipermudahkan kita hanya bermakna pergi ke alamat dalam y. 981 01:01:46,470 --> 01:01:48,590 Apakah dalam y? Ia adalah beberapa nilai sampah. 982 01:01:48,590 --> 01:01:53,150 Jadi mari kita andaikan bahawa nilai sampah adalah 5551212, sesuatu yang gila seperti itu. 983 01:01:53,150 --> 01:01:56,750 * Cara y pergi untuk menangani 5551212. 984 01:01:56,750 --> 01:02:00,450 Itu suka di sini. Ia tidak wujud, misalnya. 985 01:02:00,450 --> 01:02:05,310 Jadi * y mendapat 13 cara saya cuba untuk menarik 13 di sini. Ia tidak wujud. 986 01:02:05,310 --> 01:02:08,790 Saya telah melebihi segmen papan hitam. Apa yang saya dapat? 987 01:02:08,790 --> 01:02:14,930 Bahawa mesej kesalahan segmentasi samar kerana saya cuba untuk meletakkan dalam ingatan 988 01:02:14,930 --> 01:02:19,470 nilai seperti 13 di tempat yang tidak wujud. 989 01:02:19,470 --> 01:02:23,900 Selebihnya program mungkin bekerja okay, tetapi sehingga titik bahawa ia tidak. 990 01:02:23,900 --> 01:02:25,350 Jadi mari kita cuba untuk memberitahu cerita ini. 991 01:02:25,350 --> 01:02:27,830 Kita akan kembali kepada bahawa apabila kita telah bercakap tentang hex. 992 01:02:27,830 --> 01:02:30,290 Mari kita kembali kepada ini dan menyimpulkan dengan perkara ini dipanggil Binky, 993 01:02:30,290 --> 01:02:33,710 yang ingat adalah seorang profesor Stanford duduk di rumah bermain dengan claymation, 994 01:02:33,710 --> 01:02:36,380 untuk menceritakan kisah tepat program yang sama. 995 01:02:36,380 --> 01:02:40,580 Ia hanya kira-kira 3 minit. Di sini kita mempunyai Binky. 996 01:02:40,580 --> 01:02:45,030 [Penceramah lelaki pada video] Hei Binky, bangun. Ia adalah masa untuk berseronok penunjuk. 997 01:02:45,030 --> 01:02:50,080 [Binky] Apa itu? Belajar mengenai petunjuk? Oh, gula-gula! 998 01:02:50,080 --> 01:02:53,700 [Pembesar suara lelaki] Nah, untuk memulakan, saya rasa kita akan memerlukan petunjuk pasangan. 999 01:02:53,700 --> 01:02:57,890 >> [Binky] Okay. Kod ini memperuntukkan 2 petunjuk yang boleh menunjukkan kepada integer. 1000 01:02:57,890 --> 01:03:02,220 [Penceramah lelaki] Okay. Well, saya melihat 2 petunjuk, tetapi mereka seolah-olah tidak akan menunjuk kepada apa-apa. 1001 01:03:02,220 --> 01:03:05,550 [Binky] Itu betul. Pada mulanya, petunjuk tidak menunjukkan apa-apa. 1002 01:03:05,550 --> 01:03:09,270 Perkara-perkara yang mereka menunjukkan dipanggil pointees, dan menetapkan mereka sehingga adalah satu langkah yang berasingan. 1003 01:03:09,270 --> 01:03:12,330 [Pembesar suara lelaki] Oh, betul, betul. Saya tahu bahawa. The pointees berasingan. 1004 01:03:12,330 --> 01:03:15,630 Er, jadi bagaimana anda memperuntukkan pointee? 1005 01:03:15,630 --> 01:03:21,510 [Binky] Okay. Kod ini memperuntukkan pointee integer baru, dan bahagian ini menetapkan x untuk menunjukkan ia. 1006 01:03:21,510 --> 01:03:23,500 [Penceramah lelaki] Hei, yang kelihatan lebih baik. 1007 01:03:23,500 --> 01:03:26,030 Jadi membuat ia melakukan sesuatu. >> [Binky] Okay. 1008 01:03:26,030 --> 01:03:30,300 Saya akan dereference x penunjuk untuk menyimpan nombor 42 ke pointee. 1009 01:03:30,300 --> 01:03:34,410 Untuk silap mata ini, saya akan memerlukan tongkat sakti saya dereferencing. 1010 01:03:34,410 --> 01:03:38,610 [Penceramah lelaki] tongkat sakti anda dereferencing? Itu yang besar. 1011 01:03:38,610 --> 01:03:44,230 [Binky] Ini adalah apa yang kelihatan seperti kod. Saya hanya akan menubuhkan nombor dan ... [Pop bunyi] 1012 01:03:44,230 --> 01:03:46,100 [Penceramah lelaki] Hey melihat, ada ia pergi. 1013 01:03:46,100 --> 01:03:50,990 Jadi melakukan satu dereference pada x mengikuti anak panah untuk mengakses pointee itu, 1014 01:03:50,990 --> 01:03:53,230 dalam kes ini untuk menyimpan 42 di sana. 1015 01:03:53,230 --> 01:03:57,630 Hei, cuba menggunakan ia untuk menyimpan nombor 13 melalui penunjuk lain, y. 1016 01:03:57,630 --> 01:04:03,250 [Binky] Okay. Saya hanya akan pergi ke sini untuk y dan mendapatkan nombor 13 menubuhkan 1017 01:04:03,250 --> 01:04:08,360 dan kemudian mengambil tongkat dereferencing dan hanya ... [Bunyi dengung] Wah! 1018 01:04:08,360 --> 01:04:10,980 [Penceramah lelaki] Oh hey, yang tidak bekerja. 1019 01:04:10,980 --> 01:04:14,870 >> Katakanlah, Binky, saya tidak fikir dereferencing y adalah idea yang baik 1020 01:04:14,870 --> 01:04:17,880 kerana menubuhkan pointee adalah satu langkah yang berasingan 1021 01:04:17,880 --> 01:04:19,850 dan saya tidak fikir 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 [Penceramah lelaki] Yeah. Kami memperuntukkan y penunjuk tetapi kita tidak pernah menetapkan ia untuk menunjukkan pointee satu. 1024 01:04:26,640 --> 01:04:28,780 [Binky] Hmm, sangat taat. 1025 01:04:28,780 --> 01:04:30,690 [Pembesar suara lelaki] Hei, anda mencari yang baik di sana, Binky. 1026 01:04:30,690 --> 01:04:34,160 Anda boleh menetapkan ia supaya mata y kepada pointee sama seperti x? >> [Binky] Pasti. 1027 01:04:34,160 --> 01:04:37,100 Saya akan menggunakan tongkat sakti saya tugasan penunjuk. 1028 01:04:37,100 --> 01:04:39,070 [Pembesar suara lelaki] Adakah yang akan menjadi masalah seperti sebelum ini? 1029 01:04:39,070 --> 01:04:40,840 [Binky] Tidak, ini tidak menyentuh pointees. 1030 01:04:40,840 --> 01:04:44,780 Ia hanya perubahan satu penunjuk untuk menunjukkan perkara yang sama seperti lain. [Pop bunyi] 1031 01:04:44,780 --> 01:04:48,570 [Penceramah lelaki] Oh, saya lihat. Sekarang y mata ke tempat yang sama sebagai x. 1032 01:04:48,570 --> 01:04:51,140 Jadi tunggu. Sekarang y ditetapkan. Ia mempunyai pointee. 1033 01:04:51,140 --> 01:04:54,520 Jadi, anda boleh cuba tongkat dereferencing sekali lagi untuk menghantar lebih 13. 1034 01:04:54,520 --> 01:04:58,130 [Binky] Eh, okay. Sini pergi. [Pop bunyi] 1035 01:04:58,130 --> 01:05:01,250 [Penceramah lelaki] Hei, melihat bahawa. Sekarang dereferencing kerja pada y. 1036 01:05:01,250 --> 01:05:05,200 Dan kerana penunjuk berkongsi bahawa salah pointee, kedua-dua mereka melihat 13. 1037 01:05:05,200 --> 01:05:06,910 [Binky] Yeah, perkongsian. Apa sahaja. 1038 01:05:06,910 --> 01:05:08,880 >> Jadi, kita akan pergi untuk menukar tempat sekarang? 1039 01:05:08,880 --> 01:05:11,420 [Penceramah lelaki] Oh melihat, kita berada di luar masa. >> [Binky] Tetapi - 1040 01:05:11,420 --> 01:05:13,880 [Penceramah lelaki] Hanya ingat 3 peraturan penunjuk. 1041 01:05:13,880 --> 01:05:18,630 Nombor 1, struktur asas adalah bahawa anda mempunyai penunjuk dan ia menunjuk ke pointee satu. 1042 01:05:18,630 --> 01:05:23,120 Tetapi penunjuk dan pointee adalah berasingan, dan kesilapan biasa adalah untuk menubuhkan penunjuk 1043 01:05:23,120 --> 01:05:25,680 tetapi lupa untuk memberikan pointee. 1044 01:05:25,680 --> 01:05:29,580 Nombor 2, dereferencing pointer bermula pada penunjuk dan mengikuti anak panah ke atas 1045 01:05:29,580 --> 01:05:31,060 untuk mengakses pointee. 1046 01:05:31,060 --> 01:05:34,340 Seperti yang kita semua tahu, ini hanya berfungsi jika terdapat pointee, 1047 01:05:34,340 --> 01:05:36,460 yang jenis mendapat kembali untuk memerintah nombor 1. 1048 01:05:36,460 --> 01:05:39,870 Nombor 3, tugasan penunjuk mengambil satu penunjuk dan perubahan 1049 01:05:39,870 --> 01:05:42,390 untuk menunjukkan pointee sama seperti penunjuk lain. 1050 01:05:42,390 --> 01:05:45,890 Jadi selepas tugasan, 2 penunjuk akan menunjukkan kepada pointee yang sama. 1051 01:05:45,890 --> 01:05:47,800 Kadang-kadang yang dipanggil perkongsian. 1052 01:05:47,800 --> 01:05:50,910 >> Dan itu semua ada ia benar-benar. Selamat tinggal sekarang. 1053 01:05:50,910 --> 01:05:55,840 Ini adalah Binky. Ini adalah CS50. Kami akan melihat anda minggu depan. [Tepukan] 1054 01:05:55,840 --> 01:05:59,000 >> [CS50.TV]