1 00:00:00,000 --> 00:00:11,320 2 00:00:11,320 --> 00:00:13,260 >> DAVID Malan: Halo, dan selamat datang kembali ke CS50. 3 00:00:13,260 --> 00:00:14,860 Jadi ini adalah akhir minggu keempat. 4 00:00:14,860 --> 00:00:16,680 Hanya satu pengumuman pertama. 5 00:00:16,680 --> 00:00:19,600 Jadi yang disebut kelima hari Senin datang hari Senin mendatang. 6 00:00:19,600 --> 00:00:22,800 Ini adalah kesempatan untuk mengubah dari SAT / UNSAT ke nilai-huruf, atau dari 7 00:00:22,800 --> 00:00:24,130 Surat kelas SAT / UNSAT. 8 00:00:24,130 --> 00:00:27,130 Mengganggu, proses yang tidak memerlukan tanda tangan, karena Anda harus mengisi 9 00:00:27,130 --> 00:00:28,770 out salah satu add / drop bentuk pink. 10 00:00:28,770 --> 00:00:31,680 >> Karena secara teknis, SAT / UNSAT dan versi nilai-huruf 11 00:00:31,680 --> 00:00:33,320 memiliki nomor katalog yang berbeda. 12 00:00:33,320 --> 00:00:34,240 Tapi tidak ada masalah besar. 13 00:00:34,240 --> 00:00:36,620 Datang saja ke saya atau Rob atau Lauren pada titik apapun. 14 00:00:36,620 --> 00:00:39,550 Atau email kami jika Anda tidak memiliki jenis yang dari dokumen yang Anda butuhkan saat ini, dan kami 15 00:00:39,550 --> 00:00:43,410 pasti akan membantu Anda mengambil mengurus sebelum hari Senin. 16 00:00:43,410 --> 00:00:45,780 >> Baiklah, jadi hari ini - 17 00:00:45,780 --> 00:00:47,630 sebenarnya, ada sedikit gema. 18 00:00:47,630 --> 00:00:51,070 Bisakah kita nada saya turun sedikit? 19 00:00:51,070 --> 00:00:51,730 OK. 20 00:00:51,730 --> 00:00:54,850 Jadi hari ini, kami memperkenalkan topik dikenal sebagai pointer. 21 00:00:54,850 --> 00:00:57,770 Dan aku akan mengakui bahwa ini adalah salah satu topik yang lebih kompleks yang kita cenderung 22 00:00:57,770 --> 00:01:00,960 menutupi di kelas ini, atau benar-benar pengantar saja yang menggunakan C. 23 00:01:00,960 --> 00:01:05,510 >> Tetapi mengambil kata saya untuk itu, terutama jika pikiran Anda merasa sedikit lebih membungkuk 24 00:01:05,510 --> 00:01:07,100 hari ini dan di minggu-minggu mendatang. 25 00:01:07,100 --> 00:01:10,340 Ini tidak mewakili Anda mendapatkan lebih buruk ini itu hanya berarti bahwa 26 00:01:10,340 --> 00:01:13,360 itu adalah topik yang sangat canggih bahwa saya berjanji, beberapa minggu 27 00:01:13,360 --> 00:01:17,610 maka, akan tampak terlalu mencolok langsung dalam retrospeksi. 28 00:01:17,610 --> 00:01:18,720 >> Saya masih ingat sampai hari ini. 29 00:01:18,720 --> 00:01:22,190 Aku sedang duduk di Elliott Dining Hall, duduk di samping saya TF Nishat Mehta, 30 00:01:22,190 --> 00:01:24,070 yang merupakan penduduk dari Elliott rumah. 31 00:01:24,070 --> 00:01:26,340 Dan untuk beberapa alasan, ini topik hanya mengklik. 32 00:01:26,340 --> 00:01:29,430 Yang mengatakan bahwa saya juga berjuang dengan itu untuk beberapa jumlah waktu, tapi aku 33 00:01:29,430 --> 00:01:33,610 akan melakukan yang terbaik untuk membantu menghindari seperti berjuang dengan topik yang pada akhirnya 34 00:01:33,610 --> 00:01:34,580 cukup kuat. 35 00:01:34,580 --> 00:01:37,350 >> Bahkan, salah satu topik kita akan membahas dalam minggu-minggu yang akan datang adalah bahwa 36 00:01:37,350 --> 00:01:41,130 keamanan, dan bagaimana Anda dapat benar-benar mengeksploitasi mesin dengan cara 37 00:01:41,130 --> 00:01:42,320 yang tidak dimaksudkan. 38 00:01:42,320 --> 00:01:45,850 Dan orang-eksploitasi biasanya hasil dari bug, kesalahan yang kita 39 00:01:45,850 --> 00:01:49,740 orang membuat dengan tidak memahami beberapa dari pelaksanaan yang mendasari 40 00:01:49,740 --> 00:01:52,250 rincian melalui program mana yang dibuat. 41 00:01:52,250 --> 00:01:55,410 >> Sekarang untuk membuat ini tampak semua lebih user ramah, saya pikir saya akan memainkan 10 42 00:01:55,410 --> 00:01:59,680 pratinjau kedua dari claymation kecil tokoh bernama Binky yang dibawa ke 43 00:01:59,680 --> 00:02:03,020 hidup dengan seorang teman kami di Stanford, Profesor Nick Parlante. 44 00:02:03,020 --> 00:02:06,753 Jadi izinkan saya untuk memberikan ini teaser dari Binky sini. 45 00:02:06,753 --> 00:02:09,520 >> [VIDEO PEMUTARAN] 46 00:02:09,520 --> 00:02:10,380 >> -Hei, Binky. 47 00:02:10,380 --> 00:02:11,050 Bangun. 48 00:02:11,050 --> 00:02:13,610 Sudah waktunya untuk pointer menyenangkan. 49 00:02:13,610 --> 00:02:14,741 >> -Apa itu? 50 00:02:14,741 --> 00:02:16,440 Pelajari tentang pointer? 51 00:02:16,440 --> 00:02:17,928 Oh, goodie. 52 00:02:17,928 --> 00:02:18,920 >> [END VIDEO PEMUTARAN] 53 00:02:18,920 --> 00:02:20,670 >> DAVID Malan: Itulah Stanford ilmu komputer. 54 00:02:20,670 --> 00:02:23,194 Jadi lebih pada datang. 55 00:02:23,194 --> 00:02:24,930 >> [Tepuk Tangan] 56 00:02:24,930 --> 00:02:26,660 >> DAVID Malan: Maaf, Nick. 57 00:02:26,660 --> 00:02:30,680 >> Jadi ingat bahwa terakhir kali kami berakhir pada cliffhanger ini benar-benar menarik 58 00:02:30,680 --> 00:02:32,960 dimana fungsi ini hanya tidak bekerja. 59 00:02:32,960 --> 00:02:34,960 Setidaknya intuitif, rasanya seperti itu harus bekerja. 60 00:02:34,960 --> 00:02:37,600 Cukup swapping nilai-nilai dari dua bilangan bulat. 61 00:02:37,600 --> 00:02:40,915 Tapi ingat bahwa ketika kita dicetak nilai-nilai asli dalam utama, satu dan 62 00:02:40,915 --> 00:02:44,210 dua, mereka masih satu dan dua dan bukan dua dan satu. 63 00:02:44,210 --> 00:02:46,070 >> Jadi biarkan aku benar-benar beralih ke alat. 64 00:02:46,070 --> 00:02:50,180 Dan Aku menulis sedikit kode tulang pada memajukan sini, di mana saya menyatakan bahwa x 65 00:02:50,180 --> 00:02:52,500 akan menjadi 1, y akan 2. 66 00:02:52,500 --> 00:02:54,810 Saya kemudian mencetak kedua mereka nilai-nilai dengan cetak f. 67 00:02:54,810 --> 00:02:57,540 >> Saya kemudian mengklaim di sini bahwa kita akan swap mereka. 68 00:02:57,540 --> 00:03:00,800 Aku meninggalkan tempat kosong di sini bagi kita untuk mengisi hari hanya dalam beberapa saat. 69 00:03:00,800 --> 00:03:03,380 Kemudian, aku akan mengklaim bahwa dua variabel telah bertukar. 70 00:03:03,380 --> 00:03:04,770 Lalu aku akan mencetak mereka keluar lagi. 71 00:03:04,770 --> 00:03:07,090 Dan mudah-mudahan, saya akan melihat 1, 2. 72 00:03:07,090 --> 00:03:07,380 2, 1. 73 00:03:07,380 --> 00:03:09,830 Itulah super sederhana Tujuannya sekarang. 74 00:03:09,830 --> 00:03:12,430 >> Jadi bagaimana kita pergi tentang swapping dua variabel? 75 00:03:12,430 --> 00:03:17,220 Nah kalau saya mengusulkan di sini bahwa cangkir ini mungkin mewakili memori dalam komputer. 76 00:03:17,220 --> 00:03:19,070 Ini adalah beberapa gigitan, ini lain adalah beberapa gigitan. 77 00:03:19,070 --> 00:03:23,260 Bisakah kita relawan datang dan campuran kami beberapa minuman, jika familiar? 78 00:03:23,260 --> 00:03:23,920 Ayo up. 79 00:03:23,920 --> 00:03:24,815 Siapa nama Anda? 80 00:03:24,815 --> 00:03:25,260 >> JESS: Jess. 81 00:03:25,260 --> 00:03:25,690 >> DAVID Malan: Jess? 82 00:03:25,690 --> 00:03:26,540 Ayo up, Jess. 83 00:03:26,540 --> 00:03:29,180 Jika Anda tidak keberatan, kita harus menempatkan Google Kaca pada Anda sehingga kami dapat 84 00:03:29,180 --> 00:03:30,430 mengabadikan ini. 85 00:03:30,430 --> 00:03:32,800 86 00:03:32,800 --> 00:03:34,670 OK, kaca. 87 00:03:34,670 --> 00:03:37,250 Merekam video. 88 00:03:37,250 --> 00:03:43,103 Dan OK, kita baik untuk pergi dengan Jess di sini. 89 00:03:43,103 --> 00:03:43,810 Baik. 90 00:03:43,810 --> 00:03:45,120 Senang bertemu Anda. 91 00:03:45,120 --> 00:03:47,720 >> Jadi apa yang saya ingin Anda lakukan di sini - jika Anda bisa, cukup cepat - 92 00:03:47,720 --> 00:03:51,040 hanya menuangkan kita setengah gelas jeruk jus dan setengah gelas susu, 93 00:03:51,040 --> 00:03:55,710 mewakili secara efektif angka 1 dalam satu cangkir dan 2 di Piala lain. 94 00:03:55,710 --> 00:04:01,380 95 00:04:01,380 --> 00:04:02,630 >> Hal ini akan menjadi rekaman yang baik. 96 00:04:02,630 --> 00:04:04,910 97 00:04:04,910 --> 00:04:05,860 >> JESS: Maaf. 98 00:04:05,860 --> 00:04:06,330 >> DAVID Malan: Tidak, tidak. 99 00:04:06,330 --> 00:04:08,703 Tidak apa-apa. 100 00:04:08,703 --> 00:04:10,120 Nice. 101 00:04:10,120 --> 00:04:12,950 Baiklah, jadi kami memiliki empat byte senilai jus jeruk. 102 00:04:12,950 --> 00:04:14,460 Kita akan menyebutnya nilai 1. 103 00:04:14,460 --> 00:04:16,579 Sekarang empat byte senilai susu. 104 00:04:16,579 --> 00:04:18,519 Akan menyebutnya nilai 2. 105 00:04:18,519 --> 00:04:20,440 Jadi x dan y masing-masing. 106 00:04:20,440 --> 00:04:23,450 >> Baiklah, jadi sekarang jika tugas di tangan - untukmu, Jess, di depan semua 107 00:04:23,450 --> 00:04:24,270 teman sekelas Anda - 108 00:04:24,270 --> 00:04:28,510 adalah untuk menukar nilai-nilai x dan y seperti bahwa kita ingin jus jeruk dalam 109 00:04:28,510 --> 00:04:32,070 cangkir lain dan susu dalam cangkir ini, bagaimana mungkin Anda - sebelum Anda benar-benar melakukan 110 00:04:32,070 --> 00:04:34,020 - pergi tentang melakukan ini? 111 00:04:34,020 --> 00:04:35,220 >> OK, bijaksana keputusan. 112 00:04:35,220 --> 00:04:36,340 Jadi, Anda perlu sedikit lebih banyak memori. 113 00:04:36,340 --> 00:04:38,190 Jadi mari kita mengalokasikan sementara cangkir, jika Anda mau. 114 00:04:38,190 --> 00:04:40,540 Dan sekarang melanjutkan untuk swap x dan y. 115 00:04:40,540 --> 00:04:52,950 116 00:04:52,950 --> 00:04:53,530 >> Luar biasa. 117 00:04:53,530 --> 00:04:54,420 Jadi sangat baik dilakukan. 118 00:04:54,420 --> 00:04:55,670 Terima kasih banyak, Jess. 119 00:04:55,670 --> 00:04:59,520 120 00:04:59,520 --> 00:05:00,020 Ini. 121 00:05:00,020 --> 00:05:01,950 Sebuah suvenir kecil. 122 00:05:01,950 --> 00:05:04,350 >> OK, jadi jelas, ide super sederhana. 123 00:05:04,350 --> 00:05:07,500 Benar-benar intuitif bahwa kita perlu sedikit lebih banyak ruang penyimpanan - dalam bentuk ini, 124 00:05:07,500 --> 00:05:09,750 cangkir - jika kita benar-benar ingin menukar kedua variabel. 125 00:05:09,750 --> 00:05:11,110 Jadi mari kita melakukan hal itu. 126 00:05:11,110 --> 00:05:14,330 Sampai di sini, di antara di mana saya mengklaim saya akan melakukan beberapa swapping, aku akan 127 00:05:14,330 --> 00:05:15,720 pergi ke depan dan menyatakan temp. 128 00:05:15,720 --> 00:05:17,980 Dan aku akan mengatur itu sama dengan, katakanlah, x. 129 00:05:17,980 --> 00:05:21,110 >> Lalu aku akan mengubah nilai x seperti Jess lakukan di sini dengan 130 00:05:21,110 --> 00:05:23,200 susu dan jus jeruk untuk menjadi sama dengan y. 131 00:05:23,200 --> 00:05:27,460 Dan aku akan mengubah y harus sama untuk tidak x, karena sekarang kita akan 132 00:05:27,460 --> 00:05:29,530 terjebak dalam lingkaran, melainkan temp. 133 00:05:29,530 --> 00:05:33,170 Dimana saya sementara - atau di mana Jess sementara menempatkan jus jeruk 134 00:05:33,170 --> 00:05:35,460 sebelum clobbering bahwa cangkir dengan susu. 135 00:05:35,460 --> 00:05:37,250 >> Jadi biarkan aku pergi ke depan sekarang dan membuat ini. 136 00:05:37,250 --> 00:05:39,210 Ini disebut noswap.c. 137 00:05:39,210 --> 00:05:41,190 Dan sekarang biarkan aku jalankan tanpa swap. 138 00:05:41,190 --> 00:05:43,910 Dan memang saya melihat, jika saya memperluas jendela sedikit, yang 139 00:05:43,910 --> 00:05:45,160 x 1, y adalah 2. 140 00:05:45,160 --> 00:05:47,230 Dan kemudian x adalah 2, y adalah 1. 141 00:05:47,230 --> 00:05:51,910 >> Tapi ingat bahwa pada hari Senin kita melakukan hal-hal sedikit berbeda dimana saya 142 00:05:51,910 --> 00:05:56,760 bukannya menerapkan fungsi pembantu, jika Anda mau, itu benar-benar batal. 143 00:05:56,760 --> 00:05:58,010 Aku menyebutnya bertukar. 144 00:05:58,010 --> 00:06:01,600 Saya memberikan dua parameter, dan aku menelepon mereka dan aku memanggil mereka b. 145 00:06:01,600 --> 00:06:04,380 >> Terus terang, aku bisa menelepon mereka x dan y. 146 00:06:04,380 --> 00:06:06,040 Tidak ada yang menghentikan saya dari melakukan hal itu. 147 00:06:06,040 --> 00:06:08,140 Tapi saya berpendapat itu kemudian sedikit ambigu. 148 00:06:08,140 --> 00:06:11,910 Karena ingat untuk hari Senin bahwa kita mengklaim bahwa parameter ini adalah 149 00:06:11,910 --> 00:06:13,650 salinan dari nilai-nilai lulus masuk 150 00:06:13,650 --> 00:06:15,640 Jadi itu hanya messes dengan Anda pikiran, saya berpikir, jika Anda menggunakan 151 00:06:15,640 --> 00:06:17,370 persis variabel yang sama. 152 00:06:17,370 --> 00:06:20,150 >> Jadi saya bukannya akan menelepon mereka dan b, hanya untuk kejelasan. 153 00:06:20,150 --> 00:06:21,840 Tapi kita bisa menyebut mereka yang paling apa pun yang kita inginkan. 154 00:06:21,840 --> 00:06:26,280 Dan aku akan copy dan paste efektif kode ini dari atas sana 155 00:06:26,280 --> 00:06:27,170 turun ke sini. 156 00:06:27,170 --> 00:06:29,110 Karena saya hanya melihat bahwa ia bekerja. 157 00:06:29,110 --> 00:06:30,790 Sehingga dalam kondisi yang cukup baik. 158 00:06:30,790 --> 00:06:37,390 Dan aku akan mengubah x ke, saya x ke, y saya untuk b dan y saya untuk b. 159 00:06:37,390 --> 00:06:39,130 >> Jadi dengan kata lain, logika yang sama persis. 160 00:06:39,130 --> 00:06:40,850 Hal yang sama persis yang Jess lakukan. 161 00:06:40,850 --> 00:06:44,350 Dan kemudian satu hal yang saya harus melakukan up sini, tentu saja, sekarang ini memanggil 162 00:06:44,350 --> 00:06:45,990 fungsi, atau memanggil fungsi ini. 163 00:06:45,990 --> 00:06:50,430 Jadi saya akan memanggil fungsi ini dengan dua input, x dan y, dan tekan Simpan. 164 00:06:50,430 --> 00:06:52,300 >> Baiklah, begitu mendasar hal yang sama. 165 00:06:52,300 --> 00:06:55,570 Bahkan, saya mungkin telah membuat program tidak perlu kompleks dengan 166 00:06:55,570 --> 00:07:00,820 menulis sebuah fungsi yang hanya mengambil sekitar enam baris kode sedangkan saya 167 00:07:00,820 --> 00:07:02,970 sebelumnya telah dilaksanakan ini hanya tiga. 168 00:07:02,970 --> 00:07:06,230 >> Jadi biarkan aku pergi ke depan sekarang dan remake ini, tidak membuat swap. 169 00:07:06,230 --> 00:07:07,920 Baiklah, aku mengacau di sini. 170 00:07:07,920 --> 00:07:11,290 Ini harus menjadi sebuah kesalahan yang Anda mungkin melihat semakin umum sebagai Anda 171 00:07:11,290 --> 00:07:12,380 program mendapatkan lebih kompleks. 172 00:07:12,380 --> 00:07:13,470 Tapi ada memperbaiki mudah. 173 00:07:13,470 --> 00:07:15,650 Mari saya gulir kembali ke sini. 174 00:07:15,650 --> 00:07:18,190 >> Dan apa kesalahan pertama yang saya lihat? 175 00:07:18,190 --> 00:07:19,520 Deklarasi implisit. 176 00:07:19,520 --> 00:07:21,466 Apa yang biasanya menunjukkan? 177 00:07:21,466 --> 00:07:22,830 Oh, aku lupa prototipe. 178 00:07:22,830 --> 00:07:26,900 Aku lupa untuk mengajarkan compiler bahwa pertukaran akan ada meskipun dia 179 00:07:26,900 --> 00:07:28,920 tidak ada di awal program. 180 00:07:28,920 --> 00:07:35,780 Jadi aku hanya akan mengatakan batal, swap, int, int b, titik koma. 181 00:07:35,780 --> 00:07:37,280 >> Jadi aku tidak akan reimplement itu. 182 00:07:37,280 --> 00:07:39,140 Tapi sekarang sesuai dengan apa yang di bawah sini. 183 00:07:39,140 --> 00:07:42,530 Dan perhatikan, tidak adanya titik koma di sini, yang tidak diperlukan bila 184 00:07:42,530 --> 00:07:43,200 pelaksana. 185 00:07:43,200 --> 00:07:46,010 >> Jadi biarkan aku remake ini, tidak membuat swap. 186 00:07:46,010 --> 00:07:46,910 Bentuk yang jauh lebih baik. 187 00:07:46,910 --> 00:07:48,130 Jalankan tanpa swap. 188 00:07:48,130 --> 00:07:48,740 Dan sialan. 189 00:07:48,740 --> 00:07:51,650 Sekarang kita kembali ke tempat kita berada pada hari Senin, di mana hal itu tidak bertukar. 190 00:07:51,650 --> 00:07:55,410 >> Dan apa penjelasan intuitif mengapa hal ini terjadi? 191 00:07:55,410 --> 00:07:56,380 Ya? 192 00:07:56,380 --> 00:07:57,630 >> SISWA: [Tak terdengar]. 193 00:07:57,630 --> 00:08:04,140 194 00:08:04,140 --> 00:08:05,230 >> DAVID Malan: Tepat. 195 00:08:05,230 --> 00:08:07,330 Jadi a dan b adalah salinan dari x dan y. 196 00:08:07,330 --> 00:08:10,680 Dan pada kenyataannya, setiap kali Anda sudah memanggil fungsi sejauh yang 197 00:08:10,680 --> 00:08:12,540 melewati variabel seperti int - 198 00:08:12,540 --> 00:08:14,470 seperti swap mengharapkan di sini - 199 00:08:14,470 --> 00:08:16,270 kalian telah lewat di salinan. 200 00:08:16,270 --> 00:08:19,150 >> Sekarang berarti dibutuhkan sedikit waktu, sepersekian detik, untuk 201 00:08:19,150 --> 00:08:23,270 komputer untuk menyalin bit dari satu variabel ke dalam potongan-potongan yang lain. 202 00:08:23,270 --> 00:08:24,610 Tapi itu bukan masalah besar. 203 00:08:24,610 --> 00:08:25,920 Tapi mereka tetap salinan. 204 00:08:25,920 --> 00:08:30,020 >> Dan sekarang, dalam konteks swap, Saya malahan berhasil 205 00:08:30,020 --> 00:08:31,180 mengubah dan b. 206 00:08:31,180 --> 00:08:33,000 Bahkan, mari kita lakukan cepat kewarasan cek. 207 00:08:33,000 --> 00:08:36,830 Cetak f adalah% i, baris baru. 208 00:08:36,830 --> 00:08:38,770 Dan mari kita pasang di. 209 00:08:38,770 --> 00:08:41,830 Sekarang mari kita lakukan hal yang sama dengan b. 210 00:08:41,830 --> 00:08:43,640 Dan mari kita lakukan hal yang sama di sini. 211 00:08:43,640 --> 00:08:47,260 >> Dan sekarang, biarkan aku salin baris yang sama lagi di bawah fungsi 212 00:08:47,260 --> 00:08:51,250 setelah tiga baris saya menarik bisa dieksekusi, dan 213 00:08:51,250 --> 00:08:53,270 mencetak dan b lagi. 214 00:08:53,270 --> 00:08:56,030 Jadi sekarang mari kita buat ini, tidak membuat swap. 215 00:08:56,030 --> 00:08:58,430 Mari saya membuat jendela terminal sedikit lebih tinggi, sehingga kita bisa melihat 216 00:08:58,430 --> 00:08:59,520 lebih dari itu sekaligus. 217 00:08:59,520 --> 00:09:00,860 >> Dan menjalankan tanpa swap. 218 00:09:00,860 --> 00:09:04,000 x 1, y adalah 2. adalah 1, b 2. 219 00:09:04,000 --> 00:09:06,070 Dan kemudian, adalah 2, b adalah 1. 220 00:09:06,070 --> 00:09:09,390 Jadi itu bekerja, seperti Jess lakukan di sini dalam swap. 221 00:09:09,390 --> 00:09:13,090 Tapi tentu saja, itu tidak berpengaruh pada variabel utama. 222 00:09:13,090 --> 00:09:15,360 >> Jadi kami melihat trik dimana kita bisa memperbaiki ini, kan? 223 00:09:15,360 --> 00:09:19,560 Ketika Anda dihadapkan dengan scoping ini masalah, Anda hanya bisa menyepak bola dan membuat x 224 00:09:19,560 --> 00:09:22,400 dan y jenis variabel, bukan? 225 00:09:22,400 --> 00:09:23,390 >> Anda bisa membuat mereka global. 226 00:09:23,390 --> 00:09:27,560 Menempatkan mereka di bagian paling atas file seperti yang kita lakukan, bahkan dalam permainan 15. 227 00:09:27,560 --> 00:09:28,890 Kami menggunakan variabel global. 228 00:09:28,890 --> 00:09:32,420 Namun dalam konteks permainan 15, itu masuk akal untuk memiliki global 229 00:09:32,420 --> 00:09:37,170 variabel yang mewakili dewan, karena keseluruhan 15.c adalah semua 230 00:09:37,170 --> 00:09:38,650 tentang pelaksanaan pertandingan itu. 231 00:09:38,650 --> 00:09:41,470 Itulah yang ada file yang dapat dilakukan. 232 00:09:41,470 --> 00:09:44,170 >> Tapi dalam kasus ini di sini, aku memanggil fungsi swap. 233 00:09:44,170 --> 00:09:45,380 Saya ingin menukar dua variabel. 234 00:09:45,380 --> 00:09:48,950 Dan itu harus mulai merasa hanya ceroboh jika solusi untuk semua kami 235 00:09:48,950 --> 00:09:51,300 masalah ketika kita mengalami lingkup masalah adalah membuatnya global. 236 00:09:51,300 --> 00:09:54,730 Karena sangat cepat program kami adalah akan menjadi cukup berantakan. 237 00:09:54,730 --> 00:09:57,760 Dan kami melakukan itu sangat hemat sebagai hasil di 15.c. 238 00:09:57,760 --> 00:10:00,470 >> Tapi ternyata ada cara yang lebih baik sama sekali. 239 00:10:00,470 --> 00:10:05,600 Biarkan aku benar-benar kembali dan menghapus mencetak f, hanya untuk menyederhanakan kode ini. 240 00:10:05,600 --> 00:10:09,160 Dan biarkan aku mengusulkan bahwa ini memang buruk. 241 00:10:09,160 --> 00:10:15,990 Tapi kalau aku malah menambahkan beberapa tanda bintang dan bintang-bintang, aku malah dapat mengubah ini 242 00:10:15,990 --> 00:10:18,670 fungsi menjadi satu yang sebenarnya operasional. 243 00:10:18,670 --> 00:10:25,020 >> Jadi biarkan aku kembali ke sini dan mengakui mengatakan tanda bintang selalu sulit, 244 00:10:25,020 --> 00:10:26,170 jadi saya akan katakan. 245 00:10:26,170 --> 00:10:27,660 Aku akan mengaku untuk yang satu. 246 00:10:27,660 --> 00:10:28,190 Baik. 247 00:10:28,190 --> 00:10:30,190 Dan sekarang, apa yang akan saya yang bisa dilakukan? 248 00:10:30,190 --> 00:10:34,130 >> Jadi pertama-tama, aku akan menentukan bahwa bukan lewat sebuah int ke 249 00:10:34,130 --> 00:10:37,980 fungsi swap, aku bukan pergi untuk mengatakan bintang int. 250 00:10:37,980 --> 00:10:39,170 Sekarang, apakah bintang menunjukkan? 251 00:10:39,170 --> 00:10:41,970 Ini adalah gagasan pointer yang Binky, karakter claymation, adalah 252 00:10:41,970 --> 00:10:43,465 mengacu pada beberapa saat yang lalu. 253 00:10:43,465 --> 00:10:47,610 >> Jadi jika kita katakan int bintang, makna sekarang ini adalah bahwa tidak akan 254 00:10:47,610 --> 00:10:49,110 disahkan pada oleh nilainya. 255 00:10:49,110 --> 00:10:50,350 Ini tidak akan disalin masuk 256 00:10:50,350 --> 00:10:54,700 Sebaliknya, alamat adalah akan lulus masuk 257 00:10:54,700 --> 00:10:57,840 >> Jadi ingat bahwa dalam komputer Anda adalah sejumlah besar memori, jika 258 00:10:57,840 --> 00:10:58,760 dikenal sebagai RAM. 259 00:10:58,760 --> 00:11:00,520 Dan RAM yang hanya Seluruh sekelompok byte. 260 00:11:00,520 --> 00:11:03,320 Jadi jika Mac atau PC Anda memiliki dua gigabyte, Anda memiliki 2 261 00:11:03,320 --> 00:11:05,760 miliar byte memori. 262 00:11:05,760 --> 00:11:08,440 >> Sekarang mari kita hanya menganggap bahwa hanya untuk menjaga hal-hal baik dan tertib, kami 263 00:11:08,440 --> 00:11:09,450 menetapkan alamat - 264 00:11:09,450 --> 00:11:10,170 nomor - 265 00:11:10,170 --> 00:11:12,270 setiap byte RAM di komputer Anda. 266 00:11:12,270 --> 00:11:15,410 Byte pertama dari orang-2 miliar adalah dengan angka nol. 267 00:11:15,410 --> 00:11:18,572 Yang berikutnya adalah nomor satu byte, nomor dua, semua jalan ke atas, dot dot 268 00:11:18,572 --> 00:11:20,530 dot, kira-kira 2 miliar. 269 00:11:20,530 --> 00:11:23,640 >> Sehingga Anda dapat jumlah byte memori dalam komputer Anda. 270 00:11:23,640 --> 00:11:26,460 Jadi mari kita asumsikan bahwa itulah yang kita maksud dengan alamat. 271 00:11:26,460 --> 00:11:31,360 Jadi, ketika saya melihat int bintang, apa yang terjadi untuk diteruskan ke Swap sekarang adalah 272 00:11:31,360 --> 00:11:32,830 alamat dari. 273 00:11:32,830 --> 00:11:37,150 Tidak nilainya, tapi apa pun pos nya alamat, sehingga untuk berbicara - 274 00:11:37,150 --> 00:11:38,810 lokasinya di RAM. 275 00:11:38,810 --> 00:11:41,250 >> Dan juga untuk b, aku akan untuk mengatakan hal yang sama. 276 00:11:41,250 --> 00:11:42,720 Int, bintang, b. 277 00:11:42,720 --> 00:11:46,350 Sebagai samping, secara teknis bintangnya bisa di lokasi lain. 278 00:11:46,350 --> 00:11:50,140 Tapi kita akan standarisasi pada bintang yang tepat di sebelah tipe data. 279 00:11:50,140 --> 00:11:54,080 >> Jadi bertukar tanda tangan sekarang berarti, memberi saya alamat int, dan panggilan 280 00:11:54,080 --> 00:11:55,400 alamat a. 281 00:11:55,400 --> 00:11:58,690 Dan memberi saya alamat lain dari int dan memanggil alamat b. 282 00:11:58,690 --> 00:12:01,120 >> Tapi sekarang kode saya di sini harus berubah. 283 00:12:01,120 --> 00:12:03,470 Karena jika saya menyatakan int suhu - 284 00:12:03,470 --> 00:12:05,580 yang masih bertipe int - 285 00:12:05,580 --> 00:12:08,700 tapi saya simpan di dalamnya, apa nilai? 286 00:12:08,700 --> 00:12:12,870 Untuk menjadi jelas, saya menempatkan dengan kode seperti ditulis sekarang? 287 00:12:12,870 --> 00:12:14,360 >> Aku menempatkan lokasi di. 288 00:12:14,360 --> 00:12:16,500 Tapi aku tidak peduli tentang lokasi sekarang, kan? 289 00:12:16,500 --> 00:12:21,940 Temp ada hanya Jess 'cangkir ketiga ada, untuk tujuan apa? 290 00:12:21,940 --> 00:12:23,090 Untuk menyimpan nilai. 291 00:12:23,090 --> 00:12:24,830 Susu atau jus jeruk. 292 00:12:24,830 --> 00:12:28,520 Tidak benar-benar menyimpan alamat salah satu dari hal-hal, yang merasa 293 00:12:28,520 --> 00:12:31,200 sedikit tidak masuk akal dalam hal ini nyata konteks dunia pula. 294 00:12:31,200 --> 00:12:34,990 >> Jadi benar-benar, apa yang saya inginkan untuk dimasukkan ke dalam suhu bukan alamat, tetapi 295 00:12:34,990 --> 00:12:36,180 isi. 296 00:12:36,180 --> 00:12:41,930 Jadi jika a adalah bilangan seperti 123, ini adalah byte 123 memori yang hanya 297 00:12:41,930 --> 00:12:45,090 kebetulan menduduki, bahwa nilai dalam kebetulan menempati. 298 00:12:45,090 --> 00:12:49,040 >> Jika saya ingin pergi ke alamat tersebut, Saya perlu mengatakan bintang. 299 00:12:49,040 --> 00:12:52,610 Demikian pula, jika saya harus mengubah apa di alamat, saya mengubah 300 00:12:52,610 --> 00:12:53,570 ini untuk memulai. 301 00:12:53,570 --> 00:12:58,185 Jika saya ingin menyimpan dalam apa yang di lokasi dengan apa yang ada di lokasi 302 00:12:58,185 --> 00:13:02,180 di b, b bintang bintang. 303 00:13:02,180 --> 00:13:05,340 >> Jadi singkatnya, bahkan jika hal ini tidak cukup tenggelam dalam namun - dan saya tidak akan mengharapkan 304 00:13:05,340 --> 00:13:06,560 bahwa itu akan begitu cepat - 305 00:13:06,560 --> 00:13:11,100 menyadari bahwa semua yang saya lakukan adalah awalan ini bintang untuk variabel saya, 306 00:13:11,100 --> 00:13:13,350 Pepatah tidak ambil nilai. 307 00:13:13,350 --> 00:13:14,520 Jangan mengubah nilai. 308 00:13:14,520 --> 00:13:17,600 Melainkan, pergi ke alamat tersebut dan mendapatkan nilai. 309 00:13:17,600 --> 00:13:21,430 Pergi ke alamat dan perubahan nilai di sana. 310 00:13:21,430 --> 00:13:25,500 >> Jadi sekarang biarkan aku gulir kembali ke atas, hanya untuk memperbaiki baris ini di sini, untuk 311 00:13:25,500 --> 00:13:27,690 mengubah prototipe untuk mencocokkan. 312 00:13:27,690 --> 00:13:30,280 Tapi aku sekarang perlu untuk melakukan satu hal lainnya. 313 00:13:30,280 --> 00:13:35,500 Secara intuitif, jika saya telah mengubah jenis argumen yang swap mengharapkan, 314 00:13:35,500 --> 00:13:37,245 apa lagi yang harus saya perubahan dalam kode saya? 315 00:13:37,245 --> 00:13:39,750 316 00:13:39,750 --> 00:13:40,840 >> Ketika saya sebut swap. 317 00:13:40,840 --> 00:13:43,340 Karena sekarang, apa am Aku melewati untuk swap masih? 318 00:13:43,340 --> 00:13:47,450 Nilai x dan nilai y, atau susu dan jus jeruk. 319 00:13:47,450 --> 00:13:48,510 Tapi aku tidak ingin melakukan itu. 320 00:13:48,510 --> 00:13:51,060 Saya bukannya ingin lulus dalam apa? 321 00:13:51,060 --> 00:13:53,050 Lokasi x dan lokasi y. 322 00:13:53,050 --> 00:13:55,300 Apa alamat pos mereka, sehingga untuk berbicara. 323 00:13:55,300 --> 00:13:57,600 >> Jadi untuk melakukan itu, ada sebuah ampersand. 324 00:13:57,600 --> 00:13:59,260 Ampersand jenis terdengar seperti alamat. 325 00:13:59,260 --> 00:14:03,240 sehingga n, ampersand, alamat x, dan alamat y. 326 00:14:03,240 --> 00:14:06,790 Jadi disengaja yang kita gunakan ampersands saat memanggil fungsi tersebut, 327 00:14:06,790 --> 00:14:10,230 dan bintang-bintang ketika mendeklarasikan dan ketika menjalankan fungsinya. 328 00:14:10,230 --> 00:14:14,220 >> Dan hanya memikirkan ampersand sebagai alamat operator, dan bintang sebagai 329 00:14:14,220 --> 00:14:15,490 pergi ke sana Operator - 330 00:14:15,490 --> 00:14:18,640 atau, lebih benar, dereference operator. 331 00:14:18,640 --> 00:14:23,480 Jadi itulah seluruh banyak kata-kata hanya untuk mengatakan bahwa sekarang, mudah-mudahan, swap yang terjadi 332 00:14:23,480 --> 00:14:24,440 untuk menjadi benar. 333 00:14:24,440 --> 00:14:26,550 >> Biarkan aku pergi ke depan dan membuat - 334 00:14:26,550 --> 00:14:30,940 mari kita benar-benar mengubah nama file, jangan program ini masih bisa disebut tanpa swap. 335 00:14:30,940 --> 00:14:33,240 Saya menyatakan bahwa kita akan menyebutnya swap.c sekarang. 336 00:14:33,240 --> 00:14:35,670 Jadi membuat, swap. 337 00:14:35,670 --> 00:14:37,520 Dot, slash, swap. 338 00:14:37,520 --> 00:14:40,210 >> Dan sekarang memang, x 1, y adalah 2. 339 00:14:40,210 --> 00:14:44,040 Dan kemudian, x adalah 2, y adalah satu. 340 00:14:44,040 --> 00:14:46,500 Nah mari kita lihat apakah kita tidak bisa melakukan ini sedikit berbeda dengan apa yang 341 00:14:46,500 --> 00:14:47,180 terjadi di sini. 342 00:14:47,180 --> 00:14:51,250 Pertama, izinkan saya memperbesar kami menggambar layar di sini. 343 00:14:51,250 --> 00:14:54,160 Dan biarkan aku mengusulkan sejenak - dan setiap kali saya menarik di sini akan dicerminkan 344 00:14:54,160 --> 00:14:58,660 di sana sekarang - saya mengusulkan bahwa inilah sejumlah besar memori, atau 345 00:14:58,660 --> 00:15:00,540 RAM, dalam komputer saya. 346 00:15:00,540 --> 00:15:04,140 >> Dan ini akan menjadi nomor gigitan, katakanlah, 1. 347 00:15:04,140 --> 00:15:05,720 Ini akan menjadi byte nomor 2. 348 00:15:05,720 --> 00:15:08,220 Dan aku akan melakukan seluruh banyak lebih, dan kemudian sekelompok dot dot titik-titik untuk 349 00:15:08,220 --> 00:15:10,880 menunjukkan bahwa ada 2 miliar hal ini. 350 00:15:10,880 --> 00:15:13,520 4, 5, dan sebagainya. 351 00:15:13,520 --> 00:15:17,055 >> Jadi ada lima pertama byte memori komputer saya. 352 00:15:17,055 --> 00:15:17,560 Baiklah? 353 00:15:17,560 --> 00:15:19,060 Sangat sedikit dari 2 miliar. 354 00:15:19,060 --> 00:15:21,120 Tapi sekarang aku akan mengusulkan berikut. 355 00:15:21,120 --> 00:15:27,490 Aku akan mengusulkan bahwa x akan menyimpan nomor 1, dan y akan 356 00:15:27,490 --> 00:15:29,690 untuk menyimpan nomor 2. 357 00:15:29,690 --> 00:15:35,000 Dan biarkan aku pergi ke depan sekarang dan mewakili nilai-nilai ini sebagai berikut. 358 00:15:35,000 --> 00:15:41,510 >> Mari kita lakukan ini sebagai berikut. 359 00:15:41,510 --> 00:15:42,870 Beri aku hanya satu detik. 360 00:15:42,870 --> 00:15:44,150 Satu detik. 361 00:15:44,150 --> 00:15:45,680 OK. 362 00:15:45,680 --> 00:15:47,560 Saya ingin membuat ini sedikit - 363 00:15:47,560 --> 00:15:50,440 mari kita lakukan ini lagi. 364 00:15:50,440 --> 00:15:53,250 Kalau tidak aku akan dan menggunakan angka yang sama, tidak sengaja, 365 00:15:53,250 --> 00:15:54,230 beberapa kali. 366 00:15:54,230 --> 00:15:57,320 >> Jadi supaya kita memiliki nomor yang berbeda bicarakan, mari kita sebut byte ini 367 00:15:57,320 --> 00:16:03,391 nomor 123, 124, 125, 126, dan dot dot dot. 368 00:16:03,391 --> 00:16:08,400 Dan biarkan aku mengklaim sekarang bahwa aku akan menempatkan nilai 1 di sini, dan nilai 2 369 00:16:08,400 --> 00:16:11,990 di sini, atau dikenal sebagai x dan y. 370 00:16:11,990 --> 00:16:15,300 Jadi kebetulan bahwa ini adalah x, y ini. 371 00:16:15,300 --> 00:16:18,180 >> Dan hanya oleh beberapa kesempatan acak, komputer, sistem operasi, 372 00:16:18,180 --> 00:16:21,890 terjadi untuk menempatkan x di lokasi nomor 123. 373 00:16:21,890 --> 00:16:25,590 Dan y berakhir di lokasi 124 - 374 00:16:25,590 --> 00:16:26,330 sialan. 375 00:16:26,330 --> 00:16:28,700 Aku harus tetap ini. 376 00:16:28,700 --> 00:16:34,040 Oh man, aku benar-benar ingin melakukan ini? 377 00:16:34,040 --> 00:16:37,340 Ya, saya ingin memperbaiki ini dan b tepat tentang hari ini. 378 00:16:37,340 --> 00:16:39,950 Maaf, baru ini. 379 00:16:39,950 --> 00:16:45,020 >> 127, 131, dan aku tidak ingin menjadi ini kompleks, tapi mengapa saya mengubah 380 00:16:45,020 --> 00:16:46,340 angka di sana? 381 00:16:46,340 --> 00:16:48,360 Karena aku ingin ints untuk benar-benar menjadi empat byte. 382 00:16:48,360 --> 00:16:49,810 Jadi mari kita menjadi super anal tentang hal ini. 383 00:16:49,810 --> 00:16:53,800 Sehingga jika terjadi 1 ditangani 123, 2 tersebut akan berada di alamat 384 00:16:53,800 --> 00:16:55,730 127 karena itu hanya 4 bye pergi. 385 00:16:55,730 --> 00:16:56,210 Itu saja. 386 00:16:56,210 --> 00:16:58,640 Dan kita akan melupakan semua alamat lain di dunia. 387 00:16:58,640 --> 00:17:03,320 >> Jadi x adalah di lokasi 123, y adalah di lokasi 127. 388 00:17:03,320 --> 00:17:05,770 Dan sekarang, apa yang saya benar-benar ingin lakukan? 389 00:17:05,770 --> 00:17:10,099 Ketika saya sebut tukar sekarang, apa sebenarnya terjadi? 390 00:17:10,099 --> 00:17:14,920 Nah, ketika saya sebut swap, aku lewat di alamat x dan alamat y. 391 00:17:14,920 --> 00:17:18,540 Jadi misalnya, jika dua buah kertas sekarang mewakili dua 392 00:17:18,540 --> 00:17:23,510 argumen a dan b untuk swap, apa aku akan menulis pada yang pertama ini, 393 00:17:23,510 --> 00:17:27,720 yang aku akan menelepon sebut sebagai? 394 00:17:27,720 --> 00:17:30,610 >> Tepat, 123. 395 00:17:30,610 --> 00:17:31,905 Jadi ini saya mengklaim adalah. 396 00:17:31,905 --> 00:17:32,955 Ini adalah parameter a. 397 00:17:32,955 --> 00:17:35,856 Aku menempatkan alamat x dalam sana. 398 00:17:35,856 --> 00:17:38,152 >> Apa itu? 399 00:17:38,152 --> 00:17:40,890 >> Apa itu? 400 00:17:40,890 --> 00:17:41,190 >> Tidak, tidak. 401 00:17:41,190 --> 00:17:41,720 Itu OK. 402 00:17:41,720 --> 00:17:42,570 Masih bagus, masih bagus. 403 00:17:42,570 --> 00:17:43,530 Jadi ini adalah. 404 00:17:43,530 --> 00:17:46,240 Dan sekarang bagian kedua kertas, ini akan menjadi b, dan apa yang aku 405 00:17:46,240 --> 00:17:49,010 akan menulis pada kertas ini? 406 00:17:49,010 --> 00:17:50,080 127. 407 00:17:50,080 --> 00:17:53,720 >> Jadi satu-satunya hal yang berubah sejak menceritakan kami sebelumnya dari cerita ini adalah, 408 00:17:53,720 --> 00:17:58,590 daripada harfiah 1 dan 2, saya akan lewat di 123 dan 127. 409 00:17:58,590 --> 00:18:02,130 Dan aku sekarang akan dimasukkan ke dalam ini kotak ini, oke? 410 00:18:02,130 --> 00:18:04,640 Sehingga kotak hitam sekarang mewakili fungsi swap. 411 00:18:04,640 --> 00:18:07,230 >> Sementara itu, mari kita memiliki seseorang melaksanakan fungsi swap. 412 00:18:07,230 --> 00:18:09,090 Akankah seseorang di sini ingin menjadi relawan? 413 00:18:09,090 --> 00:18:09,560 Ayo up. 414 00:18:09,560 --> 00:18:11,080 Siapa nama Anda? 415 00:18:11,080 --> 00:18:11,460 Charlie. 416 00:18:11,460 --> 00:18:12,080 Baiklah, Charlie. 417 00:18:12,080 --> 00:18:14,810 Ayo up. 418 00:18:14,810 --> 00:18:17,310 >> Jadi Charlie akan bermain peran kotak hitam kami. 419 00:18:17,310 --> 00:18:21,460 Dan Charlie, apa yang saya ingin Anda lakukan sekarang menerapkan swap sedemikian rupa 420 00:18:21,460 --> 00:18:25,320 bahwa, mengingat dua alamat, Anda benar-benar akan 421 00:18:25,320 --> 00:18:26,330 untuk mengubah nilai. 422 00:18:26,330 --> 00:18:28,290 Dan aku akan berbisik di telinga Anda bagaimana menjalankan TV di sini. 423 00:18:28,290 --> 00:18:29,930 >> Jadi silakan, dan Anda kotak hitam. 424 00:18:29,930 --> 00:18:30,920 Jangkauan di sana. 425 00:18:30,920 --> 00:18:34,054 Nilai-nilai apa yang Anda lihat, dan nilai-nilai apa yang Anda lihat untuk b? 426 00:18:34,054 --> 00:18:36,740 >> CHARLIE: adalah 123 dan b adalah 127. 427 00:18:36,740 --> 00:18:37,530 >> DAVID Malan: OK, tepatnya. 428 00:18:37,530 --> 00:18:38,940 Sekarang berhenti di sana untuk sesaat. 429 00:18:38,940 --> 00:18:41,680 Hal pertama yang Anda akan lakukan sekarang, menurut kode - yang 430 00:18:41,680 --> 00:18:43,220 Sekarang saya akan menarik di layar - 431 00:18:43,220 --> 00:18:46,750 akan menjadi mengalokasikan sedikit sedikit memori yang disebut temp. 432 00:18:46,750 --> 00:18:48,850 Jadi aku akan pergi ke depan dan memberikan memori itu. 433 00:18:48,850 --> 00:18:52,210 >> Jadi, ini akan menjadi variabel ketiga bahwa Anda memiliki diakses 434 00:18:52,210 --> 00:18:54,080 Anda disebut temp. 435 00:18:54,080 --> 00:18:57,120 Dan apa yang Anda akan menulis pada potongan temp kertas? 436 00:18:57,120 --> 00:19:02,524 437 00:19:02,524 --> 00:19:03,470 >> CHARLIE: Pointer, kan? 438 00:19:03,470 --> 00:19:04,790 >> DAVID Malan: OK, juga tidak tentu pointer. 439 00:19:04,790 --> 00:19:07,230 Jadi baris kode yang telah saya disorot pada sisi kanan, 440 00:19:07,230 --> 00:19:07,900 mari kita mulai dari sana. 441 00:19:07,900 --> 00:19:08,890 Dikatakan bintang. 442 00:19:08,890 --> 00:19:11,670 Jadi saat ini menyimpan nomor 123. 443 00:19:11,670 --> 00:19:16,660 Dan hanya intuitif, apa Apakah maksud star 123? 444 00:19:16,660 --> 00:19:21,630 >> Namun secara khusus, jika a 123, sebuah bintang berarti apa? 445 00:19:21,630 --> 00:19:22,560 Nilai dari. 446 00:19:22,560 --> 00:19:24,580 Atau lebih santai, pergi ke sana. 447 00:19:24,580 --> 00:19:28,620 Jadi biarkan aku mengusulkan bahwa, memegang dalam tangan Anda, pergi ke depan dan memperlakukan bahwa 448 00:19:28,620 --> 00:19:29,430 seolah itu peta. 449 00:19:29,430 --> 00:19:32,940 Dan berjalan sendiri ke komputer memori, dan menemukan kami apa yang 450 00:19:32,940 --> 00:19:36,520 di lokasi 123. 451 00:19:36,520 --> 00:19:37,720 Tepat. 452 00:19:37,720 --> 00:19:41,100 >> Jadi kita melihat di lokasi 123 adalah apa, jelas? 453 00:19:41,100 --> 00:19:44,240 OK, jadi apa nilai sekarang kau akan dimasukkan ke dalam suhu? 454 00:19:44,240 --> 00:19:44,750 Tepat. 455 00:19:44,750 --> 00:19:45,600 Jadi pergi ke depan dan melakukannya. 456 00:19:45,600 --> 00:19:51,280 Dan tulis nomor 1 pada sepotong kertas yang saat ini berjudul temp. 457 00:19:51,280 --> 00:19:53,540 >> Dan sekarang langkah berikutnya yang Anda akan mengimplementasikan 458 00:19:53,540 --> 00:19:54,310 akan menjadi apa. 459 00:19:54,310 --> 00:19:57,820 Nah, di sisi kanan baris kode yang berikutnya adalah bintang b. b, dari 460 00:19:57,820 --> 00:19:59,260 Tentu saja, menyimpan alamat. 461 00:19:59,260 --> 00:20:02,270 Yang membahas 127. 462 00:20:02,270 --> 00:20:06,620 Bintang b berarti apa, santai berbicara? 463 00:20:06,620 --> 00:20:08,700 >> Pergi ke lokasi tersebut. 464 00:20:08,700 --> 00:20:14,988 Jadi pergi ke depan dan menemukan kami apa di lokasi 127. 465 00:20:14,988 --> 00:20:15,480 OK. 466 00:20:15,480 --> 00:20:19,170 Tentu saja, di lokasi 127, masih nilai 2. 467 00:20:19,170 --> 00:20:24,060 Jadi apa yang Anda pergi sekarang toko pada apa pun di lokasi dalam? 468 00:20:24,060 --> 00:20:26,860 Jadi Bintang sarana pergi ke lokasi a. 469 00:20:26,860 --> 00:20:29,770 Apa lokasi yang? 470 00:20:29,770 --> 00:20:30,430 >> Tepat. 471 00:20:30,430 --> 00:20:34,190 Jadi sekarang, jika Anda ingin mengubah apa di lokasi itu - 472 00:20:34,190 --> 00:20:36,470 Aku akan pergi ke depan dan menjalankan penghapus di sini. 473 00:20:36,470 --> 00:20:37,760 Dan sekarang menempatkan kembali pada sikat. 474 00:20:37,760 --> 00:20:42,190 Nomor berapa yang Anda akan menulis dalam kotak kosong sekarang? 475 00:20:42,190 --> 00:20:42,850 >> Tepat. 476 00:20:42,850 --> 00:20:46,470 Jadi baris kode ini, harus jelas - biarkan saya berhenti sejenak apa yang Charlie lakukan dan 477 00:20:46,470 --> 00:20:51,730 menunjukkan di sini, apa yang dia saja dilakukan adalah menulis ke dalam kotak itu di lokasi 123 478 00:20:51,730 --> 00:20:55,150 nilai yang sebelumnya di b. 479 00:20:55,150 --> 00:20:59,140 Dan sekarang kami telah diterapkan memang ini baris kedua kode. 480 00:20:59,140 --> 00:21:01,920 >> Sekarang sayangnya, ada masih tersisa satu baris. 481 00:21:01,920 --> 00:21:04,900 Sekarang apa yang ada di temp, secara harfiah? 482 00:21:04,900 --> 00:21:06,200 Ini jelas nomor satu. 483 00:21:06,200 --> 00:21:07,020 Itu bukan alamat. 484 00:21:07,020 --> 00:21:09,380 Ini hanya nomor, semacam variabel dari satu minggu. 485 00:21:09,380 --> 00:21:13,520 >> Dan sekarang ketika Anda mengatakan bintang b, yang berarti pergi ke alamat b, yang merupakan 486 00:21:13,520 --> 00:21:15,090 Tentu saja di sini. 487 00:21:15,090 --> 00:21:16,020 Jadi setelah Anda sampai di sana - 488 00:21:16,020 --> 00:21:18,320 Aku akan pergi ke depan dan menghapus apa yang sebenarnya ada - dan apa yang Anda 489 00:21:18,320 --> 00:21:20,820 akan menulis sekarang di 127 lokasi? 490 00:21:20,820 --> 00:21:22,010 >> CHARLIE: Temp, yang merupakan salah satu. 491 00:21:22,010 --> 00:21:23,430 >> DAVID Malan: Temp, yang merupakan salah satu. 492 00:21:23,430 --> 00:21:25,670 Dan apa yang terjadi pada suhu pada akhirnya? 493 00:21:25,670 --> 00:21:26,600 Yah, kita tidak benar-benar tahu. 494 00:21:26,600 --> 00:21:27,420 Kami tidak benar-benar peduli. 495 00:21:27,420 --> 00:21:31,090 Setiap kali kami telah menerapkan fungsi sejauh ini, setiap variabel lokal yang Anda miliki 496 00:21:31,090 --> 00:21:31,890 memang lokal. 497 00:21:31,890 --> 00:21:33,060 Dan mereka hanya menghilang. 498 00:21:33,060 --> 00:21:35,040 Mereka kembali oleh operasi sistem akhirnya. 499 00:21:35,040 --> 00:21:39,800 >> Jadi fakta bahwa suhu masih memiliki Nilai 1 adalah semacam fundamental 500 00:21:39,800 --> 00:21:41,150 tidak menarik bagi kami. 501 00:21:41,150 --> 00:21:43,100 Baiklah, jadi tepuk tangan jika kita bisa untuk Charlie. 502 00:21:43,100 --> 00:21:46,400 Sangat baik dilakukan. 503 00:21:46,400 --> 00:21:51,520 >> Baiklah, jadi apa lagi tidak ini berarti kita bisa lakukan? 504 00:21:51,520 --> 00:21:54,400 Jadi ternyata bahwa kita telah menceritakan kebohongan putih beberapa 505 00:21:54,400 --> 00:21:55,540 untuk beberapa waktu. 506 00:21:55,540 --> 00:21:59,990 Memang, ternyata string, sepanjang waktu ini, tidak benar-benar 507 00:21:59,990 --> 00:22:02,190 urutan karakter per se. 508 00:22:02,190 --> 00:22:03,980 Ini semacam adalah bahwa intuitif. 509 00:22:03,980 --> 00:22:08,270 >> Tapi secara teknis berbicara, tali adalah Jenis data yang kami nyatakan dalam 510 00:22:08,270 --> 00:22:12,170 yang CS50 perpustakaan untuk menyederhanakan dunia selama beberapa minggu pertama kuliah. 511 00:22:12,170 --> 00:22:20,130 Apa string sebenarnya adalah alamat dari karakter suatu tempat di RAM. 512 00:22:20,130 --> 00:22:25,530 Sebuah string adalah benar-benar angka, seperti 123 atau 127, yang terjadi untuk membatasi 513 00:22:25,530 --> 00:22:28,420 di mana string dimulai di memori komputer Anda. 514 00:22:28,420 --> 00:22:31,870 >> Tapi itu tidak mewakili String, per se, itu sendiri. 515 00:22:31,870 --> 00:22:33,460 Dan kita bisa melihat ini sebagai berikut. 516 00:22:33,460 --> 00:22:35,980 Biarkan aku pergi ke depan dan membuka beberapa kode yang salah 517 00:22:35,980 --> 00:22:38,340 contoh kode sumber saat ini. 518 00:22:38,340 --> 00:22:42,225 Dan aku akan pergi ke depan dan membuka up, katakanlah, bandingkan-0.c. 519 00:22:42,225 --> 00:22:44,830 520 00:22:44,830 --> 00:22:48,790 Ini adalah program kereta yang akan dilaksanakan sebagai berikut. 521 00:22:48,790 --> 00:22:49,040 >> Pertama. 522 00:22:49,040 --> 00:22:50,420 Aku akan mengatakan sesuatu. 523 00:22:50,420 --> 00:22:52,660 Lalu aku akan pergi ke depan dan mendapatkan string dari pengguna 524 00:22:52,660 --> 00:22:53,750 dalam baris berikutnya. 525 00:22:53,750 --> 00:22:55,370 Lalu aku akan mengatakannya lagi. 526 00:22:55,370 --> 00:22:57,540 Lalu aku akan mendapatkan lain string dari pengguna. 527 00:22:57,540 --> 00:23:00,390 >> Dan perhatikan, aku menunjukkan salah satu string dalam variabel yang disebut s, dan 528 00:23:00,390 --> 00:23:03,040 lain string ini dalam variabel yang disebut t. 529 00:23:03,040 --> 00:23:07,480 Dan sekarang aku akan mengklaim, sangat cukup, bahwa jika s sama sama t, 530 00:23:07,480 --> 00:23:08,940 string adalah sama. 531 00:23:08,940 --> 00:23:09,970 Anda mengetik hal yang sama. 532 00:23:09,970 --> 00:23:11,830 Lain, senar bukan hal yang sama. 533 00:23:11,830 --> 00:23:15,440 >> Setelah semua, jika kita masukan dua ints, dua chars, dua mengapung, dua ganda, salah satu dari 534 00:23:15,440 --> 00:23:18,400 tipe data yang telah kita bicarakan sejauh ini untuk membandingkan mereka - 535 00:23:18,400 --> 00:23:22,070 ingat kami membuat sangat jelas beberapa waktu yang lalu bahwa Anda tidak melakukan ini, karena 536 00:23:22,070 --> 00:23:25,840 tanda sama tunggal tentu saja operator penugasan. 537 00:23:25,840 --> 00:23:26,820 Sehingga akan menjadi bug. 538 00:23:26,820 --> 00:23:29,260 >> Kami menggunakan tanda sama sama, yang memang membandingkan 539 00:23:29,260 --> 00:23:31,050 hal untuk kesetaraan sejati. 540 00:23:31,050 --> 00:23:32,275 Tapi saya mengklaim ini adalah kereta. 541 00:23:32,275 --> 00:23:37,400 Jika saya pergi ke depan dan membuat membandingkan nol, dan kemudian melakukan dot slash membandingkan nol. 542 00:23:37,400 --> 00:23:39,700 Dan aku mengetik, katakanlah, halo. 543 00:23:39,700 --> 00:23:41,590 Dan kemudian mari kita menyapa lagi. 544 00:23:41,590 --> 00:23:46,040 Secara harfiah hal yang sama, komputer klaim saya mengetik hal yang berbeda. 545 00:23:46,040 --> 00:23:47,640 >> Sekarang mungkin aku hanya salah tulis sesuatu. 546 00:23:47,640 --> 00:23:49,910 Aku akan mengetik nama saya saat ini. 547 00:23:49,910 --> 00:23:52,580 Maksudku, halo. 548 00:23:52,580 --> 00:23:54,770 Hello. 549 00:23:54,770 --> 00:23:57,360 Ini berbeda setiap waktu. 550 00:23:57,360 --> 00:23:58,430 >> Nah, kenapa begitu? 551 00:23:58,430 --> 00:24:00,140 Apa yang sebenarnya terjadi bawah tenda? 552 00:24:00,140 --> 00:24:03,270 Nah, apa yang sebenarnya terjadi di bawah tenda adalah string maka 553 00:24:03,270 --> 00:24:07,410 Saya mengetik yang pertama kalinya misalnya adalah kata halo, tentu saja. 554 00:24:07,410 --> 00:24:11,660 Tetapi jika kita merepresentasikan bawah kap mesin, ingat bahwa 555 00:24:11,660 --> 00:24:13,470 string dalam array. 556 00:24:13,470 --> 00:24:15,040 Dan kami telah mengatakan sebanyak di masa lalu. 557 00:24:15,040 --> 00:24:20,200 >> Jadi jika saya menggambar array seperti ini, aku akan mewakili sesuatu yang cukup 558 00:24:20,200 --> 00:24:23,030 mirip dengan apa yang kita lakukan beberapa saat yang lalu. 559 00:24:23,030 --> 00:24:25,390 Dan sebenarnya ada sesuatu khusus di sini, juga. 560 00:24:25,390 --> 00:24:28,090 Apa yang kita menentukan itu di akhir setiap tali? 561 00:24:28,090 --> 00:24:30,760 Ya, ini backslash nol, yaitu hanya cara untuk mewakili, 562 00:24:30,760 --> 00:24:33,610 harfiah, 00000000. 563 00:24:33,610 --> 00:24:35,680 Delapan bit 0 berturut-turut. 564 00:24:35,680 --> 00:24:37,610 >> Saya tidak tahu, terus terang, apa setelah ini. 565 00:24:37,610 --> 00:24:40,090 Itu hanya sekelompok RAM lebih dalam komputer saya. 566 00:24:40,090 --> 00:24:40,970 Tapi ini adalah sebuah array. 567 00:24:40,970 --> 00:24:42,260 Kami berbicara tentang array sebelumnya. 568 00:24:42,260 --> 00:24:45,010 Dan kita biasanya berbicara tentang array sebagai lokasi nol, 569 00:24:45,010 --> 00:24:46,580 lalu satu, lalu dua. 570 00:24:46,580 --> 00:24:47,950 Tapi itu hanya untuk kenyamanan. 571 00:24:47,950 --> 00:24:49,380 Dan itu sepenuhnya relatif. 572 00:24:49,380 --> 00:24:53,010 >> Ketika Anda benar-benar mendapatkan memori dari komputer, itu tentu saja setiap 573 00:24:53,010 --> 00:24:55,450 2 miliar beberapa aneh byte, berpotensi. 574 00:24:55,450 --> 00:24:59,100 Jadi benar-benar di bawah tenda, selama ini, ya. 575 00:24:59,100 --> 00:25:01,670 Hal ini mungkin sangat baik menjadi braket nol. 576 00:25:01,670 --> 00:25:04,780 Tetapi jika Anda menggali lebih dalam di bawah kap mesin, itu benar-benar 577 00:25:04,780 --> 00:25:07,000 alamat nomor 123. 578 00:25:07,000 --> 00:25:09,150 Ini adalah alamat 124. 579 00:25:09,150 --> 00:25:11,040 Ini adalah alamat 125. 580 00:25:11,040 --> 00:25:12,540 >> Dan aku tidak mengacaukan saat ini. 581 00:25:12,540 --> 00:25:15,840 Ini sekarang satu byte terpisah untuk alasan apa? 582 00:25:15,840 --> 00:25:17,930 Seberapa besar adalah char? 583 00:25:17,930 --> 00:25:19,170 Char adalah hanya satu byte. 584 00:25:19,170 --> 00:25:20,570 Int biasanya empat byte. 585 00:25:20,570 --> 00:25:24,850 Jadi itulah mengapa saya membuat 123, 127, 131 dan sebagainya. 586 00:25:24,850 --> 00:25:27,560 Sekarang saya bisa menjaga matematika sederhana dan hanya melakukan ditambah 1. 587 00:25:27,560 --> 00:25:30,510 Dan ini sekarang apa yang sebenarnya terjadi di bawah tenda. 588 00:25:30,510 --> 00:25:37,760 >> Jadi, ketika Anda menyatakan sesuatu seperti ini, string s, ini sebenarnya - 589 00:25:37,760 --> 00:25:39,170 ternyata - 590 00:25:39,170 --> 00:25:41,190 arang star. 591 00:25:41,190 --> 00:25:44,640 Bintang, tentu saja, berarti alamat, pointer alias. 592 00:25:44,640 --> 00:25:46,200 Jadi alamat sesuatu. 593 00:25:46,200 --> 00:25:47,510 Apa itu alamat dari? 594 00:25:47,510 --> 00:25:47,760 >> Yah - 595 00:25:47,760 --> 00:25:51,680 Aku satu-satunya orang yang bisa melihat sangat hal penting saya sedang membuat, atau berpikir 596 00:25:51,680 --> 00:25:52,560 Saya sedang membuat. 597 00:25:52,560 --> 00:25:55,270 Jadi kata - 598 00:25:55,270 --> 00:25:57,180 hal yang menyedihkan adalah saya memiliki monitor di sana di mana aku 599 00:25:57,180 --> 00:25:58,100 bisa melihat itu. 600 00:25:58,100 --> 00:26:00,990 >> Baiklah, jadi string s adalah apa Saya menyatakan sebelumnya. 601 00:26:00,990 --> 00:26:04,600 Tapi ternyata, berkat sedikit sihir dalam CS50 perpustakaan, semua ini 602 00:26:04,600 --> 00:26:08,780 Waktu string yang memiliki harfiah menjadi bintang arang. 603 00:26:08,780 --> 00:26:11,310 Bintang lagi berarti pointer atau alamat. 604 00:26:11,310 --> 00:26:14,180 Fakta bahwa itu mengapit Kata arang berarti adalah 605 00:26:14,180 --> 00:26:15,970 alamat karakter. 606 00:26:15,970 --> 00:26:23,100 >> Jadi jika mendapatkan string disebut, dan saya ketik di H-E-L-L-O, mengusulkan sekarang apa yang telah mendapatkan 607 00:26:23,100 --> 00:26:27,330 string yang benar-benar telah kembali semua saat ini, meskipun kita sudah agak 608 00:26:27,330 --> 00:26:29,980 disederhanakan dunia? 609 00:26:29,980 --> 00:26:33,310 Apa mendapatkan string yang sebenarnya kembali sebagai nilai kembali? 610 00:26:33,310 --> 00:26:35,830 611 00:26:35,830 --> 00:26:38,720 >> 123 dalam kasus ini, misalnya. 612 00:26:38,720 --> 00:26:42,630 Kita sebelumnya sudah mengatakan bahwa mendapatkan string yang hanya mengembalikan string, urutan 613 00:26:42,630 --> 00:26:43,300 karakter. 614 00:26:43,300 --> 00:26:44,790 Tapi itu sedikit kebohongan putih. 615 00:26:44,790 --> 00:26:48,010 Cara mendapatkan string yang benar-benar bekerja bawah tenda itu mendapat 616 00:26:48,010 --> 00:26:48,930 string dari pengguna. 617 00:26:48,930 --> 00:26:51,530 Ini menjatuhkan karakter yang dia jenis dalam memori. 618 00:26:51,530 --> 00:26:54,680 Ini menempatkan nol backslash di akhir dari mereka urutan karakter. 619 00:26:54,680 --> 00:26:57,310 >> Tapi kemudian apa yang mendapatkan tali harfiah kembali? 620 00:26:57,310 --> 00:27:02,710 Secara harfiah mengembalikan alamat dari byte pertama dalam RAM yang 621 00:27:02,710 --> 00:27:04,130 itu digunakan untuk kekuatan itu. 622 00:27:04,130 --> 00:27:07,500 Dan ternyata bahwa hanya dengan kembali satu alamat dari 623 00:27:07,500 --> 00:27:12,120 karakter pertama dalam string, yaitu cukup untuk menemukan keseluruhan 624 00:27:12,120 --> 00:27:12,630 string. 625 00:27:12,630 --> 00:27:16,930 >> Dengan kata lain, mendapatkan string tidak memiliki untuk kembali 123 dan 124 dan 125. 626 00:27:16,930 --> 00:27:19,950 Ini tidak harus memberi saya panjang daftar semua byte yang 627 00:27:19,950 --> 00:27:20,740 string saya menggunakan. 628 00:27:20,740 --> 00:27:22,670 Karena salah satu, mereka semua kembali ke belakang. 629 00:27:22,670 --> 00:27:28,160 Dan dua, berdasarkan pada alamat pertama, saya dapat mencari tahu di mana string berakhir. 630 00:27:28,160 --> 00:27:29,910 Bagaimana? 631 00:27:29,910 --> 00:27:33,490 >> Karakter null khusus, backslash nol di akhir. 632 00:27:33,490 --> 00:27:35,430 Jadi dengan kata lain, jika Anda lulus sekitar - 633 00:27:35,430 --> 00:27:36,530 dalam variabel - 634 00:27:36,530 --> 00:27:41,300 alamat char, dan Anda menganggap bahwa pada akhir string, setiap 635 00:27:41,300 --> 00:27:45,040 urutan karakter seperti yang kita manusia memikirkan string, jika Anda berasumsi bahwa 636 00:27:45,040 --> 00:27:48,600 pada akhir string apapun seperti ada nol backslash, kau emas. 637 00:27:48,600 --> 00:27:52,430 Karena Anda selalu dapat menemukan akhir string. 638 00:27:52,430 --> 00:27:54,870 >> Sekarang apa yang sebenarnya kemudian pergi di dalam program ini? 639 00:27:54,870 --> 00:27:59,990 Mengapa program ini, membandingkan-0.c, kereta? 640 00:27:59,990 --> 00:28:01,690 Apa yang sebenarnya sedang dibandingkan? 641 00:28:01,690 --> 00:28:02,420 Ya? 642 00:28:02,420 --> 00:28:05,000 >> SISWA: [Tak terdengar]. 643 00:28:05,000 --> 00:28:05,730 >> DAVID Malan: Tepat. 644 00:28:05,730 --> 00:28:08,350 Ini membandingkan lokasi dari string. 645 00:28:08,350 --> 00:28:12,420 Jadi jika pengguna telah mengetik hello setelah, seperti yang saya lakukan, memori mungkin berakhir 646 00:28:12,420 --> 00:28:13,430 terlihat seperti ini. 647 00:28:13,430 --> 00:28:18,210 Jika pengguna kemudian jenis dalam halo lagi, tapi dengan memanggil get tali lagi, c adalah 648 00:28:18,210 --> 00:28:21,800 tidak terlalu pintar kecuali Anda mengajar untuk menjadi pintar dengan menulis kode. 649 00:28:21,800 --> 00:28:22,430 >> C - 650 00:28:22,430 --> 00:28:23,860 dan komputer lebih umum - 651 00:28:23,860 --> 00:28:27,370 jika Anda mengetikkan kata halo lagi, Anda tahu apa yang Anda akan mendapatkan. 652 00:28:27,370 --> 00:28:31,480 Kau hanya akan mendapatkan array kedua memori yang, ya, terjadi menjadi 653 00:28:31,480 --> 00:28:35,510 menyimpan H-E-L-L-O dan sebagainya. 654 00:28:35,510 --> 00:28:38,240 >> Ini akan terlihat sama kita manusia, tetapi alamat ini 655 00:28:38,240 --> 00:28:39,460 mungkin tidak 123. 656 00:28:39,460 --> 00:28:42,470 Mungkin hanya begitu terjadi bahwa sistem operasi memiliki beberapa tersedia 657 00:28:42,470 --> 00:28:45,430 ruang misalnya di lokasi - 658 00:28:45,430 --> 00:28:49,820 katakanlah sesuatu yang sewenang-wenang, seperti ini adalah lokasi 200. 659 00:28:49,820 --> 00:28:51,620 Dan ini adalah lokasi 201. 660 00:28:51,620 --> 00:28:53,060 Dan ini adalah lokasi 202. 661 00:28:53,060 --> 00:28:55,730 Kami tidak tahu di mana itu akan berada di memori. 662 00:28:55,730 --> 00:28:59,110 >> Tapi apa ini berarti bahwa apa yang akan disimpan akhirnya di s? 663 00:28:59,110 --> 00:29:00,750 Nomor 123. 664 00:29:00,750 --> 00:29:04,860 Apa yang akan disimpan di t, dalam contoh ini sewenang-wenang? 665 00:29:04,860 --> 00:29:06,300 Nomor 200. 666 00:29:06,300 --> 00:29:11,410 Dan semua itu berarti kemudian jelas, 123 tidak sama dengan 200. 667 00:29:11,410 --> 00:29:14,940 Dan jadi ini jika kondisi tidak bernilai true. 668 00:29:14,940 --> 00:29:18,430 Karena get string menggunakan berbeda potongan memori setiap kali. 669 00:29:18,430 --> 00:29:20,360 >> Sekarang kita bisa melihat ini lagi dalam contoh lain. 670 00:29:20,360 --> 00:29:23,764 Biarkan aku pergi ke depan dan membuka copy-0.c. 671 00:29:23,764 --> 00:29:28,770 Saya menyatakan bahwa contoh ini akan coba - tapi gagal - untuk menyalin dua string 672 00:29:28,770 --> 00:29:29,910 sebagai berikut. 673 00:29:29,910 --> 00:29:31,730 >> Aku akan mengatakan sesuatu kepada pengguna. 674 00:29:31,730 --> 00:29:34,490 Saya kemudian akan mendapatkan tali dan menyebutnya s. 675 00:29:34,490 --> 00:29:36,400 Dan sekarang, aku melakukan cek ini di sini. 676 00:29:36,400 --> 00:29:37,990 Kami disebutkan ini beberapa waktu lalu. 677 00:29:37,990 --> 00:29:42,490 Tapi ketika mungkin mendapatkan null string kembali, karakter lain khusus, atau khusus 678 00:29:42,490 --> 00:29:45,050 simbol katakanlah. 679 00:29:45,050 --> 00:29:45,900 Jika keluar dari memori. 680 00:29:45,900 --> 00:29:48,970 >> Misalnya, jika pengguna benar-benar menjadi sulit dan jenis yang mengerikan 681 00:29:48,970 --> 00:29:51,220 jumlah karakter pada keyboard dan hit Enter. 682 00:29:51,220 --> 00:29:54,580 Jika jumlah karakter tidak bisa cocok dalam RAM untuk apa pun gila 683 00:29:54,580 --> 00:29:57,820 Alasannya, juga mendapatkan tali mungkin sangat baik kembali null. 684 00:29:57,820 --> 00:30:01,080 >> Atau jika program anda sendiri melakukan banyak hal-hal lain dan hanya ada 685 00:30:01,080 --> 00:30:03,790 tidak cukup memori untuk get string yang untuk berhasil, itu mungkin berakhir 686 00:30:03,790 --> 00:30:05,240 up kembali null. 687 00:30:05,240 --> 00:30:07,160 Tapi mari kita lebih tepat seperti apa ini. 688 00:30:07,160 --> 00:30:10,280 Apa s tipe data benar-benar? 689 00:30:10,280 --> 00:30:11,610 Bintang Char. 690 00:30:11,610 --> 00:30:14,560 >> Jadi ternyata sekarang kita dapat mengupas kembali lapisan null. 691 00:30:14,560 --> 00:30:17,500 Ternyata, null adalah - ya, jelas simbol khusus. 692 00:30:17,500 --> 00:30:19,190 Tapi apa itu benar? 693 00:30:19,190 --> 00:30:25,220 Sungguh, null hanyalah simbol bahwa kita manusia gunakan untuk mewakili nol juga. 694 00:30:25,220 --> 00:30:29,010 >> Jadi penulis C, dan komputer lebih umum, memutuskan tahun yang lalu 695 00:30:29,010 --> 00:30:30,010 yang, Anda tahu apa. 696 00:30:30,010 --> 00:30:34,850 Mengapa kita tidak memastikan bahwa tidak ada pengguna Data yang pernah, pernah, pernah 697 00:30:34,850 --> 00:30:36,730 disimpan pada bye nol? 698 00:30:36,730 --> 00:30:39,610 Pada kenyataannya, bahkan dalam contoh sewenang-wenang saya sebelumnya, saya tidak memulai penomoran 699 00:30:39,610 --> 00:30:40,390 byte nol. 700 00:30:40,390 --> 00:30:41,540 Saya mulai pada satu. 701 00:30:41,540 --> 00:30:44,950 Karena aku tahu bahwa orang di dunia telah memutuskan untuk memesan nol 702 00:30:44,950 --> 00:30:47,970 byte dalam RAM siapa pun sebagai sesuatu yang istimewa. 703 00:30:47,970 --> 00:30:52,020 >> Alasannya, kapan saja Anda mau sinyal bahwa sesuatu yang tidak beres 704 00:30:52,020 --> 00:30:55,960 berkaitan dengan alamat, Anda kembali nol - atau dikenal sebagai nol - 705 00:30:55,960 --> 00:30:59,410 dan karena Anda tahu bahwa tidak ada legit data pada alamat nol, jelas 706 00:30:59,410 --> 00:31:00,400 itu berarti kesalahan. 707 00:31:00,400 --> 00:31:04,080 Dan itulah mengapa kita, dengan konvensi, periksa for null dan kembali sesuatu 708 00:31:04,080 --> 00:31:06,260 seperti dalam kasus-kasus. 709 00:31:06,260 --> 00:31:09,300 >> Jadi jika kita gulir ke bawah sekarang, ini hanya kemudian beberapa pengecekan error, hanya dalam kasus 710 00:31:09,300 --> 00:31:10,610 sesuatu yang tidak beres dengan [? jaminan?] 711 00:31:10,610 --> 00:31:13,470 sama sekali dan keluar dari program dengan kembali awal. 712 00:31:13,470 --> 00:31:19,030 Baris ini sekarang bisa ditulis ulang karena hal ini, yang berarti apa? 713 00:31:19,030 --> 00:31:23,155 Di sisi kiri, beri aku lagi pointer ke karakter, dan menyebutnya t. 714 00:31:23,155 --> 00:31:26,935 Apa yang saya menyimpan dalam t, berdasarkan pada satu baris kode? 715 00:31:26,935 --> 00:31:30,950 716 00:31:30,950 --> 00:31:32,170 >> Aku menyimpan lokasi. 717 00:31:32,170 --> 00:31:34,742 Khususnya lokasi yang berada di s. 718 00:31:34,742 --> 00:31:39,000 Jadi jika pengguna telah mengetik halo, dan yang pertama kali terjadi halo berakhir 719 00:31:39,000 --> 00:31:42,567 sini, maka nomor 123 adalah akan datang kembali dari mendapatkan 720 00:31:42,567 --> 00:31:43,810 merangkai dan disimpan - 721 00:31:43,810 --> 00:31:44,780 seperti yang kita katakan sebelumnya - 722 00:31:44,780 --> 00:31:45,440 di s. 723 00:31:45,440 --> 00:31:50,560 >> Ketika saya sekarang menyatakan pointer lain untuk char dan menyebutnya t, apa nomor yang 724 00:31:50,560 --> 00:31:53,940 harfiah akan berakhir di t menurut cerita? 725 00:31:53,940 --> 00:31:55,420 Jadi 123. 726 00:31:55,420 --> 00:32:00,310 >> Jadi secara teknis sekarang keduanya s dan t menunjuk ke tepat 727 00:32:00,310 --> 00:32:02,410 potongan yang sama dari memori. 728 00:32:02,410 --> 00:32:06,140 Jadi perhatikan apa yang akan saya lakukan sekarang untuk membuktikan bahwa program ini adalah kereta. 729 00:32:06,140 --> 00:32:08,820 >> Pertama aku akan mengklaim, dengan cetak f, memanfaatkan 730 00:32:08,820 --> 00:32:10,080 salinan string. 731 00:32:10,080 --> 00:32:11,660 Lalu aku akan melakukan sedikit kesalahan pemeriksaan. 732 00:32:11,660 --> 00:32:12,160 Aku akan memastikan. 733 00:32:12,160 --> 00:32:16,710 Mari kita pastikan bahwa string t berada pada setidaknya lebih besar dari nol panjang, 734 00:32:16,710 --> 00:32:19,190 jadi ada beberapa karakter ada untuk benar-benar memanfaatkan. 735 00:32:19,190 --> 00:32:22,840 >> Dan kemudian Anda mungkin ingat ini dari contoh sebelumnya. 736 00:32:22,840 --> 00:32:25,630 2 atas - yang di file ctype.h. 737 00:32:25,630 --> 00:32:30,800 T braket nol memberi saya nol karakter dari string t. 738 00:32:30,800 --> 00:32:34,360 Dan 2 atas bahwa nilai yang sama, dari Tentu saja, mengkonversi ke huruf besar. 739 00:32:34,360 --> 00:32:38,230 >> Jadi secara intuitif, baris ini disorot kode adalah memanfaatkan pertama 740 00:32:38,230 --> 00:32:40,250 huruf di t. 741 00:32:40,250 --> 00:32:44,485 Tapi itu tidak memanfaatkan, intuitif, huruf pertama dalam s. 742 00:32:44,485 --> 00:32:48,130 Tapi jika Anda berpikir ke depan, apa yang aku akan melihat ketika saya menjalankan program ini 743 00:32:48,130 --> 00:32:54,220 dan mencetak baik asli, s, dan disebut copy, t? 744 00:32:54,220 --> 00:32:55,350 >> Mereka benar-benar akan menjadi sama. 745 00:32:55,350 --> 00:32:56,600 Dan mengapa mereka akan sama? 746 00:32:56,600 --> 00:32:58,970 747 00:32:58,970 --> 00:33:01,020 Mereka berdua menunjuk ke hal yang sama. 748 00:33:01,020 --> 00:33:01,610 Jadi mari kita lakukan ini. 749 00:33:01,610 --> 00:33:03,160 >> Membuat salinan nol. 750 00:33:03,160 --> 00:33:04,070 Itu mengkompilasi OK. 751 00:33:04,070 --> 00:33:06,500 Biarkan aku menjalankan salinan nol. 752 00:33:06,500 --> 00:33:10,110 Biarkan saya ketik sesuatu seperti halo di huruf kecil semua kemudian tekan Enter. 753 00:33:10,110 --> 00:33:16,520 Dan mengklaim bahwa baik asli s dan copy memang identik. 754 00:33:16,520 --> 00:33:17,920 >> Jadi apa yang sebenarnya terjadi di sini? 755 00:33:17,920 --> 00:33:20,100 Mari saya redraw gambar ini hanya untuk menceritakan kisah dalam 756 00:33:20,100 --> 00:33:21,340 cara yang sedikit berbeda. 757 00:33:21,340 --> 00:33:26,060 Apa yang sebenarnya terjadi di bawah hood ketika saya menyatakan sesuatu seperti 758 00:33:26,060 --> 00:33:30,410 Char mulai s, atau string s, Saya mendapatkan pointer - 759 00:33:30,410 --> 00:33:33,090 yang terjadi menjadi empat byte dalam CS50 alat 760 00:33:33,090 --> 00:33:34,410 dan dalam banyak komputer. 761 00:33:34,410 --> 00:33:36,008 Dan aku akan menelepon s ini. 762 00:33:36,008 --> 00:33:39,810 Dan ini saat ini memiliki beberapa nilai yang tidak diketahui. 763 00:33:39,810 --> 00:33:43,900 >> Ketika Anda mendeklarasikan variabel, kecuali jika Anda sendiri memberikan nilai sana, yang 764 00:33:43,900 --> 00:33:44,570 tahu apa yang ada. 765 00:33:44,570 --> 00:33:48,110 Ini bisa menjadi beberapa urutan acak bit dari eksekusi sebelumnya. 766 00:33:48,110 --> 00:33:52,490 Jadi ketika saya, sejalan saya tidak mendapatkan kode tali, dan kemudian menyimpan return 767 00:33:52,490 --> 00:33:54,800 nilai dalam s mendapatkan string yang entah bagaimana - 768 00:33:54,800 --> 00:33:58,520 dan kami akan akhirnya mengupas bagaimana mendapatkan karya tali, entah bagaimana mengalokasikan 769 00:33:58,520 --> 00:34:00,480 array mungkin terlihat sedikit seperti ini. 770 00:34:00,480 --> 00:34:05,390 H-E-L-L-O, backslash nol. 771 00:34:05,390 --> 00:34:09,510 >> Mari kita mengira bahwa ini adalah alamat 123 hanya konsistensi pertama. 772 00:34:09,510 --> 00:34:13,000 Jadi bisa mengembalikan string, dalam disorot garis di sana, ia mengembalikan 773 00:34:13,000 --> 00:34:15,000 nomor kami berkata, 123. 774 00:34:15,000 --> 00:34:17,420 Jadi apa yang sebenarnya terjadi dalam s di sini? 775 00:34:17,420 --> 00:34:26,590 >> Nah, apa yang sebenarnya terjadi dalam s 123. 776 00:34:26,590 --> 00:34:29,250 Tapi terus terang, saya mendapatkan sedikit bingung dengan semua alamat ini, 777 00:34:29,250 --> 00:34:30,320 semua angka-angka ini sewenang-wenang. 778 00:34:30,320 --> 00:34:32,290 123, 124, 127. 779 00:34:32,290 --> 00:34:34,570 Jadi mari kita benar-benar menyederhanakan dunia sedikit. 780 00:34:34,570 --> 00:34:38,800 >> Ketika kita berbicara tentang pointer, terus terang, untuk kita manusia, siapa sih yang peduli di mana 781 00:34:38,800 --> 00:34:39,870 hal-hal yang dalam memori? 782 00:34:39,870 --> 00:34:41,080 Itu benar-benar sewenang-wenang. 783 00:34:41,080 --> 00:34:43,370 Ini akan tergantung pada bagaimana banyak RAM pengguna memiliki. 784 00:34:43,370 --> 00:34:46,590 Ini akan tergantung pada saat hari Anda menjalankan program, mungkin, dan 785 00:34:46,590 --> 00:34:48,250 apa input pengguna memberi Anda. 786 00:34:48,250 --> 00:34:50,060 Kami tinggal pada detail penting. 787 00:34:50,060 --> 00:34:54,230 >> Jadi mari kita abstrak dan mengatakan bahwa, ketika Anda menjalankan baris kode seperti ini, 788 00:34:54,230 --> 00:34:57,320 Char star s mendapat pengembalian nilai get tali. 789 00:34:57,320 --> 00:35:02,720 Mengapa kita tidak bukan hanya menggambar apa yang kita terus menelepon pointer seolah itu 790 00:35:02,720 --> 00:35:04,140 menunjuk pada sesuatu? 791 00:35:04,140 --> 00:35:07,000 Jadi saya mengklaim sekarang bahwa terserah ada pointer - 792 00:35:07,000 --> 00:35:08,480 bawah tenda itu alamat. 793 00:35:08,480 --> 00:35:11,330 Tapi itu hanya menunjuk ke byte pertama dalam 794 00:35:11,330 --> 00:35:12,780 string yang telah dikembalikan. 795 00:35:12,780 --> 00:35:16,710 >> Jika saya sekarang kembali ke kode di sini, apa yang terjadi pada baris ini? 796 00:35:16,710 --> 00:35:20,020 Nah, di baris disorot sekarang, Saya menyatakan rupanya lain 797 00:35:20,020 --> 00:35:21,070 variabel yang disebut t. 798 00:35:21,070 --> 00:35:25,700 Tapi itu juga pointer, jadi saya akan menggambar sebagai, dalam teori, tepat 799 00:35:25,700 --> 00:35:26,710 kotak ukuran yang sama. 800 00:35:26,710 --> 00:35:28,160 Dan aku akan menyebutnya t. 801 00:35:28,160 --> 00:35:33,500 >> Dan sekarang jika kita kembali ke kode lagi, ketika saya menyimpan s dalam t, 802 00:35:33,500 --> 00:35:36,920 apa aku secara teknis menempatkan dalam t? 803 00:35:36,920 --> 00:35:39,350 Nah secara teknis, ini adalah nomor 123. 804 00:35:39,350 --> 00:35:42,270 Jadi benar-benar saya harus menulis nomor 123 di sana. 805 00:35:42,270 --> 00:35:43,900 Tapi mari kita bawa tingkat yang lebih tinggi. 806 00:35:43,900 --> 00:35:48,090 t, jika hanya pointer, intuitif, hanya itu. 807 00:35:48,090 --> 00:35:49,800 Itu semua yang menjadi disimpan dalam sana. 808 00:35:49,800 --> 00:35:54,970 >> Jadi sekarang dalam baris yang menarik lalu kode, ketika aku benar-benar pergi tentang 809 00:35:54,970 --> 00:36:00,680 memanfaatkan karakter nol di t, apa yang terjadi? 810 00:36:00,680 --> 00:36:06,310 Nah, t braket nol sekarang menunjuk apa karakter, mungkin? 811 00:36:06,310 --> 00:36:07,460 >> Ini menunjuk ke h. 812 00:36:07,460 --> 00:36:08,870 Karena t braket nol - 813 00:36:08,870 --> 00:36:12,490 ingat, ini adalah sintaks tua. t braket nol hanya berarti jika t adalah string, t 814 00:36:12,490 --> 00:36:15,590 braket nol berarti mendapatkan nol karakter dalam kekuatan itu. 815 00:36:15,590 --> 00:36:18,650 Jadi apa yang benar-benar berarti adalah pergi ke array ini - 816 00:36:18,650 --> 00:36:21,520 dan ya, ini mungkin 123, ini mungkin 124. 817 00:36:21,520 --> 00:36:22,790 Tapi itu semua relatif, ingat. 818 00:36:22,790 --> 00:36:25,640 Setiap kali berbicara tentang sebuah array, kita harus keuntungan berbicara tentang 819 00:36:25,640 --> 00:36:27,000 indeks relatif. 820 00:36:27,000 --> 00:36:31,120 >> Dan jadi sekarang kita hanya bisa berasumsi bahwa t braket nol h. 821 00:36:31,120 --> 00:36:35,090 Jadi jika saya sebut 2 atas di atasnya, apa yang benar-benar lakukan adalah memanfaatkan 822 00:36:35,090 --> 00:36:38,290 h huruf kecil ke huruf H. Tapi tentu saja, apa s? 823 00:36:38,290 --> 00:36:41,010 Ini menunjuk ke string sialan yang sama. 824 00:36:41,010 --> 00:36:44,200 >> Jadi ini adalah semua yang telah terjadi dalam kode ini sejauh ini. 825 00:36:44,200 --> 00:36:45,960 Jadi apa maka implikasinya? 826 00:36:45,960 --> 00:36:48,300 Bagaimana kita memperbaiki kedua masalah? 827 00:36:48,300 --> 00:36:50,870 Bagaimana kita dibandingkan dengan string yang sebenarnya? 828 00:36:50,870 --> 00:36:53,720 >> Nah intuitif, bagaimana Anda pergi tentang membandingkan dua 829 00:36:53,720 --> 00:36:55,090 string untuk kesetaraan yang sejati? 830 00:36:55,090 --> 00:36:58,920 831 00:36:58,920 --> 00:37:00,750 >> Apa artinya jika dua string adalah sama? 832 00:37:00,750 --> 00:37:04,330 Jelas tidak bahwa alamat mereka sama dalam memori, karena itulah yang rendah 833 00:37:04,330 --> 00:37:06,590 tingkat implementasi detail. 834 00:37:06,590 --> 00:37:08,360 Semua karakter yang sama. 835 00:37:08,360 --> 00:37:12,810 Jadi biarkan saya mengusulkan, dan biarkan saya memperkenalkan dalam versi salah satu compare.c 836 00:37:12,810 --> 00:37:14,970 di sini, jadi membandingkan-1.c. 837 00:37:14,970 --> 00:37:19,590 >> Mari saya mengusulkan agar kita masih mendapatkan pointer disebut s, dan toko di dalamnya 838 00:37:19,590 --> 00:37:20,610 mengembalikan nilai dari get tali. 839 00:37:20,610 --> 00:37:21,750 Mari kita lakukan hal yang sama dengan t. 840 00:37:21,750 --> 00:37:23,230 Jadi tidak ada kode yang berbeda. 841 00:37:23,230 --> 00:37:25,420 Aku akan menambahkan sedikit lebih pengecekan error sekarang. 842 00:37:25,420 --> 00:37:29,390 Jadi sekarang kita semacam mengupas kembali ini lapisan dalam CS50 apa string 843 00:37:29,390 --> 00:37:33,520 sebenarnya, kita perlu lebih anal tentang memastikan kita tidak menyalahgunakan 844 00:37:33,520 --> 00:37:35,330 nilai-nilai yang tidak valid seperti null. 845 00:37:35,330 --> 00:37:36,440 >> Jadi aku hanya akan memeriksa. 846 00:37:36,440 --> 00:37:41,490 Jika s tidak nol sama dan t tidak nol yang sama, itu berarti kita OK. 847 00:37:41,490 --> 00:37:44,460 Dapatkan String tidak mengacaukan mendapatkan salah satu dari mereka string. 848 00:37:44,460 --> 00:37:51,270 Dan Anda mungkin bisa menebak sekarang, apa tidak STR CMP mungkin lakukan? 849 00:37:51,270 --> 00:37:52,000 String membandingkan. 850 00:37:52,000 --> 00:37:55,470 >> Jadi jika Anda sudah program java sebelumnya, ini adalah seperti sama dengan metode dalam 851 00:37:55,470 --> 00:37:56,490 kelas String. 852 00:37:56,490 --> 00:37:57,890 Namun bagi Anda yang belum diprogram sebelumnya, 853 00:37:57,890 --> 00:37:59,320 ini hanyalah sebuah fungsi c. 854 00:37:59,320 --> 00:38:02,180 Ini terjadi untuk datang dalam file yang bernama string.h. 855 00:38:02,180 --> 00:38:03,830 Itulah di mana itu dinyatakan. 856 00:38:03,830 --> 00:38:05,110 >> Dan tali membandingkan - 857 00:38:05,110 --> 00:38:07,530 Aku benar-benar lupa penggunaannya, tetapi tidak pernah keberatan. 858 00:38:07,530 --> 00:38:10,470 Ingatlah bahwa kita bisa melakukan manusia, aduk membandingkan. 859 00:38:10,470 --> 00:38:12,590 Dan ini akan memunculkan Linux programmer manual. 860 00:38:12,590 --> 00:38:14,060 Dan itu, terus terang, sedikit samar. 861 00:38:14,060 --> 00:38:15,270 Tapi aku bisa melihat di sini bahwa, yep. 862 00:38:15,270 --> 00:38:17,570 Saya harus menyertakan string.h. 863 00:38:17,570 --> 00:38:20,590 >> Dan dikatakan di sini di bawah deskripsi, "yang Fungsi membandingkan string yang membandingkan 864 00:38:20,590 --> 00:38:24,560 dua string S1 dan S2. "Dan S1 dan S2 rupanya dua 865 00:38:24,560 --> 00:38:26,120 argumen berlalu masuk 866 00:38:26,120 --> 00:38:28,650 Saya tidak begitu ingat apa yang const, tapi sekarang melihat - 867 00:38:28,650 --> 00:38:31,480 dan Anda mungkin telah melihat ini sudah ketika Anda telah menggunakan halaman manual jika Anda 868 00:38:31,480 --> 00:38:32,390 memiliki semuanya - 869 00:38:32,390 --> 00:38:36,220 bahwa bintang char adalah hanya identik dengan tali. 870 00:38:36,220 --> 00:38:40,440 >> Jadi membandingkan dua string, S1 dan S2, dan mengembalikan sebuah integer kurang 871 00:38:40,440 --> 00:38:44,930 dari atau sama dengan atau lebih besar dari nol jika S1 ditemukan, masing-masing, untuk menjadi 872 00:38:44,930 --> 00:38:47,450 kurang dari, atau cocok, atau lebih besar dari S2. 873 00:38:47,450 --> 00:38:51,220 Itu hanya cara yang sangat kompleks mengatakan string membandingkan pengembalian 874 00:38:51,220 --> 00:38:55,760 nol jika dua string yang intuitif identik, karakter 875 00:38:55,760 --> 00:38:57,120 karakter untuk karakter. 876 00:38:57,120 --> 00:38:59,970 >> Ia mengembalikan angka negatif jika s, abjad, seharusnya 877 00:38:59,970 --> 00:39:01,010 datang sebelum t. 878 00:39:01,010 --> 00:39:05,300 Atau mengembalikan sejumlah positif jika s seharusnya datang setelah t 879 00:39:05,300 --> 00:39:06,170 abjad. 880 00:39:06,170 --> 00:39:08,360 Jadi dengan fungsi sederhana ini, bisa Anda, misalnya, mengurutkan 881 00:39:08,360 --> 00:39:09,770 Seluruh sekelompok kata-kata? 882 00:39:09,770 --> 00:39:13,984 >> Jadi dalam versi baru ini, aku akan untuk pergi ke depan dan membuat compare1. 883 00:39:13,984 --> 00:39:15,750 Dot slash membandingkan satu. 884 00:39:15,750 --> 00:39:18,030 Aku akan ketik halo semua huruf kecil. 885 00:39:18,030 --> 00:39:20,300 Aku akan mengetik halo dalam semua huruf kecil lagi. 886 00:39:20,300 --> 00:39:23,340 Dan untungnya sekarang menyadari Aku mengetik hal yang sama. 887 00:39:23,340 --> 00:39:27,520 >> Sementara itu, jika saya ketik halo di bawah kasus dan HELLO dalam huruf besar dan 888 00:39:27,520 --> 00:39:29,710 membandingkan mereka, saya mengetik hal yang berbeda. 889 00:39:29,710 --> 00:39:32,530 Karena tidak hanya alamat yang berbeda, tapi kami membandingkan 890 00:39:32,530 --> 00:39:35,350 karakter yang berbeda lagi dan lagi. 891 00:39:35,350 --> 00:39:37,320 >> Nah mari kita pergi dan memperbaiki satu Masalah lain sekarang. 892 00:39:37,320 --> 00:39:41,590 Mari saya membuka salah satu versi fotokopi, yang sekarang alamat 893 00:39:41,590 --> 00:39:42,900 masalah ini sebagai berikut. 894 00:39:42,900 --> 00:39:45,650 Dan yang satu ini akan terlihat sedikit lebih kompleks. 895 00:39:45,650 --> 00:39:49,320 Tapi jika Anda berpikir tentang masalah apa yang kita perlu untuk memecahkan, mudah-mudahan ini akan menjadi 896 00:39:49,320 --> 00:39:51,870 jelas hanya dalam beberapa saat sekarang. 897 00:39:51,870 --> 00:39:57,280 >> Jadi ini baris pertama, char mulai t, di istilah awam bisa seseorang mengusulkan 898 00:39:57,280 --> 00:39:59,450 apa baris ini di sini berarti? 899 00:39:59,450 --> 00:40:01,050 Char star t, apa itu lakukan? 900 00:40:01,050 --> 00:40:06,660 901 00:40:06,660 --> 00:40:07,210 >> Baik. 902 00:40:07,210 --> 00:40:09,500 Buat pointer untuk beberapa tempat dalam memori. 903 00:40:09,500 --> 00:40:10,930 Dan biarkan aku memperbaikinya sedikit. 904 00:40:10,930 --> 00:40:17,180 Mendeklarasikan variabel yang akan menyimpan alamat beberapa arang dalam memori, hanya 905 00:40:17,180 --> 00:40:18,480 menjadi sedikit lebih tepat. 906 00:40:18,480 --> 00:40:21,210 >> OK, jadi sekarang di sisi kanan, aku sudah pernah melihat salah satu fungsi 907 00:40:21,210 --> 00:40:22,660 sebelumnya, malloc. 908 00:40:22,660 --> 00:40:26,980 Tapi apa mungkin artinya? 909 00:40:26,980 --> 00:40:28,050 Alokasi memori. 910 00:40:28,050 --> 00:40:29,410 Alokasi memori. 911 00:40:29,410 --> 00:40:33,050 >> Jadi ternyata, sampai sekarang, kami belum benar-benar memiliki cara yang ampuh 912 00:40:33,050 --> 00:40:36,210 meminta sistem operasi, memberi saya beberapa memori. 913 00:40:36,210 --> 00:40:39,980 Sebaliknya, kita sekarang memiliki fungsi yang disebut malloc yang tidak tepat. 914 00:40:39,980 --> 00:40:42,960 Meskipun ini adalah sedikit gangguan sekarang, perhatikan bahwa dalam 915 00:40:42,960 --> 00:40:46,200 antara dua kurung adalah hanya akan menjadi nomor. 916 00:40:46,200 --> 00:40:48,510 Dimana aku mengetik dalam pertanyaan tanda dapat berupa angka. 917 00:40:48,510 --> 00:40:51,020 >> Dan angka tersebut berarti, memberi saya 10 byte. 918 00:40:51,020 --> 00:40:52,320 Beri aku 20 byte. 919 00:40:52,320 --> 00:40:53,820 Beri aku 100 byte. 920 00:40:53,820 --> 00:40:56,500 Dan malloc akan melakukan yang terbaik untuk meminta sistem operasi - 921 00:40:56,500 --> 00:40:57,630 Linux, dalam hal ini - 922 00:40:57,630 --> 00:40:59,630 hey, mereka adalah 100 byte RAM yang tersedia? 923 00:40:59,630 --> 00:41:04,320 Jika demikian, kembali mereka byte kepada saya oleh mengembalikan alamat dari mana 924 00:41:04,320 --> 00:41:06,610 mereka byte, mungkin? 925 00:41:06,610 --> 00:41:07,610 Yang pertama satu. 926 00:41:07,610 --> 00:41:10,460 >> Jadi di sini juga - dan ini adalah dominan di C, setiap kali Anda 927 00:41:10,460 --> 00:41:11,680 berurusan dengan alamat? 928 00:41:11,680 --> 00:41:15,830 Anda hampir selalu berhadapan dengan alamat tersebut pertama, tidak peduli seberapa besar 929 00:41:15,830 --> 00:41:19,490 sepotong memori Anda sedang diserahkan kembali, sehingga untuk berbicara. 930 00:41:19,490 --> 00:41:20,880 >> Jadi mari kita menyelam di sini. 931 00:41:20,880 --> 00:41:23,940 Saya mencoba untuk mengalokasikan berapa banyak byte, tepatnya? 932 00:41:23,940 --> 00:41:24,080 Yah. 933 00:41:24,080 --> 00:41:26,090 Panjang String s - mari kita melakukan contoh konkret. 934 00:41:26,090 --> 00:41:30,700 Jika s adalah halo, H-E-L-L-O, apa panjang string s, jelas? 935 00:41:30,700 --> 00:41:32,010 Jadi lima. 936 00:41:32,010 --> 00:41:34,590 Tapi aku melakukan ditambah 1 pada itu, mengapa? 937 00:41:34,590 --> 00:41:37,700 Mengapa saya ingin enam byte bukan lima? 938 00:41:37,700 --> 00:41:38,790 Null karakter. 939 00:41:38,790 --> 00:41:41,210 >> Saya tidak ingin meninggalkan off ini karakter null khusus. 940 00:41:41,210 --> 00:41:45,160 Karena jika saya membuat salinan Halo dan hanya melakukan H-E-L-L-O, tapi saya tidak menempatkan 941 00:41:45,160 --> 00:41:50,160 bahwa karakter khusus, komputer mungkin tidak memiliki, secara kebetulan, backslash 942 00:41:50,160 --> 00:41:51,730 nol ada untukku. 943 00:41:51,730 --> 00:41:55,570 Dan jadi jika saya sedang mencoba untuk mencari tahu Panjang kalimat, saya mungkin berpikir bahwa 944 00:41:55,570 --> 00:41:59,360 itu adalah 20 karakter, atau satu juta karakter jika saya hanya pernah terjadi 945 00:41:59,360 --> 00:42:01,050 untuk memukul nol backslash. 946 00:42:01,050 --> 00:42:05,780 >> Jadi kita perlu enam byte untuk menyimpan H-E-L-L-O, backslash nol. 947 00:42:05,780 --> 00:42:07,870 Dan kemudian ini hanya menjadi super anal. 948 00:42:07,870 --> 00:42:10,700 Misalkan saya lupa apa ukuran char adalah. 949 00:42:10,700 --> 00:42:12,020 Kami terus mengatakan itu satu byte. 950 00:42:12,020 --> 00:42:12,860 Dan biasanya. 951 00:42:12,860 --> 00:42:15,425 Secara teori, itu bisa menjadi sesuatu berbeda, pada Mac berbeda atau 952 00:42:15,425 --> 00:42:16,250 PC yang berbeda. 953 00:42:16,250 --> 00:42:19,650 >> Jadi ternyata ada operator ini disebut sizeof bahwa jika Anda lulus dengan 954 00:42:19,650 --> 00:42:22,680 nama tipe data - seperti char, atau int, atau mengambang - 955 00:42:22,680 --> 00:42:26,930 ini akan memberitahu Anda, dinamis, berapa banyak byte char a mengambil hal ini 956 00:42:26,930 --> 00:42:28,090 komputer tertentu. 957 00:42:28,090 --> 00:42:31,360 >> Jadi ini hanya efektif seperti mengatakan kali 1 atau 958 00:42:31,360 --> 00:42:32,440 kali tidak ada sama sekali. 959 00:42:32,440 --> 00:42:36,340 Tapi aku melakukannya hanya untuk menjadi super anal, bahwa hanya dalam kasus char a berbeda 960 00:42:36,340 --> 00:42:40,610 pada komputer Anda dibandingkan saya, cara ini matematika selalu akan memeriksa. 961 00:42:40,610 --> 00:42:43,720 >> Terakhir, di sini saya memeriksa null, yang selalu praktek yang baik - sekali lagi, 962 00:42:43,720 --> 00:42:44,920 setiap saat kita sedang berhadapan dengan pointer. 963 00:42:44,920 --> 00:42:47,520 Jika malloc tidak mampu memberikan saya enam bye - yang 964 00:42:47,520 --> 00:42:49,210 mungkin, tetapi hanya dalam kasus - 965 00:42:49,210 --> 00:42:50,730 kembali satu segera. 966 00:42:50,730 --> 00:42:53,290 Dan sekarang, maju dan menyalin string sebagai berikut. 967 00:42:53,290 --> 00:42:57,240 Dan ini adalah sintaks akrab, meskipun dalam peran yang berbeda. 968 00:42:57,240 --> 00:43:01,210 >> Aku akan pergi ke depan dan mendapatkan string panjang s dan menyimpannya dalam n. 969 00:43:01,210 --> 00:43:06,620 Saya kemudian pergi untuk beralih dari i sama nol sampai dengan n, 970 00:43:06,620 --> 00:43:08,410 lebih besar dari atau sama dengan. 971 00:43:08,410 --> 00:43:13,540 Sehingga pada setiap iterasi, saya menempatkan Karakter engan s di engan 972 00:43:13,540 --> 00:43:15,380 karakter t. 973 00:43:15,380 --> 00:43:18,190 >> Jadi apa yang sebenarnya terjadi di bawah kap di sini? 974 00:43:18,190 --> 00:43:22,140 Nah jika hal ini, misalnya, adalah s - 975 00:43:22,140 --> 00:43:26,400 dan saya telah mengetik kata H-E-L-L-O dan ada nol backslash. 976 00:43:26,400 --> 00:43:29,020 Dan lagi, ini adalah s menunjuk sini. 977 00:43:29,020 --> 00:43:30,830 Dan di sini sekarang adalah t. 978 00:43:30,830 --> 00:43:34,860 >> Dan ini menunjuk sekarang untuk salinan memori, kan? 979 00:43:34,860 --> 00:43:37,340 Malloc telah memberi saya seluruh sepotong memori. 980 00:43:37,340 --> 00:43:41,440 Saya tidak tahu awalnya apa di salah satu lokasi. 981 00:43:41,440 --> 00:43:44,340 Jadi aku akan menganggap ini sebagai sejumlah tanda tanya. 982 00:43:44,340 --> 00:43:50,190 >> Tapi begitu aku mulai perulangan dari nol ke atas melalui panjang s, t 983 00:43:50,190 --> 00:43:52,790 braket nol dan t braket 1 - 984 00:43:52,790 --> 00:43:55,080 dan aku akan menempatkan ini sekarang pada biaya overhead - 985 00:43:55,080 --> 00:44:04,190 t braket nol dan s braket nol berarti bahwa aku akan menyalin 986 00:44:04,190 --> 00:44:09,875 iteratif jam dalam sini, E-L-L-O. Plus, karena saya melakukan ditambah 987 00:44:09,875 --> 00:44:12,370 1, backslash nol. 988 00:44:12,370 --> 00:44:19,060 >> Jadi sekarang dalam kasus membandingkan-1.c, pada akhirnya, jika saya mencetak 989 00:44:19,060 --> 00:44:24,760 kapitalisasi t, kita harus melihat bahwa s tidak berubah. 990 00:44:24,760 --> 00:44:26,090 Biarkan aku pergi ke depan sekarang dan melakukan hal ini. 991 00:44:26,090 --> 00:44:28,630 Jadi membuat COPY1. 992 00:44:28,630 --> 00:44:30,860 Dot slash COPY1. 993 00:44:30,860 --> 00:44:33,670 Aku akan mengetik halo, Enter. 994 00:44:33,670 --> 00:44:37,430 Dan sekarang perhatikan, hanya salinan telah dikapitalisasi. 995 00:44:37,430 --> 00:44:40,890 Karena aku benar-benar memiliki dua potongan memori. 996 00:44:40,890 --> 00:44:44,390 >> Sayangnya, Anda dapat melakukan beberapa cukup hal-hal buruk dan cukup berbahaya di sini. 997 00:44:44,390 --> 00:44:49,290 Biarkan aku menarik contoh di sini sekarang, yang memberi kita contoh beberapa 998 00:44:49,290 --> 00:44:51,540 baris yang berbeda. 999 00:44:51,540 --> 00:44:56,040 Jadi hanya intuitif sini, baris pertama kode, int star x, menyatakan 1000 00:44:56,040 --> 00:44:57,340 variabel disebut x. 1001 00:44:57,340 --> 00:44:58,810 Dan apa tipe data variabel itu? 1002 00:44:58,810 --> 00:45:01,820 1003 00:45:01,820 --> 00:45:04,290 Apa jenis data variabel itu? 1004 00:45:04,290 --> 00:45:06,980 Itu bukan cliffhanger tersebut. 1005 00:45:06,980 --> 00:45:08,350 >> Tipe data int adalah bintang. 1006 00:45:08,350 --> 00:45:12,600 Jadi apa artinya? x akan menyimpan alamat dari sebuah int. 1007 00:45:12,600 --> 00:45:13,520 Sesederhana itu. 1008 00:45:13,520 --> 00:45:16,220 Y akan menyimpan alamat int. 1009 00:45:16,220 --> 00:45:18,390 Apa baris ketiga kode lakukan di sana? 1010 00:45:18,390 --> 00:45:21,850 Ini mengalokasikan berapa banyak byte, kemungkinan besar? 1011 00:45:21,850 --> 00:45:22,350 Empat. 1012 00:45:22,350 --> 00:45:25,460 Karena ukuran int adalah umumnya empat, malloc empat memberikan 1013 00:45:25,460 --> 00:45:29,950 saya kembali alamat sepotong memori, yang pertama dari yang byte 1014 00:45:29,950 --> 00:45:32,110 disimpan sekarang x. 1015 00:45:32,110 --> 00:45:34,410 >> Sekarang kita bergerak sedikit cepat. 1016 00:45:34,410 --> 00:45:35,760 Bintang x berarti apa? 1017 00:45:35,760 --> 00:45:38,480 1018 00:45:38,480 --> 00:45:42,590 Ini berarti pergi ke alamat tersebut dan menempatkan nomor berapa di sana? 1019 00:45:42,590 --> 00:45:43,870 Masukan nomor 42 di sana. 1020 00:45:43,870 --> 00:45:47,590 Bintang y berarti pergi ke apa yang di y dan memasukkan nomor 13 di sana. 1021 00:45:47,590 --> 00:45:48,600 >> Tapi tunggu sebentar. 1022 00:45:48,600 --> 00:45:51,640 Apa yang ada di y saat ini? 1023 00:45:51,640 --> 00:45:54,950 Apa alamat y menyimpan? 1024 00:45:54,950 --> 00:45:55,770 Kita tidak tahu, kan? 1025 00:45:55,770 --> 00:45:59,230 Kami tidak pernah menggunakan tugas Operator yang melibatkan y. 1026 00:45:59,230 --> 00:46:03,370 Jadi y sebagai dideklarasikan pada baris kedua Kode hanya beberapa nilai sampah, besar 1027 00:46:03,370 --> 00:46:04,760 tanda tanya sehingga untuk berbicara. 1028 00:46:04,760 --> 00:46:07,230 Ini bisa menunjuk secara acak untuk apa pun di memori, yang 1029 00:46:07,230 --> 00:46:08,340 umumnya buruk. 1030 00:46:08,340 --> 00:46:13,540 >> Jadi, segera setelah kita memukul garis yang ada, star y sama dengan 13, sesuatu yang buruk, 1031 00:46:13,540 --> 00:46:17,220 sesuatu yang sangat buruk adalah tentang terjadi pada Binky. 1032 00:46:17,220 --> 00:46:25,810 Jadi mari kita lihat apa yang akan berakhir terjadi pada Binky sini dalam satu menit ini 1033 00:46:25,810 --> 00:46:26,200 atau lebih terlihat. 1034 00:46:26,200 --> 00:46:26,490 >> [VIDEO PEMUTARAN] 1035 00:46:26,490 --> 00:46:26,745 >> -Hei, Binky. 1036 00:46:26,745 --> 00:46:27,000 Bangun. 1037 00:46:27,000 --> 00:46:29,296 Sudah waktunya untuk pointer menyenangkan. 1038 00:46:29,296 --> 00:46:30,680 >> -Apa itu? 1039 00:46:30,680 --> 00:46:31,980 Pelajari tentang pointer? 1040 00:46:31,980 --> 00:46:34,010 Oh, goodie. 1041 00:46:34,010 --> 00:46:37,220 >> -Nah, untuk memulai, saya kira kita akan membutuhkan beberapa petunjuk. 1042 00:46:37,220 --> 00:46:37,930 >> -OK. 1043 00:46:37,930 --> 00:46:41,650 Kode ini mengalokasikan dua pointer yang dapat menunjukkan bilangan bulat. 1044 00:46:41,650 --> 00:46:43,760 >> -OK, baik, saya melihat dua pointer. 1045 00:46:43,760 --> 00:46:45,850 Tapi mereka tampaknya tidak menjadi menunjuk ke sesuatu. 1046 00:46:45,850 --> 00:46:46,490 >> -Itu benar. 1047 00:46:46,490 --> 00:46:48,630 Awalnya, pointer tidak menunjukkan apa pun. 1048 00:46:48,630 --> 00:46:51,700 Hal-hal yang mereka menunjukkan disebut pointees, dan menyiapkannya adalah 1049 00:46:51,700 --> 00:46:52,850 langkah terpisah. 1050 00:46:52,850 --> 00:46:53,740 >> -Oh, benar, benar. 1051 00:46:53,740 --> 00:46:54,500 Saya tahu itu. 1052 00:46:54,500 --> 00:46:56,270 Para pointees terpisah. 1053 00:46:56,270 --> 00:46:58,553 Jadi bagaimana Anda mengalokasikan sebuah Pointee? 1054 00:46:58,553 --> 00:46:59,480 >> -OK. 1055 00:46:59,480 --> 00:47:03,707 Nah, kode ini mengalokasikan bilangan bulat baru Pointee, dan bagian ini menetapkan x 1056 00:47:03,707 --> 00:47:05,520 untuk menunjuk ke itu. 1057 00:47:05,520 --> 00:47:06,760 >> -Hei, yang terlihat lebih baik. 1058 00:47:06,760 --> 00:47:08,520 Jadi membuatnya melakukan sesuatu. 1059 00:47:08,520 --> 00:47:09,530 >> -OK. 1060 00:47:09,530 --> 00:47:14,110 Aku akan dereference pointer x untuk menyimpan nomor 42 ke Pointee nya. 1061 00:47:14,110 --> 00:47:17,660 Untuk trik ini, saya perlu saya sihir tongkat dereferencing. 1062 00:47:17,660 --> 00:47:20,695 >> -Anda tongkat sihir dereferencing? 1063 00:47:20,695 --> 00:47:22,632 Eh, itu bagus. 1064 00:47:22,632 --> 00:47:24,620 >> -Ini adalah apa yang tampak seperti kode. 1065 00:47:24,620 --> 00:47:27,526 Aku hanya akan mengatur nomor, dan - 1066 00:47:27,526 --> 00:47:28,250 >> -Hei, lihat. 1067 00:47:28,250 --> 00:47:29,680 Ada kelanjutannya. 1068 00:47:29,680 --> 00:47:34,520 Jadi melakukan dereference pada x berikut panah untuk mengakses Pointee nya. 1069 00:47:34,520 --> 00:47:36,690 Dalam hal ini, untuk menyimpan 42 di sana. 1070 00:47:36,690 --> 00:47:40,890 Hei, coba gunakan untuk menyimpan nomor 13 melalui pointer lain, y. 1071 00:47:40,890 --> 00:47:42,125 >> -OK. 1072 00:47:42,125 --> 00:47:46,810 Aku hanya akan pergi ke sini untuk y dan mendapatkan angka 13 mengatur. 1073 00:47:46,810 --> 00:47:50,890 Dan kemudian mengambil tongkat dereferencing dan hanya - 1074 00:47:50,890 --> 00:47:52,430 whoa! 1075 00:47:52,430 --> 00:47:53,030 >> -Oh, hey. 1076 00:47:53,030 --> 00:47:54,610 Itu tidak berhasil. 1077 00:47:54,610 --> 00:47:58,200 Katakanlah, Binky, saya tidak berpikir dereferencing y adalah ide yang baik, 1078 00:47:58,200 --> 00:48:01,370 karena menyiapkan Pointee merupakan langkah terpisah. 1079 00:48:01,370 --> 00:48:03,460 Dan saya tidak berpikir kita pernah melakukannya. 1080 00:48:03,460 --> 00:48:03,810 >> -Hmm. 1081 00:48:03,810 --> 00:48:05,160 Good point. 1082 00:48:05,160 --> 00:48:07,410 >> -Ya, kami mengalokasikan y pointer. 1083 00:48:07,410 --> 00:48:10,045 Tapi kita tidak pernah set ke menunjuk ke sebuah Pointee. 1084 00:48:10,045 --> 00:48:10,490 >> -Hmm. 1085 00:48:10,490 --> 00:48:12,170 Sangat jeli. 1086 00:48:12,170 --> 00:48:13,790 >> -Hei, yang Anda cari baik di sana, Binky. 1087 00:48:13,790 --> 00:48:16,920 Dapatkah Anda memperbaikinya sehingga y poin ke Pointee sama dengan x? 1088 00:48:16,920 --> 00:48:17,810 >> -Tentu. 1089 00:48:17,810 --> 00:48:20,300 Saya akan menggunakan tongkat sihir saya penempatan penunjuk. 1090 00:48:20,300 --> 00:48:22,240 >> -Apakah itu akan menjadi masalah seperti sebelumnya? 1091 00:48:22,240 --> 00:48:22,665 >> -Tidak ada. 1092 00:48:22,665 --> 00:48:24,300 Ini tidak menyentuh pointees. 1093 00:48:24,300 --> 00:48:27,880 Itu hanya berubah satu pointer untuk menunjuk untuk hal yang sama seperti yang lain. 1094 00:48:27,880 --> 00:48:28,970 >> -Oh, saya melihat. 1095 00:48:28,970 --> 00:48:31,730 Sekarang y poin ke tempat yang sama dengan x. 1096 00:48:31,730 --> 00:48:32,450 Jadi tunggu. 1097 00:48:32,450 --> 00:48:33,490 Sekarang y adalah tetap. 1098 00:48:33,490 --> 00:48:34,630 Memiliki Pointee a. 1099 00:48:34,630 --> 00:48:36,520 Jadi Anda dapat mencoba tongkat dereferencing lagi 1100 00:48:36,520 --> 00:48:39,200 untuk mengirim 13 lebih. 1101 00:48:39,200 --> 00:48:39,840 >> -OK. 1102 00:48:39,840 --> 00:48:41,570 Ini dia. 1103 00:48:41,570 --> 00:48:42,870 >> -Hei, lihat itu. 1104 00:48:42,870 --> 00:48:44,320 Sekarang dereferencing bekerja pada y. 1105 00:48:44,320 --> 00:48:47,020 Dan karena pointer berbagi bahwa salah satu Pointee, mereka 1106 00:48:47,020 --> 00:48:48,585 baik melihat 13 tersebut. 1107 00:48:48,585 --> 00:48:49,040 >> -Ya. 1108 00:48:49,040 --> 00:48:49,670 Berbagi. 1109 00:48:49,670 --> 00:48:50,380 Apapun. 1110 00:48:50,380 --> 00:48:52,290 Jadi kita akan bertukar posisi sekarang? 1111 00:48:52,290 --> 00:48:52,970 >> -Oh, lihat. 1112 00:48:52,970 --> 00:48:54,150 Kami kehabisan waktu. 1113 00:48:54,150 --> 00:48:55,200 >> -Tapi - 1114 00:48:55,200 --> 00:48:57,060 >> -Hanya ingat tiga aturan pointer. 1115 00:48:57,060 --> 00:49:00,100 Nomor satu, struktur dasar adalah bahwa Anda memiliki pointer. 1116 00:49:00,100 --> 00:49:02,170 Dan itu menunjukkan ke Pointee a. 1117 00:49:02,170 --> 00:49:04,160 Tapi pointer dan Pointee terpisah. 1118 00:49:04,160 --> 00:49:06,460 Dan kesalahan umum adalah untuk mengatur pointer, tetapi untuk 1119 00:49:06,460 --> 00:49:08,540 lupa untuk diberikan Pointee a. 1120 00:49:08,540 --> 00:49:12,460 >> Nomor dua, pointer dereferencing dimulai pada pointer dan berikut nya 1121 00:49:12,460 --> 00:49:14,570 panah atas untuk mengakses Pointee nya. 1122 00:49:14,570 --> 00:49:18,640 Seperti kita semua tahu, ini hanya bekerja jika ada adalah Pointee, yang akan kembali ke 1123 00:49:18,640 --> 00:49:19,790 aturan nomor satu. 1124 00:49:19,790 --> 00:49:23,670 >> Nomor tiga, penempatan penunjuk membutuhkan satu pointer dan perubahan untuk menunjuk ke 1125 00:49:23,670 --> 00:49:25,850 yang Pointee sama dengan pointer lain. 1126 00:49:25,850 --> 00:49:27,840 Jadi setelah penugasan, dua pointer akan 1127 00:49:27,840 --> 00:49:29,430 menunjuk ke Pointee yang sama. 1128 00:49:29,430 --> 00:49:31,600 Kadang-kadang disebut berbagi. 1129 00:49:31,600 --> 00:49:33,430 Dan itu semua ada untuk itu, benar-benar. 1130 00:49:33,430 --> 00:49:33,840 Bye bye sekarang. 1131 00:49:33,840 --> 00:49:34,300 >> [END VIDEO PEMUTARAN] 1132 00:49:34,300 --> 00:49:36,940 >> DAVID Malan: Jadi lebih pada pointer, lebih lanjut tentang Binky minggu depan. 1133 00:49:36,940 --> 00:49:38,190 Kita akan melihat Anda pada hari Senin. 1134 00:49:38,190 --> 00:49:42,187