1 00:00:00,000 --> 00:00:06,030 >> [Bermain muzik] 2 00:00:06,030 --> 00:00:08,390 >> DOUG LLOYD: Penunjuk, di sini kita berada. 3 00:00:08,390 --> 00:00:11,080 Ini mungkin akan menjadi topik yang paling sukar 4 00:00:11,080 --> 00:00:12,840 bahawa kita bercakap kira-kira dalam CS50. 5 00:00:12,840 --> 00:00:15,060 Dan jika anda telah membaca apa-apa mengenai petunjuk 6 00:00:15,060 --> 00:00:19,080 sebelum anda mungkin menjadi sedikit menakutkan pergi ke video ini. 7 00:00:19,080 --> 00:00:21,260 Memang benar petunjuk yang membolehkan anda keupayaan 8 00:00:21,260 --> 00:00:23,740 untuk mungkin skru sehingga cukup teruk apabila anda berada 9 00:00:23,740 --> 00:00:27,450 bekerja dengan pembolehubah, dan data, dan menyebabkan program anda crash. 10 00:00:27,450 --> 00:00:30,490 Tetapi mereka benar-benar benar-benar berguna dan mereka membenarkan kita cara yang benar-benar hebat 11 00:00:30,490 --> 00:00:33,340 untuk lulus data kembali dan alik antara fungsi, 12 00:00:33,340 --> 00:00:35,490 bahawa kita jika tidak dapat berbuat. 13 00:00:35,490 --> 00:00:37,750 >> Dan supaya apa yang kita benar-benar mahu lakukan di sini adalah kereta api 14 00:00:37,750 --> 00:00:41,060 anda mempunyai disiplin penunjuk yang baik, jadi yang boleh anda gunakan petunjuk berkesan 15 00:00:41,060 --> 00:00:43,850 untuk membuat program-program anda yang lebih baik. 16 00:00:43,850 --> 00:00:48,220 Seperti yang saya katakan petunjuk memberikan kita berbeza cara untuk lulus data antara fungsi. 17 00:00:48,220 --> 00:00:50,270 Sekarang jika anda ingat dari video yang lebih awal, apabila 18 00:00:50,270 --> 00:00:53,720 kita bercakap tentang skop berubah-ubah, yang saya sebutkan 19 00:00:53,720 --> 00:01:00,610 bahawa semua data yang kita melepasi antara fungsi dalam C diluluskan oleh nilai. 20 00:01:00,610 --> 00:01:03,070 Dan saya tidak mungkin telah digunakan yang jangka panjang, apa yang saya maksudkan di sana 21 00:01:03,070 --> 00:01:07,170 adalah bahawa kita sedang dalam perjalanan salinan data. 22 00:01:07,170 --> 00:01:12,252 Apabila kita lulus pembolehubah ke fungsi, kita sebenarnya tidak lulus pembolehubah 23 00:01:12,252 --> 00:01:13,210 untuk majlis itu, bukan? 24 00:01:13,210 --> 00:01:17,670 Kita lulus salinan bahawa data ke majlis itu. 25 00:01:17,670 --> 00:01:20,760 Majlis tersebut melakukan apa yang ia akan dan ia mengira beberapa nilai, 26 00:01:20,760 --> 00:01:23,180 dan mungkin kita menggunakan nilai yang apabila ia memberi kembali. 27 00:01:23,180 --> 00:01:26,700 >> Terdapat satu pengecualian kepada peraturan ini lulus dengan nilai, 28 00:01:26,700 --> 00:01:31,210 dan kami akan kembali kepada apa yang adalah sedikit kemudian di dalam video ini. 29 00:01:31,210 --> 00:01:34,880 Jika kita menggunakan petunjuk dan bukannya menggunakan pembolehubah, 30 00:01:34,880 --> 00:01:38,180 atau daripada menggunakan pembolehubah diri sendiri atau salinan pembolehubah, 31 00:01:38,180 --> 00:01:43,790 kita kini boleh lulus pembolehubah sekitar antara fungsi dalam cara yang berbeza. 32 00:01:43,790 --> 00:01:46,550 Ini bermakna bahawa jika kita membuat perubahan dalam satu fungsi, 33 00:01:46,550 --> 00:01:49,827 perubahan yang benar-benar akan mengambil melaksanakan fungsi yang berbeza. 34 00:01:49,827 --> 00:01:52,160 Sekali lagi, ini adalah sesuatu yang kita tidak boleh melakukannya sebelum ini, 35 00:01:52,160 --> 00:01:56,979 dan jika anda pernah mencuba untuk menukar nilai dua pembolehubah dalam fungsi, 36 00:01:56,979 --> 00:01:59,270 anda dapati masalah ini jenis menjalar, bukan? 37 00:01:59,270 --> 00:02:04,340 >> Jika kita mahu menukar X dan Y, dan kami menyampaikannya kepada fungsi yang dipanggil swap, 38 00:02:04,340 --> 00:02:08,680 dalam fungsi yang menukar pembolehubah melakukan nilai pertukaran. 39 00:02:08,680 --> 00:02:12,600 Satu menjadi dua, dua menjadi satu, tetapi kita tidak benar-benar 40 00:02:12,600 --> 00:02:16,890 mengubah apa-apa dalam asal fungsi, dalam pemanggil. 41 00:02:16,890 --> 00:02:19,550 Kerana kita tidak boleh, kami hanya bekerja dengan salinan-salinannya. 42 00:02:19,550 --> 00:02:24,760 Dengan petunjuk walaupun, kita boleh sebenarnya lulus X dan Y ke fungsi. 43 00:02:24,760 --> 00:02:26,960 Fungsi yang boleh dilakukan sesuatu dengan mereka. 44 00:02:26,960 --> 00:02:29,250 Dan nilai-nilai pembolehubah sebenarnya boleh berubah. 45 00:02:29,250 --> 00:02:33,710 Supaya agak perubahan dalam keupayaan kita untuk bekerja dengan data. 46 00:02:33,710 --> 00:02:36,100 >> Sebelum kita menyelam ke dalam petunjuk, saya fikir ia adalah bernilai 47 00:02:36,100 --> 00:02:38,580 mengambil masa beberapa minit untuk kembali kepada asas di sini. 48 00:02:38,580 --> 00:02:41,000 Dan kita lihat bagaimana kerja-kerja memori komputer 49 00:02:41,000 --> 00:02:45,340 kerana kedua-dua mata pelajaran yang akan untuk benar-benar menjadi cukup saling berkaitan. 50 00:02:45,340 --> 00:02:48,480 Seperti yang anda mungkin tahu, pada sistem komputer anda 51 00:02:48,480 --> 00:02:51,310 anda mempunyai pemacu keras atau mungkin satu pemacu keadaan pepejal, 52 00:02:51,310 --> 00:02:54,430 semacam lokasi penyimpanan fail. 53 00:02:54,430 --> 00:02:57,950 Ia biasanya di suatu tempat di kejiranan 250 gigabait 54 00:02:57,950 --> 00:02:59,810 untuk mungkin beberapa terabytes sekarang. 55 00:02:59,810 --> 00:03:02,270 Dan ia adalah di mana semua anda fail akhirnya hidup, 56 00:03:02,270 --> 00:03:04,870 walaupun komputer anda ditutup di luar, anda boleh hidupkannya semula 57 00:03:04,870 --> 00:03:09,190 dan anda akan mendapati fail anda berada di sana sekali lagi apabila anda reboot sistem anda. 58 00:03:09,190 --> 00:03:14,820 Tetapi pemacu cakera, seperti pemacu cakera keras, HDD, atau pemacu keadaan pepejal, SSD, 59 00:03:14,820 --> 00:03:16,050 adalah ruang simpanan adil. 60 00:03:16,050 --> 00:03:20,400 >> Kita tidak boleh benar-benar melakukan apa-apa dengan data yang ada dalam cakera keras, 61 00:03:20,400 --> 00:03:22,080 atau dalam pemacu keadaan pepejal. 62 00:03:22,080 --> 00:03:24,950 Dalam usaha untuk benar-benar mengubah data atau bergerak di sekitar, 63 00:03:24,950 --> 00:03:28,800 kita perlu bergerak ke RAM, capaian ingatan rawak. 64 00:03:28,800 --> 00:03:31,170 Sekarang RAM, anda mempunyai banyak kurang dalam komputer anda. 65 00:03:31,170 --> 00:03:34,185 Anda mungkin mempunyai suatu tempat di kawasan kejiranan 512 megabait 66 00:03:34,185 --> 00:03:38,850 jika anda mempunyai komputer yang lebih tua, kepada mungkin dua, empat, lapan, 16, 67 00:03:38,850 --> 00:03:41,820 mungkin juga sedikit lanjut, gigabait RAM. 68 00:03:41,820 --> 00:03:46,390 Jadi, itu jauh lebih kecil, tetapi itu di mana semua data yang tidak menentu wujud. 69 00:03:46,390 --> 00:03:48,270 Itulah di mana kita boleh mengubah keadaan. 70 00:03:48,270 --> 00:03:53,350 Tetapi apabila kita menghidupkan komputer kita di luar, semua data dalam RAM dimusnahkan. 71 00:03:53,350 --> 00:03:57,150 >> Jadi itulah sebabnya kita perlu mempunyai cakera keras untuk lokasi yang lebih kekal daripada itu, 72 00:03:57,150 --> 00:03:59,720 supaya ia wujud- ia akan menjadi benar-benar buruk jika setiap kali kita 73 00:03:59,720 --> 00:04:03,310 bertukar komputer kita di luar, setiap fail dalam sistem kami telah dipadamkan. 74 00:04:03,310 --> 00:04:05,600 Oleh itu, kita bekerja di dalam RAM. 75 00:04:05,600 --> 00:04:09,210 Dan setiap kali kita bercakap tentang ingatan, cukup banyak, di CS50, 76 00:04:09,210 --> 00:04:15,080 kita berbicara tentang RAM, bukan cakera keras. 77 00:04:15,080 --> 00:04:18,657 >> Oleh itu, apabila kita bergerak sesuatu ke dalam ingatan, ia mengambil masa sehingga jumlah tertentu ruang. 78 00:04:18,657 --> 00:04:20,740 Semua jenis data yang kita telah bekerja dengan 79 00:04:20,740 --> 00:04:23,480 mengambil yang berbeza jumlah ruang dalam RAM. 80 00:04:23,480 --> 00:04:27,600 Jadi setiap kali anda membuat integer berubah-ubah, empat bait memori 81 00:04:27,600 --> 00:04:30,750 diketepikan dalam RAM supaya anda boleh bekerja dengan integer itu. 82 00:04:30,750 --> 00:04:34,260 Anda boleh mengisytiharkan integer, mengubahnya, sediakan 83 00:04:34,260 --> 00:04:36,700 kepada nilai 10 incremented demi satu, sebagainya dan sebagainya. 84 00:04:36,700 --> 00:04:39,440 Semua yang perlu berlaku dalam RAM, dan anda mendapat empat bait 85 00:04:39,440 --> 00:04:42,550 untuk bekerja dengan untuk setiap integer yang anda buat. 86 00:04:42,550 --> 00:04:45,410 >> Setiap watak anda mewujudkan mendapat satu bait. 87 00:04:45,410 --> 00:04:48,160 Itu hanya berapa banyak ruang yang yang diperlukan untuk menyimpan watak. 88 00:04:48,160 --> 00:04:51,310 Setiap terapung, yang sebenar nombor, mendapat empat bait 89 00:04:51,310 --> 00:04:53,390 melainkan jika ia adalah dua ketepatan titik terapung 90 00:04:53,390 --> 00:04:56,510 nombor, yang membolehkan anda untuk mempunyai angka yang lebih tepat atau lebih 91 00:04:56,510 --> 00:04:59,300 selepas titik perpuluhan tanpa kehilangan ketepatan, 92 00:04:59,300 --> 00:05:01,820 yang mengambil masa sehingga lapan bait ingatan. 93 00:05:01,820 --> 00:05:06,730 Roh meronta-ronta Long, bilangan bulat yang sangat besar, juga mengambil lapan bait ingatan. 94 00:05:06,730 --> 00:05:09,000 Berapa banyak bait memori jangan rentetan mengambil? 95 00:05:09,000 --> 00:05:12,990 Nah mari kita meletakkan pin dalam soalan yang buat masa ini, tetapi kita akan kembali kepadanya. 96 00:05:12,990 --> 00:05:17,350 >> Jadi kembali kepada idea ini memori pelbagai besar sel-sel bait dapur. 97 00:05:17,350 --> 00:05:20,871 Itu benar-benar semua itu, adalah hanya pelbagai besar sel-sel, 98 00:05:20,871 --> 00:05:23,370 seperti mana-mana lokasi lain yang anda biasa dengan dan lihat, 99 00:05:23,370 --> 00:05:26,430 kecuali setiap elemen adalah satu bait luas. 100 00:05:26,430 --> 00:05:30,030 Dan seperti array, setiap elemen mempunyai alamat. 101 00:05:30,030 --> 00:05:32,120 Setiap elemen array mempunyai indeks, dan kami 102 00:05:32,120 --> 00:05:36,302 boleh menggunakan indeks bahawa untuk melakukan apa yang dipanggil capaian rawak pada array. 103 00:05:36,302 --> 00:05:38,510 Kami tidak perlu bermula pada permulaan array, 104 00:05:38,510 --> 00:05:40,569 melelar melalui setiap elemen tunggal itu, 105 00:05:40,569 --> 00:05:41,860 untuk mencari apa yang kita cari. 106 00:05:41,860 --> 00:05:45,790 Kami hanya boleh berkata, saya mahu untuk sampai ke Unsur-15 atau unsur ke-100. 107 00:05:45,790 --> 00:05:49,930 Dan anda hanya boleh lulus dalam jumlah itu dan mendapatkan nilai yang anda cari. 108 00:05:49,930 --> 00:05:54,460 >> Begitu juga setiap lokasi dalam ingatan mempunyai alamat. 109 00:05:54,460 --> 00:05:57,320 Jadi ingatan anda mungkin melihat sesuatu seperti ini. 110 00:05:57,320 --> 00:06:01,420 Berikut adalah sebahagian yang sangat kecil memori, ini adalah 20 bait ingatan. 111 00:06:01,420 --> 00:06:04,060 20 bait pertama kerana saya menangani terdapat di bahagian bawah 112 00:06:04,060 --> 00:06:08,890 0, 1, 2, 3, dan sebagainya pada semua jalan sehingga ke 19. 113 00:06:08,890 --> 00:06:13,190 Dan apabila saya mengisytiharkan pembolehubah dan apabila saya mula bekerja dengan mereka, 114 00:06:13,190 --> 00:06:15,470 sistem ini akan menetapkan mengetepikan sedikit ruang untuk saya 115 00:06:15,470 --> 00:06:17,595 dalam ingatan ini untuk bekerja dengan pembolehubah saya. 116 00:06:17,595 --> 00:06:21,610 Jadi saya mungkin berkata, char c sama dengan modal H. Dan apa yang akan berlaku? 117 00:06:21,610 --> 00:06:23,880 Well sistem akan diperuntukkan untuk saya satu bait. 118 00:06:23,880 --> 00:06:27,870 Dalam kes ini ia memilih bilangan bait empat, bait di alamat empat, 119 00:06:27,870 --> 00:06:31,310 dan ia akan menyimpan H modal surat di sana untuk saya. 120 00:06:31,310 --> 00:06:34,350 Jika saya kemudian berkata kelajuan int had sama dengan 65, ia adalah 121 00:06:34,350 --> 00:06:36,806 akan mengetepikan empat bait memori untuk saya. 122 00:06:36,806 --> 00:06:39,180 Dan ia akan jadikan orang-orang empat bait sebagai satu unit tunggal 123 00:06:39,180 --> 00:06:41,305 kerana apa yang kita sedang berusaha dengan adalah integer di sini. 124 00:06:41,305 --> 00:06:44,350 Dan ia akan menyimpan 65 di sana. 125 00:06:44,350 --> 00:06:47,000 >> Kini sudah saya jenis memberitahu anda sedikit pembohongan, 126 00:06:47,000 --> 00:06:50,150 betul, kerana kita tahu bahawa komputer bekerja dalam perduaan. 127 00:06:50,150 --> 00:06:53,100 Mereka tidak faham semestinya apa yang H modal adalah 128 00:06:53,100 --> 00:06:57,110 atau apa yang 65 adalah, mereka hanya memahami binari, sifar dan satu. 129 00:06:57,110 --> 00:06:59,000 Dan sebagainya sebenarnya apa kita menyimpan di sana 130 00:06:59,000 --> 00:07:03,450 tidak H huruf dan nombor 65, tetapi perwakilan perduaan 131 00:07:03,450 --> 00:07:06,980 itu, yang kelihatan sedikit sesuatu seperti ini. 132 00:07:06,980 --> 00:07:10,360 Dan khususnya dalam konteks pembolehubah integer, 133 00:07:10,360 --> 00:07:13,559 ia tidak akan hanya meludah ke dalam, ia tidak akan menganggap ia sebagai satu empat 134 00:07:13,559 --> 00:07:15,350 bait sebahagian semestinya, ia sebenarnya akan 135 00:07:15,350 --> 00:07:19,570 untuk merawat ia sebagai satu ketulan empat bait, yang mungkin kelihatan seperti ini. 136 00:07:19,570 --> 00:07:22,424 Dan walaupun ini tidak sepenuhnya benar sama ada, 137 00:07:22,424 --> 00:07:24,840 kerana sesuatu yang dipanggil yang endianness, yang kita tidak 138 00:07:24,840 --> 00:07:26,965 akan masuk ke dalam sekarang, tetapi jika anda ingin tahu tentang, 139 00:07:26,965 --> 00:07:29,030 anda boleh membaca tentang sedikit dan endianness besar. 140 00:07:29,030 --> 00:07:31,640 Tetapi demi hujah ini, demi video ini, 141 00:07:31,640 --> 00:07:34,860 mari kita hanya menganggap bahawa, dalam Malah, berapa jumlah 65 akan 142 00:07:34,860 --> 00:07:36,970 diwakili dalam memori pada setiap sistem, 143 00:07:36,970 --> 00:07:38,850 walaupun ia tidak sepenuhnya benar. 144 00:07:38,850 --> 00:07:41,700 >> Tetapi mari kita sebenarnya hanya mendapat menghilangkan semua binari sepenuhnya, 145 00:07:41,700 --> 00:07:44,460 dan hanya berfikir tentang sebagai H dan 65, ia adalah lebih mudah 146 00:07:44,460 --> 00:07:47,900 untuk berfikir mengenainya seperti bahawa sebagai seorang manusia. 147 00:07:47,900 --> 00:07:51,420 Baiklah, jadi ia juga seolah-olah mungkin satu sedikit rawak yang I've- sistem saya 148 00:07:51,420 --> 00:07:55,130 tidak memberi saya bytes 5, 6, 7, dan 8 untuk menyimpan integer. 149 00:07:55,130 --> 00:07:58,580 Ada sebab untuk itu, juga, yang kami tidak akan masuk ke dalam sekarang, tetapi memadai 150 00:07:58,580 --> 00:08:00,496 untuk mengatakan bahawa apa yang komputer lakukan di sini 151 00:08:00,496 --> 00:08:02,810 mungkin satu langkah yang baik di pihaknya. 152 00:08:02,810 --> 00:08:06,020 Untuk tidak memberi saya ingatan itulah semestinya belakang untuk kembali. 153 00:08:06,020 --> 00:08:10,490 Walaupun ia akan melakukannya sekarang jika saya ingin mendapatkan tali lain, 154 00:08:10,490 --> 00:08:13,080 dipanggil nama keluarga, dan saya mahu untuk meletakkan Lloyd di sana. 155 00:08:13,080 --> 00:08:18,360 Saya akan perlu untuk memuatkan satu watak, setiap huruf itu 156 00:08:18,360 --> 00:08:21,330 akan memerlukan satu watak, satu bait ingatan. 157 00:08:21,330 --> 00:08:26,230 Jadi, jika saya boleh meletakkan Lloyd ke dalam pelbagai saya seperti ini saya cukup baik untuk pergi, bukan? 158 00:08:26,230 --> 00:08:28,870 Apa yang hilang? 159 00:08:28,870 --> 00:08:31,840 >> Ingatlah bahawa setiap rentetan kita bekerja dengan dalam C berakhir dengan garis miring sifar, 160 00:08:31,840 --> 00:08:33,339 dan kita tidak boleh meninggalkan bahawa di sini, sama ada. 161 00:08:33,339 --> 00:08:36,090 Kita perlu mengenepikan satu bait memori untuk memegang itu supaya kita 162 00:08:36,090 --> 00:08:39,130 tahu bila rentetan kami telah berakhir. 163 00:08:39,130 --> 00:08:41,049 Jadi sekali lagi perjanjian ini cara perkara-perkara 164 00:08:41,049 --> 00:08:42,799 muncul dalam ingatan kekuatan menjadi sedikit rawak, 165 00:08:42,799 --> 00:08:44,870 tetapi ia sebenarnya adalah bagaimana kebanyakan sistem direka. 166 00:08:44,870 --> 00:08:48,330 Untuk beratur mereka dalam gandaan empat, atas sebab-sebab lagi 167 00:08:48,330 --> 00:08:50,080 bahawa kita tidak perlu masuk ke dalam sekarang. 168 00:08:50,080 --> 00:08:53,060 Tetapi ini, jadi memadai untuk mengatakan bahawa selepas tiga baris kod, 169 00:08:53,060 --> 00:08:54,810 ini adalah apa memori mungkin kelihatan seperti. 170 00:08:54,810 --> 00:08:58,930 Jika saya perlukan lokasi ingatan 4, 8, dan 12 untuk memegang data saya, 171 00:08:58,930 --> 00:09:01,100 ini adalah apa yang ingatan saya mungkin kelihatan seperti. 172 00:09:01,100 --> 00:09:04,062 >> Dan hanya terutamanya bengah di sini, apabila 173 00:09:04,062 --> 00:09:06,020 kita berbicara tentang memori alamat kita biasanya 174 00:09:06,020 --> 00:09:08,390 berbuat demikian dengan menggunakan tatatanda perenambelasan. 175 00:09:08,390 --> 00:09:12,030 Jadi kenapa pula kita tidak menukar semua ini daripada perpuluhan kepada tatatanda perenambelasan 176 00:09:12,030 --> 00:09:15,010 hanya kerana itulah umumnya bagaimana kita merujuk kepada ingatan. 177 00:09:15,010 --> 00:09:17,880 Jadi, daripada menjadi 0 melalui 19, apa yang kita ada adalah sifar 178 00:09:17,880 --> 00:09:20,340 x sifar melalui sifar x1 tiga. 179 00:09:20,340 --> 00:09:23,790 Mereka adalah 20 bait memori yang kita telah atau kita melihat di dalam imej ini 180 00:09:23,790 --> 00:09:25,540 di sini. 181 00:09:25,540 --> 00:09:29,310 >> Jadi semua itu yang berkata, mari kita melangkah jauh dari memori untuk kali kedua 182 00:09:29,310 --> 00:09:30,490 dan kembali kepada petunjuk. 183 00:09:30,490 --> 00:09:32,420 Berikut adalah yang paling penting perkara yang perlu diingat 184 00:09:32,420 --> 00:09:34,070 seperti yang kita mula bekerja dengan petunjuk. 185 00:09:34,070 --> 00:09:36,314 Penunjuk A apa-apa lebih daripada satu alamat. 186 00:09:36,314 --> 00:09:38,230 Saya akan katakan sekali lagi kerana itu yang penting, 187 00:09:38,230 --> 00:09:42,730 penunjuk apa-apa lebih daripada satu alamat. 188 00:09:42,730 --> 00:09:47,760 Penunjuk adalah alamat ke lokasi dalam ingatan di mana pembolehubah hidup. 189 00:09:47,760 --> 00:09:52,590 Mengetahui bahawa ia menjadi mudah-mudahan sedikit lebih mudah untuk bekerja dengan mereka. 190 00:09:52,590 --> 00:09:54,550 Satu lagi perkara yang saya suka lakukan adalah untuk mempunyai jenis 191 00:09:54,550 --> 00:09:58,510 gambar rajah visual yang mewakili apa yang berlaku dengan pelbagai baris kod. 192 00:09:58,510 --> 00:10:00,660 Dan kami akan melakukan ini pasangan kali dalam petunjuk, 193 00:10:00,660 --> 00:10:03,354 dan apabila kita bercakap mengenai dinamik peruntukan ingatan juga. 194 00:10:03,354 --> 00:10:06,020 Kerana saya berfikir bahawa gambar rajah ini boleh sangat membantu. 195 00:10:06,020 --> 00:10:09,540 >> Jadi, jika saya berkata sebagai contoh, int k dalam kod saya, apa yang berlaku? 196 00:10:09,540 --> 00:10:12,524 Baik apa yang pada dasarnya berlaku ialah Saya semakin diketepikan untuk saya ingatan, 197 00:10:12,524 --> 00:10:14,690 tetapi saya tidak suka berfikir tentang hal seperti itu, saya 198 00:10:14,690 --> 00:10:16,300 suka berfikir tentang hal itu seperti sebuah kotak. 199 00:10:16,300 --> 00:10:20,090 Saya mempunyai kotak dan ia berwarna hijau kerana saya 200 00:10:20,090 --> 00:10:21,750 boleh meletakkan bilangan bulat dalam kotak hijau. 201 00:10:21,750 --> 00:10:23,666 Jika ia adalah watak yang saya mungkin mempunyai sebuah kotak biru. 202 00:10:23,666 --> 00:10:27,290 Tetapi saya selalu berkata, jika saya mewujudkan kotak yang boleh menyimpan integer 203 00:10:27,290 --> 00:10:28,950 kotak yang berwarna hijau. 204 00:10:28,950 --> 00:10:33,020 Dan saya mengambil penanda kekal dan saya menulis k di sebelah itu. 205 00:10:33,020 --> 00:10:37,590 Jadi saya mempunyai kotak yang dipanggil k, ke mana saya boleh meletakkan integer. 206 00:10:37,590 --> 00:10:41,070 Oleh itu, apabila saya katakan int k, itu apa yang berlaku dalam kepala saya. 207 00:10:41,070 --> 00:10:43,140 Jika saya katakan k sama dengan lima, apa yang saya buat? 208 00:10:43,140 --> 00:10:45,110 Well, saya meletakkan lima dalam kotak, betul. 209 00:10:45,110 --> 00:10:48,670 Ini adalah agak mudah, jika Aku berkata int k, membuat kotak yang dipanggil k. 210 00:10:48,670 --> 00:10:52,040 Jika saya katakan k sama dengan 5, meletakkan lima ke dalam kotak. 211 00:10:52,040 --> 00:10:53,865 Mudah-mudahan itu bukan terlalu banyak lonjakan. 212 00:10:53,865 --> 00:10:55,990 Berikut adalah di mana perkara yang pergi sedikit menarik walaupun. 213 00:10:55,990 --> 00:11:02,590 Jika saya katakan int * pk, baik walaupun saya tidak tahu apa ini semestinya bermaksud, 214 00:11:02,590 --> 00:11:06,150 ia jelas mendapat sesuatu kaitan dengan bilangan bulat. 215 00:11:06,150 --> 00:11:08,211 Jadi saya akan mewarnakan kotak hijau-ish, 216 00:11:08,211 --> 00:11:10,210 Saya tahu ia mendapat sesuatu kaitan dengan integer, 217 00:11:10,210 --> 00:11:13,400 tetapi ia bukan integer sendiri, kerana ia adalah satu bintang int. 218 00:11:13,400 --> 00:11:15,390 Ada sesuatu yang sedikit berbeza mengenainya. 219 00:11:15,390 --> 00:11:17,620 Begitu terlibat integer-kanak, tetapi jika tidak ia 220 00:11:17,620 --> 00:11:19,830 tidak terlalu berbeza daripada apa yang kami katakan. 221 00:11:19,830 --> 00:11:24,240 Ia kotak, yang mendapat label, ia memakai pk label, 222 00:11:24,240 --> 00:11:27,280 dan ia mampu pegangan bintang int, apa sahaja mereka berada. 223 00:11:27,280 --> 00:11:29,894 Mereka mempunyai sesuatu yang boleh dilakukan dengan bilangan bulat, dengan jelas. 224 00:11:29,894 --> 00:11:31,060 Berikut adalah barisan terakhir walaupun. 225 00:11:31,060 --> 00:11:37,650 Jika saya katakan pk = & k, wah, apa yang hanya berlaku, bukan? 226 00:11:37,650 --> 00:11:41,820 Jadi nombor rawak ini, seolah-olah rawak nombor, akan dilemparkan ke dalam kotak di sana. 227 00:11:41,820 --> 00:11:44,930 Segala yang ada, adalah pk mendapat alamat k. 228 00:11:44,930 --> 00:11:52,867 Jadi, saya melekat di mana k hidup dalam ingatan, alamatnya, alamat bait itu. 229 00:11:52,867 --> 00:11:55,200 Semua yang saya lakukan adalah saya katakan nilai yang apa yang saya akan 230 00:11:55,200 --> 00:11:59,430 untuk diletakkan di dalam kotak dipanggil pk saya. 231 00:11:59,430 --> 00:12:02,080 Dan kerana perkara-perkara ini petunjuk, dan kerana mencari 232 00:12:02,080 --> 00:12:04,955 pada rentetan seperti sifar x lapan sifar c tujuh empat lapan 233 00:12:04,955 --> 00:12:07,790 dua sifar mungkin tidak begitu bermakna. 234 00:12:07,790 --> 00:12:12,390 Apabila kita biasanya menggambarkan petunjuk, kita benar-benar berbuat demikian kerana petunjuk. 235 00:12:12,390 --> 00:12:17,000 Pk memberikan kita maklumat yang kita perlu mencari k dalam ingatan. 236 00:12:17,000 --> 00:12:19,120 Jadi, pada asasnya pk mempunyai anak panah di dalamnya. 237 00:12:19,120 --> 00:12:21,670 Dan jika kita hidup panjang anak panah itu, bayangkan 238 00:12:21,670 --> 00:12:25,280 ia sesuatu yang anda boleh berjalan di atas, jika kita berjalan di sepanjang anak panah, 239 00:12:25,280 --> 00:12:29,490 di hujung sangat anak panah itu, kami akan mencari lokasi dalam ingatan 240 00:12:29,490 --> 00:12:31,390 di mana k hidup. 241 00:12:31,390 --> 00:12:34,360 Dan itu benar-benar penting kerana sekali kita tahu di mana k yang hidup, 242 00:12:34,360 --> 00:12:37,870 kita boleh mula bekerja dengan data yang bahagian dalam bahawa lokasi ingatan. 243 00:12:37,870 --> 00:12:40,780 Walaupun kami mendapat pemudi yang sedikit lebih awal daripada diri kita sendiri buat masa ini. 244 00:12:40,780 --> 00:12:42,240 >> Jadi apa penunjuk? 245 00:12:42,240 --> 00:12:45,590 Penunjuk adalah satu item data yang nilai adalah alamat ingatan. 246 00:12:45,590 --> 00:12:49,740 Itu ialah sifar x lapan barangan sifar berlaku, yang merupakan alamat ingatan. 247 00:12:49,740 --> 00:12:52,060 Mereka itu adalah satu lokasi dalam ingatan. 248 00:12:52,060 --> 00:12:55,080 Dan jenis penunjuk menerangkan kisah 249 00:12:55,080 --> 00:12:56,930 data yang anda akan dapati di bahawa alamat ingatan. 250 00:12:56,930 --> 00:12:58,810 Jadi ada bahagian kanan int bintang. 251 00:12:58,810 --> 00:13:03,690 Jika saya ikut arah anak panah itu, ia akan membawa saya ke lokasi. 252 00:13:03,690 --> 00:13:06,980 Dan lokasi itu, apa yang saya akan mendapati terdapat dalam contoh saya, 253 00:13:06,980 --> 00:13:08,240 sebuah kotak berwarna hijau. 254 00:13:08,240 --> 00:13:12,650 Ia adalah integer, itulah yang saya akan mencari jika saya pergi ke alamat tersebut. 255 00:13:12,650 --> 00:13:14,830 Jenis data yang penunjuk menerangkan apa 256 00:13:14,830 --> 00:13:17,936 anda akan dapati di bahawa alamat ingatan. 257 00:13:17,936 --> 00:13:19,560 Jadi di sini adalah perkara yang benar-benar sejuk walaupun. 258 00:13:19,560 --> 00:13:25,090 Penunjuk membolehkan kita untuk lulus pembolehubah antara fungsi. 259 00:13:25,090 --> 00:13:28,520 Dan sebenarnya lulus pembolehubah dan tidak lulus salinan-salinannya. 260 00:13:28,520 --> 00:13:32,879 Kerana jika kita tahu di mana dalam ingatan untuk mencari pembolehubah, 261 00:13:32,879 --> 00:13:35,670 kita tidak perlu membuat salinan , kita hanya boleh pergi ke lokasi tersebut 262 00:13:35,670 --> 00:13:37,844 dan bekerja dengan pembolehubah itu. 263 00:13:37,844 --> 00:13:40,260 Jadi dalam petunjuk intipati jenis untuk membuat persekitaran komputer 264 00:13:40,260 --> 00:13:42,360 lebih banyak seperti dunia sebenar, betul. 265 00:13:42,360 --> 00:13:44,640 >> Jadi di sini adalah analogi. 266 00:13:44,640 --> 00:13:48,080 Mari kita mengatakan bahawa saya mempunyai buku nota, betul, dan ia penuh dengan nota. 267 00:13:48,080 --> 00:13:50,230 Dan saya mahu anda untuk mengemaskinikannya. 268 00:13:50,230 --> 00:13:53,960 Anda di satu majlis yang kemas kini nota, betul. 269 00:13:53,960 --> 00:13:56,390 Dengan cara yang kita telah kerja setakat ini, apa 270 00:13:56,390 --> 00:14:02,370 berlaku ialah anda akan mengambil komputer riba saya, anda akan pergi ke kedai salinan, 271 00:14:02,370 --> 00:14:06,410 anda akan membuat satu salinan Xerox daripada setiap halaman buku nota. 272 00:14:06,410 --> 00:14:09,790 Anda akan meninggalkan notebook saya kembali di atas meja saya apabila anda selesai, 273 00:14:09,790 --> 00:14:14,600 anda akan pergi dan garisan di atas perkara-perkara dalam saya buku nota yang sudah lapuk atau salah, 274 00:14:14,600 --> 00:14:19,280 dan kemudian anda akan dapat kembali ke saya timbunan laman Xerox 275 00:14:19,280 --> 00:14:22,850 iaitu replika buku nota saya dengan perubahan yang anda telah dibuat kepadanya. 276 00:14:22,850 --> 00:14:27,040 Dan pada ketika itu, ia terpulang kepada saya sebagai fungsi panggilan, kerana pemanggil, 277 00:14:27,040 --> 00:14:30,582 untuk membuat keputusan untuk mengambil nota dan mengintegrasikan mereka kembali ke dalam buku nota saya. 278 00:14:30,582 --> 00:14:32,540 Jadi ada banyak langkah-langkah terlibat di sini, betul. 279 00:14:32,540 --> 00:14:34,850 Seperti ia tidak akan menjadi lebih baik jika saya hanya berkata, hey, boleh anda 280 00:14:34,850 --> 00:14:38,370 mengemas kini komputer riba saya untuk saya, menyerahkan engkau komputer riba saya, 281 00:14:38,370 --> 00:14:40,440 dan anda mengambil barang-barang dan literal menyeberangi mereka keluar 282 00:14:40,440 --> 00:14:42,810 dan mengemas kini nota saya dalam buku nota saya. 283 00:14:42,810 --> 00:14:45,140 Dan kemudian memberi saya buku nota saya kembali. 284 00:14:45,140 --> 00:14:47,320 Itulah jenis apa petunjuk membolehkan kita lakukan, 285 00:14:47,320 --> 00:14:51,320 mereka membuat persekitaran ini banyak lebih seperti bagaimana kami beroperasi dalam realiti. 286 00:14:51,320 --> 00:14:54,640 >> Baiklah demikian itulah yang penunjuk ini, mari kita bercakap 287 00:14:54,640 --> 00:14:58,040 tentang bagaimana petunjuk bekerja di C, dan bagaimana kita boleh mula bekerja dengan mereka. 288 00:14:58,040 --> 00:15:02,550 Jadi ada penunjuk yang sangat mudah dalam C dipanggil penunjuk nol. 289 00:15:02,550 --> 00:15:04,830 Mata penunjuk null apa-apa. 290 00:15:04,830 --> 00:15:08,310 Ini mungkin kelihatan seperti ia sebenarnya bukan satu perkara yang sangat berguna, 291 00:15:08,310 --> 00:15:10,500 tetapi seperti yang kita akan melihat sedikit kemudian, hakikat 292 00:15:10,500 --> 00:15:15,410 bahawa penunjuk null ini wujud sebenarnya memang boleh datang dengan mudah. 293 00:15:15,410 --> 00:15:19,090 Dan setiap kali anda membuat penunjuk, dan anda tidak menetapkan immediately- nilai 294 00:15:19,090 --> 00:15:21,060 contoh menetapkan nilai serta-merta 295 00:15:21,060 --> 00:15:25,401 akan beberapa slaid kembali di mana saya berkata pk sama & k, 296 00:15:25,401 --> 00:15:28,740 pk mendapat alamat k, sebagai kita akan melihat apa yang bermakna, 297 00:15:28,740 --> 00:15:32,990 kita akan melihat bagaimana untuk kod yang shortly- jika kita tidak menetapkan nilai kepada sesuatu 298 00:15:32,990 --> 00:15:35,380 bermakna serta-merta, anda perlu sentiasa 299 00:15:35,380 --> 00:15:37,480 menetapkan penunjuk anda untuk menghala ke nol. 300 00:15:37,480 --> 00:15:40,260 Anda perlu menetapkan ia untuk menunjukkan apa-apa. 301 00:15:40,260 --> 00:15:43,614 >> Itu sangat berbeza daripada hanya meninggalkan nilai kerana ia adalah 302 00:15:43,614 --> 00:15:45,530 dan kemudian mengisytiharkan penunjuk dan hanya andaian 303 00:15:45,530 --> 00:15:48,042 ia batal kerana itulah jarang benar. 304 00:15:48,042 --> 00:15:50,000 Oleh itu anda perlu sentiasa menetapkan nilai penunjuk 305 00:15:50,000 --> 00:15:55,690 untuk menyeimbangkan jika anda tidak menetapkan nilai untuk sesuatu yang bermakna serta-merta. 306 00:15:55,690 --> 00:15:59,090 Anda boleh menyemak sama ada nilai penunjuk ini adalah batal menggunakan operator kesamaan 307 00:15:59,090 --> 00:16:05,450 (==), Seperti anda bandingkan mana-mana integer nilai-nilai atau nilai watak menggunakan (==) 308 00:16:05,450 --> 00:16:06,320 juga. 309 00:16:06,320 --> 00:16:10,994 Ia adalah satu jenis khas yang berterusan nilai yang boleh anda gunakan untuk menguji. 310 00:16:10,994 --> 00:16:13,160 Sehingga adalah sangat mudah penunjuk, penunjuk null. 311 00:16:13,160 --> 00:16:15,320 Cara lain untuk mewujudkan penunjuk adalah untuk mengeluarkan 312 00:16:15,320 --> 00:16:18,240 alamat pembolehubah anda telah diwujudkan, 313 00:16:18,240 --> 00:16:22,330 dan anda melakukan ini dengan menggunakan & operator pengeluaran alamat. 314 00:16:22,330 --> 00:16:26,720 Yang kita telah melihat sebelum ini dalam contoh gambar rajah pertama yang saya menunjukkan. 315 00:16:26,720 --> 00:16:31,450 Jadi, jika x ialah pembolehubah yang kita ada sudah mencipta jenis integer, 316 00:16:31,450 --> 00:16:35,110 kemudian & x adalah penunjuk kepada integer. 317 00:16:35,110 --> 00:16:39,810 & x ialah- ingat, & akan mengeluarkan alamat perkara yang di sebelah kanan. 318 00:16:39,810 --> 00:16:45,350 Dan kerana penunjuk hanya alamat, daripada & x adalah penunjuk kepada integer 319 00:16:45,350 --> 00:16:48,560 nilai yang adalah di mana dalam ingatan x nyawa. 320 00:16:48,560 --> 00:16:50,460 Ia alamat x. 321 00:16:50,460 --> 00:16:53,296 Jadi & x adalah alamat x. 322 00:16:53,296 --> 00:16:55,670 Mari kita mengambil langkah ini satu lagi dan menyambung kepada sesuatu 323 00:16:55,670 --> 00:16:58,380 Saya dirujuk kepada dalam video terlebih dahulu. 324 00:16:58,380 --> 00:17:06,730 Jika arr adalah pelbagai beregu, maka & kurungan persegi arr i adalah penunjuk 325 00:17:06,730 --> 00:17:08,109 kepada dua kali. 326 00:17:08,109 --> 00:17:08,970 OKAY. 327 00:17:08,970 --> 00:17:12,160 ARR kurungan persegi i, jika arr adalah pelbagai beregu, 328 00:17:12,160 --> 00:17:19,069 kemudian arr kurungan persegi i adalah i-ke-elemen array itu, 329 00:17:19,069 --> 00:17:29,270 dan & arr kurungan persegi i adalah di mana dalam memori i-ke-unsur daripada arr wujud. 330 00:17:29,270 --> 00:17:31,790 >> Jadi apa implikasinya di sini? 331 00:17:31,790 --> 00:17:34,570 Nama tatasusunan, implikasi daripada semua ini, 332 00:17:34,570 --> 00:17:39,290 adalah bahawa nama pelbagai adalah sebenarnya sendiri penunjuk. 333 00:17:39,290 --> 00:17:41,170 Anda telah bekerja dengan petunjuk selama ini 334 00:17:41,170 --> 00:17:45,290 setiap kali anda telah menggunakan array. 335 00:17:45,290 --> 00:17:49,090 Ingat dari contoh di kepada skop berubah-ubah, 336 00:17:49,090 --> 00:17:53,420 di akhir video saya hadir contoh di mana kita mempunyai fungsi yang 337 00:17:53,420 --> 00:17:56,890 dipanggil int set dan fungsi dipanggil lokasi yang ditetapkan. 338 00:17:56,890 --> 00:18:00,490 Dan cabaran anda untuk menentukan sama ada atau tidak, atau apa yang 339 00:18:00,490 --> 00:18:03,220 nilai-nilai yang kita dicetak akhir majlis itu, 340 00:18:03,220 --> 00:18:05,960 pada akhir program utama. 341 00:18:05,960 --> 00:18:08,740 >> Jika anda masih ingat daripada contoh yang atau jika anda telah menonton video itu, 342 00:18:08,740 --> 00:18:13,080 anda tahu bahawa apabila anda-saat panggilan untuk int set berkesan tidak apa-apa. 343 00:18:13,080 --> 00:18:16,390 Tetapi panggilan untuk menetapkan lokasi tidak. 344 00:18:16,390 --> 00:18:19,280 Dan saya semacam dipoles begitu saja mengapa itulah yang berlaku pada masa itu. 345 00:18:19,280 --> 00:18:22,363 Saya hanya berkata, baik ia array, ia khas, anda tahu, ada sebab-sebab. 346 00:18:22,363 --> 00:18:25,020 Sebabnya ialah bahawa array ini nama adalah benar-benar hanya penunjuk, 347 00:18:25,020 --> 00:18:28,740 dan ada ini khas persegi kurungan sintaks yang 348 00:18:28,740 --> 00:18:30,510 membuat perkara yang lebih bagus untuk bekerja dengan. 349 00:18:30,510 --> 00:18:34,410 Dan mereka menjadikan idea penunjuk banyak yang kurang menakutkan, 350 00:18:34,410 --> 00:18:36,800 dan sebab mereka jenis daripada menyampaikan dengan cara itu. 351 00:18:36,800 --> 00:18:38,600 Tetapi benar-benar tatasusunan hanya petunjuk. 352 00:18:38,600 --> 00:18:41,580 Dan sebab itulah apabila kita membuat perubahan kepada array, 353 00:18:41,580 --> 00:18:44,880 apabila kita meninggal array sebagai parameter fungsi atau sebagai hujah 354 00:18:44,880 --> 00:18:50,110 ke fungsi, kandungan array sebenarnya berubah dalam kedua-dua CALLEE yang 355 00:18:50,110 --> 00:18:51,160 dan pemanggil. 356 00:18:51,160 --> 00:18:55,846 Yang bagi setiap jenis berubah-ubah yang kita lihat tidak berlaku. 357 00:18:55,846 --> 00:18:58,970 Jadi itu hanya sesuatu yang perlu keberatan apabila anda bekerja dengan petunjuk, 358 00:18:58,970 --> 00:19:01,610 ialah nama seorang lokasi sebenarnya penunjuk 359 00:19:01,610 --> 00:19:04,750 kepada elemen pertama array itu. 360 00:19:04,750 --> 00:19:08,930 >> OK jadi sekarang kita mempunyai semua fakta, mari kita terus pergi, betul. 361 00:19:08,930 --> 00:19:11,370 Mengapa kita mengambil berat tentang di mana sesuatu yang hidup. 362 00:19:11,370 --> 00:19:14,120 Well seperti saya katakan, ia agak berguna untuk mengetahui di mana sesuatu yang hidup 363 00:19:14,120 --> 00:19:17,240 supaya anda boleh pergi ke sana dan mengubahnya. 364 00:19:17,240 --> 00:19:19,390 Bekerja dengannya dan sebenarnya ada perkara yang anda 365 00:19:19,390 --> 00:19:23,710 mahu lakukan untuk yang mengambil kesan berubah-ubah, dan tidak berkuat kuasa pada beberapa salinan. 366 00:19:23,710 --> 00:19:26,150 Ini dipanggil dereferencing. 367 00:19:26,150 --> 00:19:28,690 Kami pergi ke rujukan dan kita menukar nilai di sana. 368 00:19:28,690 --> 00:19:32,660 Jadi, jika kita mempunyai penunjuk dan ia dipanggil pc, dan ia menjurus kepada watak, 369 00:19:32,660 --> 00:19:40,610 maka kita boleh mengatakan pc * dan * pc adalah nama apa yang kita akan mencari jika kita pergi 370 00:19:40,610 --> 00:19:42,910 ke pc alamat. 371 00:19:42,910 --> 00:19:47,860 Apa yang kita akan dapati ada watak dan * pc adalah bagaimana kita merujuk kepada data pada itu 372 00:19:47,860 --> 00:19:48,880 lokasi. 373 00:19:48,880 --> 00:19:54,150 Oleh itu, kita boleh mengatakan sesuatu seperti * pc = D atau sesuatu seperti itu, 374 00:19:54,150 --> 00:19:59,280 dan itu bererti bahawa apa sahaja adalah di alamat memori pc, 375 00:19:59,280 --> 00:20:07,040 apa sahaja watak sebelum ini di sana, kini D, jika kita mengatakan * pc = D. 376 00:20:07,040 --> 00:20:10,090 >> Jadi di sini kita pergi lagi dengan beberapa barangan C pelik, betul. 377 00:20:10,090 --> 00:20:14,560 Oleh itu, kita telah lihat * sebelum ini sebagai entah bagaimana sebahagian daripada jenis data, 378 00:20:14,560 --> 00:20:17,160 dan kini ia digunakan dalam konteks yang sedikit berbeza 379 00:20:17,160 --> 00:20:19,605 untuk mengakses data pada lokasi. 380 00:20:19,605 --> 00:20:22,480 Saya tahu ia sedikit mengelirukan dan yang sebenarnya sebahagian daripada keseluruhan ini 381 00:20:22,480 --> 00:20:25,740 seperti, mengapa petunjuk mempunyai mitologi ini di sekeliling mereka sebagai yang begitu kompleks, 382 00:20:25,740 --> 00:20:28,250 adalah jenis masalah sintaks, jujur. 383 00:20:28,250 --> 00:20:31,810 Tetapi * digunakan dalam kedua-dua konteks, kedua-dua sebagai sebahagian daripada nama jenis, 384 00:20:31,810 --> 00:20:34,100 dan kita akan melihat sedikit sesuatu kemudian yang lain, juga. 385 00:20:34,100 --> 00:20:36,490 Dan sekarang adalah pengendali dereference. 386 00:20:36,490 --> 00:20:38,760 Begitu seterusnya untuk rujukan, ia mengakses data 387 00:20:38,760 --> 00:20:43,000 di lokasi penunjuk, dan membolehkan anda memanipulasi ia sesuka hati. 388 00:20:43,000 --> 00:20:45,900 >> Sekarang ini adalah hampir sama dengan melawat jiran anda, betul. 389 00:20:45,900 --> 00:20:48,710 Jika anda tahu apa yang anda jiran yang hidup, anda berada 390 00:20:48,710 --> 00:20:50,730 tidak melepak dengan jiran anda. 391 00:20:50,730 --> 00:20:53,510 Anda tahu anda berlaku untuk tahu di mana mereka tinggal, 392 00:20:53,510 --> 00:20:56,870 tetapi itu tidak bermakna bahawa dengan kerana mempunyai pengetahuan yang 393 00:20:56,870 --> 00:20:59,170 anda berinteraksi dengan mereka. 394 00:20:59,170 --> 00:21:01,920 Jika anda ingin berinteraksi dengan mereka, anda perlu pergi ke rumah mereka, 395 00:21:01,920 --> 00:21:03,760 anda perlu pergi ke mana mereka tinggal. 396 00:21:03,760 --> 00:21:07,440 Dan apabila anda berbuat demikian, maka anda boleh berinteraksi 397 00:21:07,440 --> 00:21:09,420 dengan mereka sama seperti yang anda akan mahu. 398 00:21:09,420 --> 00:21:12,730 Begitu juga dengan pembolehubah, anda perlu pergi ke alamat mereka 399 00:21:12,730 --> 00:21:15,320 jika anda mahu untuk berinteraksi mereka, anda tidak boleh hanya tahu alamat. 400 00:21:15,320 --> 00:21:21,495 Dan cara anda pergi ke alamat ini digunakan *, pengendali dereference itu. 401 00:21:21,495 --> 00:21:23,620 Apa yang anda fikir berlaku jika kita cuba dan dereference 402 00:21:23,620 --> 00:21:25,260 penunjuk yang nilainya adalah batal? 403 00:21:25,260 --> 00:21:28,470 Ingat bahawa null penunjuk menunjuk kepada apa-apa. 404 00:21:28,470 --> 00:21:34,110 Jadi, jika anda cuba dan dereference apa-apa atau pergi ke apa-apa alamat, 405 00:21:34,110 --> 00:21:36,800 apa yang anda fikir berlaku? 406 00:21:36,800 --> 00:21:39,630 Segmentasi Baik jika anda fikirkan kesalahan, anda akan menjadi betul. 407 00:21:39,630 --> 00:21:41,390 Jika anda cuba dan dereference penunjuk null, 408 00:21:41,390 --> 00:21:43,140 anda mengalami segmentasi yang kesalahan. Tetapi tunggu, 409 00:21:43,140 --> 00:21:45,820 saya tidak memberitahu anda, bahawa jika anda tidak akan 410 00:21:45,820 --> 00:21:49,220 untuk menetapkan nilai anda anda penunjuk kepada sesuatu yang bermakna, 411 00:21:49,220 --> 00:21:51,000 anda perlu bersedia untuk batal? 412 00:21:51,000 --> 00:21:55,290 Yang saya lakukan dan benar-benar segmentasi kesalahan adalah jenis tingkah laku yang baik. 413 00:21:55,290 --> 00:21:58,680 >> Pernahkah anda mengisytiharkan pembolehubah dan tidak diberikan nilai serta-merta? 414 00:21:58,680 --> 00:22:02,680 Jadi, anda hanya mengatakan int x; anda tidak sebenarnya sediakan kepada apa-apa 415 00:22:02,680 --> 00:22:05,340 dan kemudian kemudian di dalam kod anda, anda mencetak nilai x, 416 00:22:05,340 --> 00:22:07,650 masih tidak mempunyai diberikan kepada apa-apa. 417 00:22:07,650 --> 00:22:10,370 Kerap anda akan mendapat sifar, tetapi kadang-kadang anda 418 00:22:10,370 --> 00:22:15,000 mungkin akan mendapat beberapa nombor rawak, dan anda tidak tahu dari mana datangnya. 419 00:22:15,000 --> 00:22:16,750 Begitu juga perkara yang boleh berlaku dengan petunjuk. 420 00:22:16,750 --> 00:22:20,110 Apabila anda mengisytiharkan penunjuk int * pk sebagai contoh, 421 00:22:20,110 --> 00:22:23,490 dan anda tidak tetapkannya kepada nilai, anda mendapat empat bait untuk ingatan. 422 00:22:23,490 --> 00:22:25,950 Apa sahaja yang empat bait memori sistem boleh 423 00:22:25,950 --> 00:22:28,970 mendapati bahawa mempunyai nilai yang bermakna. 424 00:22:28,970 --> 00:22:31,760 Dan mungkin ada sesuatu yang sudah ada yang 425 00:22:31,760 --> 00:22:34,190 tidak lagi diperlukan oleh orang lain fungsi, jadi anda hanya perlu 426 00:22:34,190 --> 00:22:35,900 apa sahaja data yang berada di sana. 427 00:22:35,900 --> 00:22:40,570 >> Bagaimana jika anda cuba untuk melakukan dereference beberapa alamat yang anda don't- terdapat 428 00:22:40,570 --> 00:22:43,410 sudah bait dan maklumat dalam di sana, yang kini dalam penunjuk anda. 429 00:22:43,410 --> 00:22:47,470 Jika anda cuba dan dereference penunjuk bahawa, anda mungkin bermain-main dengan beberapa memori 430 00:22:47,470 --> 00:22:49,390 bahawa anda tidak berniat main-main dengan itu semua. 431 00:22:49,390 --> 00:22:51,639 Dan sebenarnya yang anda boleh lakukan sesuatu yang sangat dahsyat, 432 00:22:51,639 --> 00:22:54,880 seperti memecahkan program lain, atau memecahkan fungsi yang lain, 433 00:22:54,880 --> 00:22:58,289 atau melakukan sesuatu yang berniat jahat yang anda tidak berniat untuk melakukan sama sekali. 434 00:22:58,289 --> 00:23:00,080 Dan itulah sebabnya mengapa ia sebenarnya adalah idea yang baik 435 00:23:00,080 --> 00:23:04,030 untuk menetapkan petunjuk anda untuk batal jika anda tidak menetapkan mereka untuk sesuatu yang bermakna. 436 00:23:04,030 --> 00:23:06,760 Ia mungkin lebih baik di akhir hari untuk program anda 437 00:23:06,760 --> 00:23:09,840 crash maka untuk ia lakukan sesuatu yang skru sehingga 438 00:23:09,840 --> 00:23:12,400 program lain atau fungsi yang lain. 439 00:23:12,400 --> 00:23:15,207 Tingkah laku yang mungkin walaupun kurang sesuai daripada hanya terhempas. 440 00:23:15,207 --> 00:23:17,040 Dan itulah sebabnya mengapa ia sebenarnya satu tabiat yang baik 441 00:23:17,040 --> 00:23:20,920 untuk masuk ke dalam untuk menetapkan petunjuk anda untuk menyeimbangkan jika anda tidak menetapkan mereka 442 00:23:20,920 --> 00:23:24,540 kepada nilai yang bermakna serta-merta, nilai yang anda tahu 443 00:23:24,540 --> 00:23:27,260 dan bahawa anda boleh dengan selamat dereference itu. 444 00:23:27,260 --> 00:23:32,240 >> Jadi mari kita kembali sekarang dan kita lihat di sintaks keseluruhan keadaan. 445 00:23:32,240 --> 00:23:37,400 Jika saya katakan int * p ;, apa yang telah saya buat? 446 00:23:37,400 --> 00:23:38,530 Apa yang saya lakukan adalah ini. 447 00:23:38,530 --> 00:23:43,290 Saya tahu nilai p adalah alamat kerana semua petunjuk hanyalah 448 00:23:43,290 --> 00:23:44,660 alamat. 449 00:23:44,660 --> 00:23:47,750 Saya boleh dereference p menggunakan operator * itu. 450 00:23:47,750 --> 00:23:51,250 Dalam konteks ini di sini, sekurang- bahagian ingat * adalah sebahagian daripada jenis. 451 00:23:51,250 --> 00:23:53,510 Int * adalah jenis data. 452 00:23:53,510 --> 00:23:56,150 Tetapi saya boleh dereference p menggunakan operator * itu, 453 00:23:56,150 --> 00:24:01,897 dan jika saya berbuat demikian, jika saya pergi ke alamat itu, apa yang saya akan mencari di alamat itu? 454 00:24:01,897 --> 00:24:02,855 Saya akan mencari integer. 455 00:24:02,855 --> 00:24:05,910 Jadi int * p pada dasarnya berkata, p ialah alamat. 456 00:24:05,910 --> 00:24:09,500 Saya boleh dereference p dan jika Saya lakukan, saya akan mencari integer 457 00:24:09,500 --> 00:24:11,920 di lokasi itu ingatan. 458 00:24:11,920 --> 00:24:14,260 >> OK jadi saya berkata terdapat satu lagi Perkara yang menjengkelkan dengan bintang 459 00:24:14,260 --> 00:24:17,060 dan di sini adalah di mana yang Perkara yang menjengkelkan dengan bintang adalah. 460 00:24:17,060 --> 00:24:21,640 Pernahkah anda cuba untuk mengisytiharkan beberapa pembolehubah dari jenis yang sama 461 00:24:21,640 --> 00:24:24,409 pada baris yang sama kod? 462 00:24:24,409 --> 00:24:27,700 Jadi untuk kali kedua, berpura-pura bahawa garisan, kod yang saya sebenarnya telah ada dalam hijau 463 00:24:27,700 --> 00:24:29,366 tidak ada dan ia hanya berkata int x, y, z ;. 464 00:24:29,366 --> 00:24:31,634 465 00:24:31,634 --> 00:24:34,550 Apa yang akan dilakukan adalah sebenarnya mewujudkan tiga pembolehubah integer untuk anda, 466 00:24:34,550 --> 00:24:36,930 satu dipanggil x, satu dipanggil y, dan satu dipanggil z. 467 00:24:36,930 --> 00:24:41,510 Ia adalah satu cara untuk melakukannya tanpa perlu berpecah ke tiga baris. 468 00:24:41,510 --> 00:24:43,890 >> Berikut adalah di mana bintang mendapatkan menjengkelkan lagi walaupun, 469 00:24:43,890 --> 00:24:49,200 kerana * adalah sebenarnya sebahagian kedua-dua nama jenis dan bahagian 470 00:24:49,200 --> 00:24:50,320 nama yang berubah-ubah. 471 00:24:50,320 --> 00:24:56,430 Dan jadi jika saya katakan int * px, py, pz, apa yang saya benar-benar mendapatkan adalah penunjuk kepada integer 472 00:24:56,430 --> 00:25:01,650 dipanggil px dan dua integer, py dan pz. 473 00:25:01,650 --> 00:25:04,950 Dan itu mungkin tidak apa kita mahu, yang tidak baik. 474 00:25:04,950 --> 00:25:09,290 >> Jadi jika saya mahu untuk membuat beberapa petunjuk pada baris yang sama, dari jenis yang sama, 475 00:25:09,290 --> 00:25:12,140 dan bintang, apa yang saya benar-benar perlu lakukan adalah mengatakan int * pa, * pb, * pc. 476 00:25:12,140 --> 00:25:17,330 477 00:25:17,330 --> 00:25:20,300 Kini mempunyai hanya berkata dan kini memberitahu anda ini, 478 00:25:20,300 --> 00:25:22,170 anda mungkin tidak akan melakukan ini. 479 00:25:22,170 --> 00:25:25,170 Dan ia mungkin sesuatu yang baik secara jujur, kerana anda mungkin secara tidak sengaja 480 00:25:25,170 --> 00:25:26,544 meninggalkan bintang, sesuatu seperti itu. 481 00:25:26,544 --> 00:25:29,290 Ia mungkin yang terbaik untuk mungkin mengisytiharkan petunjuk pada baris individu, 482 00:25:29,290 --> 00:25:31,373 tetapi ia hanya satu sama lain mereka sintaks menjengkelkan 483 00:25:31,373 --> 00:25:35,310 perkara dengan bintang yang membuat petunjuk begitu sukar untuk bekerja dengan. 484 00:25:35,310 --> 00:25:39,480 Kerana ia hanya sintaksis ini keadaan huru-hara, anda perlu bekerja melalui. 485 00:25:39,480 --> 00:25:41,600 Dengan amalan ia benar-benar menjadi sifat kedua. 486 00:25:41,600 --> 00:25:45,410 Saya masih melakukan kesilapan dengan ia masih selepas program selama 10 tahun, 487 00:25:45,410 --> 00:25:49,630 jadi jangan kecewa jika sesuatu berlaku kepada anda, ia agak biasa jujur. 488 00:25:49,630 --> 00:25:52,850 Ia benar-benar jenis kecacatan sintaksis itu. 489 00:25:52,850 --> 00:25:54,900 >> OK jadi saya jenis berjanji bahawa kita akan mengkaji semula 490 00:25:54,900 --> 00:25:59,370 konsep bagaimana besar adalah rentetan. 491 00:25:59,370 --> 00:26:02,750 Nah jika saya memberitahu anda bahawa tali, kami telah benar-benar jenis 492 00:26:02,750 --> 00:26:04,140 telah berbohong kepada anda sepanjang masa. 493 00:26:04,140 --> 00:26:06,181 Tidak ada jenis data yang dikenali sebagai tali, dan sebenarnya saya 494 00:26:06,181 --> 00:26:09,730 menyatakan hal ini dalam salah satu daripada kami video terawal pada jenis data, 495 00:26:09,730 --> 00:26:13,820 tali itu adalah sejenis data yang telah dicipta untuk anda dalam CS50.h. 496 00:26:13,820 --> 00:26:17,050 Anda perlu # include Cs50.h untuk menggunakannya. 497 00:26:17,050 --> 00:26:19,250 >> Well tali adalah benar-benar hanya alias sesuatu 498 00:26:19,250 --> 00:26:23,600 dipanggil char *, satu penunjuk kepada watak. 499 00:26:23,600 --> 00:26:26,010 Baik petunjuk, ingat, hanya menangani. 500 00:26:26,010 --> 00:26:28,780 Jadi apa saiz dalam bait rentetan? 501 00:26:28,780 --> 00:26:29,796 Biasanya tidak empat atau lapan. 502 00:26:29,796 --> 00:26:32,170 Dan sebab itu saya katakan empat atau lapan adalah kerana ia sebenarnya 503 00:26:32,170 --> 00:26:36,730 bergantung kepada sistem, Jika anda menggunakan CS50 ide, char * adalah saiz char 504 00:26:36,730 --> 00:26:39,340 * Adalah lapan, ia adalah satu sistem 64-bit. 505 00:26:39,340 --> 00:26:43,850 Setiap alamat dalam ingatan adalah 64 bit panjang. 506 00:26:43,850 --> 00:26:48,270 Jika anda menggunakan perkakas CS50 atau menggunakan mana-mana mesin 32-bit, 507 00:26:48,270 --> 00:26:51,640 dan anda telah mendengar bahawa jangka 32-bit mesin, apakah mesin 32-bit? 508 00:26:51,640 --> 00:26:56,090 Well ia hanya bermaksud bahawa setiap alamat dalam ingatan adalah 32 bit panjang. 509 00:26:56,090 --> 00:26:59,140 Dan sebagainya 32 bit adalah empat bait. 510 00:26:59,140 --> 00:27:02,710 Jadi char * adalah empat atau lapan bait bergantung pada sistem anda. 511 00:27:02,710 --> 00:27:06,100 Dan sememangnya mana-mana jenis data, dan penunjuk kepada apa-apa data 512 00:27:06,100 --> 00:27:12,030 menaip, kerana semua petunjuk hanyalah alamat, empat atau lapan bait. 513 00:27:12,030 --> 00:27:14,030 Jadi mari kita melihat semula ini diagram dan mari kita membuat kesimpulan 514 00:27:14,030 --> 00:27:18,130 video ini dengan sedikit senaman di sini. 515 00:27:18,130 --> 00:27:21,600 Jadi di sini adalah rajah kita berhenti dengan pada awal-awal video. 516 00:27:21,600 --> 00:27:23,110 Jadi apa yang berlaku sekarang jika saya mengatakan * pk = 35? 517 00:27:23,110 --> 00:27:26,370 518 00:27:26,370 --> 00:27:30,530 Jadi apa maknanya apabila saya berkata, * pk = 35? 519 00:27:30,530 --> 00:27:32,420 Mengambil kedua. 520 00:27:32,420 --> 00:27:34,990 * pk. 521 00:27:34,990 --> 00:27:39,890 Dalam konteks sini, * adalah pengendali dereference. 522 00:27:39,890 --> 00:27:42,110 Oleh itu, apabila dereference yang pengendali digunakan, 523 00:27:42,110 --> 00:27:48,520 kita pergi ke alamat yang menunjuk kepada oleh pk, dan kita mengubah apa yang kita dapati. 524 00:27:48,520 --> 00:27:55,270 Jadi * pk = 35 dengan berkesan adakah ini gambar. 525 00:27:55,270 --> 00:27:58,110 Jadi ia pada dasarnya sintaksis sama dengan yang telah berkata k = 35. 526 00:27:58,110 --> 00:28:00,740 527 00:28:00,740 --> 00:28:01,930 >> Satu lagi. 528 00:28:01,930 --> 00:28:05,510 Jika saya katakan int m, saya membuat pembolehubah baru yang dikenali sebagai m. 529 00:28:05,510 --> 00:28:08,260 Kotak baru, ia adalah satu kotak hijau kerana ia akan mengadakan integer, 530 00:28:08,260 --> 00:28:09,840 dan ia dilabel m. 531 00:28:09,840 --> 00:28:14,960 Jika saya katakan m = 4, saya meletakkan integer ke dalam kotak itu. 532 00:28:14,960 --> 00:28:20,290 Jika berkata pk = & m, bagaimana perubahan rajah ini? 533 00:28:20,290 --> 00:28:28,760 Pk = & m, adakah anda masih ingat apa yang & Operator melakukan atau dipanggil? 534 00:28:28,760 --> 00:28:34,430 Ingatlah bahawa & beberapa nama pembolehubah adalah alamat nama berubah-ubah. 535 00:28:34,430 --> 00:28:38,740 Jadi apa yang kita katakan ialah pk mendapat alamat m. 536 00:28:38,740 --> 00:28:42,010 Dan dengan berkesan apa yang berlaku di gambar rajah ialah PK mata tidak lagi 537 00:28:42,010 --> 00:28:46,420 kepada k, tetapi mata untuk m. 538 00:28:46,420 --> 00:28:48,470 >> Sekali lagi petunjuk yang sangat sukar untuk bekerja dengan 539 00:28:48,470 --> 00:28:50,620 dan mereka mengambil banyak amalan, tetapi kerana 540 00:28:50,620 --> 00:28:54,150 kemampuan mereka untuk membolehkan anda untuk lulus data antara fungsi 541 00:28:54,150 --> 00:28:56,945 dan benar-benar mempunyai orang-orang perubahan berkuat kuasa, 542 00:28:56,945 --> 00:28:58,820 mendapatkan kepala anda sekitar adalah benar-benar penting. 543 00:28:58,820 --> 00:29:02,590 Ia mungkin adalah yang paling rumit topik yang kita bincangkan dalam CS50, 544 00:29:02,590 --> 00:29:05,910 tetapi nilai yang anda mendapatkan daripada menggunakan petunjuk 545 00:29:05,910 --> 00:29:09,200 jauh melebihi komplikasi yang datang dari pembelajaran mereka. 546 00:29:09,200 --> 00:29:12,690 Oleh itu, saya ingin anda yang terbaik daripada nasib belajar tentang petunjuk. 547 00:29:12,690 --> 00:29:15,760 Saya Doug Lloyd, ini adalah CS50. 548 00:29:15,760 --> 00:29:17,447