1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Seksyen 4 - Lebih Selesa] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Universiti Harvard] 3 00:00:04,850 --> 00:00:07,370 [Ini adalah CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Kami mempunyai esok kuiz, dalam kes anda semua tidak tahu bahawa. 5 00:00:14,810 --> 00:00:20,970 Ia pada asasnya atas segala-galanya yang anda boleh dilihat di dalam kelas atau sepatutnya dilihat di dalam kelas. 6 00:00:20,970 --> 00:00:26,360 Ini termasuk petunjuk, walaupun mereka satu topik yang sangat baru-baru ini. 7 00:00:26,360 --> 00:00:29,860 Anda sekurang-kurangnya harus memahami tahap tinggi mereka. 8 00:00:29,860 --> 00:00:34,760 Apa-apa yang telah hilang di dalam kelas anda perlu memahami untuk kuiz. 9 00:00:34,760 --> 00:00:37,320 Jadi jika anda mempunyai soalan kepada mereka, anda boleh meminta mereka sekarang. 10 00:00:37,320 --> 00:00:43,280 Tetapi ini akan menjadi sangat diterajui pelajar sesi di mana anda semua bertanya soalan, 11 00:00:43,280 --> 00:00:45,060 jadi diharapkan orang mempunyai soalan. 12 00:00:45,060 --> 00:00:48,020 Adakah sesiapa yang mempunyai soalan? 13 00:00:49,770 --> 00:00:52,090 Ya. >> [Pelajar] Bolehkah anda pergi lebih petunjuk lagi? 14 00:00:52,090 --> 00:00:54,350 Saya akan pergi lebih petunjuk. 15 00:00:54,350 --> 00:00:59,180 Semua pembolehubah anda semestinya hidup dalam ingatan, 16 00:00:59,180 --> 00:01:04,450 tetapi biasanya anda tidak bimbang tentang itu dan anda hanya mengatakan x + 2 dan y + 3 17 00:01:04,450 --> 00:01:07,080 dan pengkompil akan memikirkan di mana perkara-perkara yang hidup untuk anda. 18 00:01:07,080 --> 00:01:12,990 Apabila anda berurusan dengan petunjuk, sekarang anda jelas menggunakan alamat memori. 19 00:01:12,990 --> 00:01:19,800 Jadi pembolehubah tunggal akan hanya pernah tinggal di alamat tunggal pada bila-bila masa yang diberikan. 20 00:01:19,800 --> 00:01:24,040 Jika kita mahu mengisytiharkan penunjuk, apa yang jenis akan kelihatan seperti? 21 00:01:24,040 --> 00:01:26,210 >> Saya mahu mengisytiharkan p penunjuk. Apakah jenis kelihatan seperti? 22 00:01:26,210 --> 00:01:33,530 [Pelajar] int * p. >> Yeah. Jadi int * p. 23 00:01:33,530 --> 00:01:38,030 Dan bagaimana saya boleh membuat ia menunjukkan x? >> [Pelajar] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Jadi #: glib benar-benar dipanggil alamat pengendali. 25 00:01:45,300 --> 00:01:50,460 Jadi, apabila saya katakan & x ia mendapat alamat ingatan x berubah-ubah. 26 00:01:50,460 --> 00:01:56,790 Jadi sekarang saya mempunyai p penunjuk, dan di mana-mana sahaja dalam kod saya, saya boleh menggunakan p * 27 00:01:56,790 --> 00:02:02,960 atau saya boleh menggunakan x dan ia akan menjadi perkara yang sama yang tepat. 28 00:02:02,960 --> 00:02:09,520 (* P). Apakah ini lakukan? Apakah bintang yang bermakna? 29 00:02:09,520 --> 00:02:13,120 [Pelajar] Ia bermaksud nilai pada ketika itu. >> Yeah. 30 00:02:13,120 --> 00:02:17,590 Jadi, jika kita melihat ia, ia boleh menjadi sangat berguna untuk menarik keluar gambar rajah 31 00:02:17,590 --> 00:02:22,230 di mana ini adalah kotak sedikit memori untuk x, yang berlaku mempunyai nilai 4, 32 00:02:22,230 --> 00:02:25,980 maka kita mempunyai kotak sedikit memori untuk p, 33 00:02:25,980 --> 00:02:31,590 dan sebagainya p mata x, jadi kita lukiskan anak panah dari p ke x. 34 00:02:31,590 --> 00:02:40,270 Jadi, apabila kita katakan p * kita mengatakan pergi ke kotak yang p. 35 00:02:40,270 --> 00:02:46,480 Bintang adalah mengikuti anak panah dan kemudian melakukan apa sahaja yang anda mahu dengan kotak yang di sana. 36 00:02:46,480 --> 00:03:01,090 Jadi saya boleh katakan * p = 7; dan yang akan pergi ke kotak yang x dan perubahan yang ke 7. 37 00:03:01,090 --> 00:03:13,540 Atau saya boleh mengatakan int z = * p * 2; Itu mengelirukan kerana bintang itu, bintang. 38 00:03:13,540 --> 00:03:19,230 Bintang satu dereferencing p, bintang lain mendarabkan dengan 2. 39 00:03:19,230 --> 00:03:26,780 Notis saya boleh mempunyai hanya serta menggantikan p * dengan x. 40 00:03:26,780 --> 00:03:29,430 Anda boleh menggunakan mereka dengan cara yang sama. 41 00:03:29,430 --> 00:03:38,000 Dan kemudian pada saya boleh mempunyai titik p untuk perkara yang benar-benar baru. 42 00:03:38,000 --> 00:03:42,190 Saya hanya boleh mengatakan p = &z; 43 00:03:42,190 --> 00:03:44,940 Jadi sekarang p ada mata lagi x; ia menunjuk ke z. 44 00:03:44,940 --> 00:03:50,510 Dan bila-bila masa yang saya lakukan p * ia sama seperti melakukan z. 45 00:03:50,510 --> 00:03:56,170 Jadi perkara yang berguna tentang ini ialah apabila kita mula masuk ke fungsi. 46 00:03:56,170 --> 00:03:59,790 >> Ia adalah jenis sia-sia untuk mengisytiharkan penunjuk bahawa mata kepada sesuatu 47 00:03:59,790 --> 00:04:03,140 dan kemudian anda hanya dereferencing ia 48 00:04:03,140 --> 00:04:06,060 apabila anda boleh menggunakan pembolehubah asal untuk memulakan dengan. 49 00:04:06,060 --> 00:04:18,190 Tetapi apabila anda mendapat ke dalam fungsi - jadi mari kita mengatakan bahawa kita mempunyai beberapa fungsi, int foo, 50 00:04:18,190 --> 00:04:32,810 yang mengambil penunjuk dan hanya tidak * p = 6; 51 00:04:32,810 --> 00:04:39,990 Seperti yang kita lihat sebelum ini dengan swap, anda tidak boleh melakukan swap yang berkesan dan fungsi yang berasingan 52 00:04:39,990 --> 00:04:45,180 dengan hanya lulus integer kerana segala-galanya dalam C sentiasa lulus oleh nilai. 53 00:04:45,180 --> 00:04:48,360 Malah apabila anda lulus petunjuk anda lulus oleh nilai. 54 00:04:48,360 --> 00:04:51,940 Ia hanya kebetulan bahawa nilai-nilai adalah alamat ingatan. 55 00:04:51,940 --> 00:05:00,770 Jadi apabila saya mengatakan foo (p), saya lulus penunjuk ke foo fungsi 56 00:05:00,770 --> 00:05:03,910 dan kemudian foo melakukan * p = 6; 57 00:05:03,910 --> 00:05:08,600 Jadi di dalam fungsi itu, * p masih bersamaan dengan x, 58 00:05:08,600 --> 00:05:12,720 tetapi saya tidak boleh menggunakan x di dalam fungsi itu kerana ia tidak scoped dalam fungsi itu. 59 00:05:12,720 --> 00:05:19,510 Jadi * p = 6 adalah satu-satunya cara saya boleh mengakses pembolehubah tempatan dari fungsi yang lain. 60 00:05:19,510 --> 00:05:23,600 Atau, baik, petunjuk-satunya cara saya boleh mengakses pembolehubah tempatan dari fungsi yang lain. 61 00:05:23,600 --> 00:05:31,600 [Pelajar] Mari kita mengatakan anda mahu untuk kembali penunjuk. Bagaimana sebenarnya yang anda lakukan? 62 00:05:31,600 --> 00:05:44,270 [] Bowden Return penunjuk seperti sesuatu seperti int y = 3; pulangan & y? >> [Pelajar] Yeah. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Okay. Anda tidak perlu melakukan ini. Ini adalah buruk. 64 00:05:48,480 --> 00:05:59,480 Saya fikir saya melihat dalam slaid kuliah anda mula melihat ini seluruh rajah memori 65 00:05:59,480 --> 00:06:02,880 di mana di sini anda telah mendapat alamat ingatan 0 66 00:06:02,880 --> 00:06:09,550 dan turun di sini anda mempunyai alamat ingatan 4 gig atau 2 hingga 32. 67 00:06:09,550 --> 00:06:15,120 Jadi maka anda telah mendapat beberapa barangan dan barangan beberapa dan kemudian anda mempunyai timbunan anda 68 00:06:15,120 --> 00:06:21,780 dan anda telah mendapat timbunan anda, yang anda hanya mula belajar tentang, membesar. 69 00:06:21,780 --> 00:06:24,390 [Pelajar] Bukankah timbunan di atas timbunan? 70 00:06:24,390 --> 00:06:27,760 >> Yeah. Timbunan itu di atas, ia tidak? >> [Pelajar] Nah, dia meletakkan 0 di atas. 71 00:06:27,760 --> 00:06:30,320 [Pelajar] Oh, dia meletakkan 0 di atas. >> [Pelajar] Oh, okay. 72 00:06:30,320 --> 00:06:36,060 Penafian: Anywhere dengan CS50 anda akan melihat ia cara ini. >> [Pelajar] Okay. 73 00:06:36,060 --> 00:06:40,290 Ia hanya bahawa apabila anda pertama kali melihat susunan, 74 00:06:40,290 --> 00:06:45,000 seperti apabila anda memikirkan timbunan anda berfikir menyusun perkara-perkara di atas satu sama lain. 75 00:06:45,000 --> 00:06:50,810 Jadi, kita cenderung untuk flip ini sekitar supaya timbunan membesar seperti timbunan biasanya akan 76 00:06:50,810 --> 00:06:55,940 bukan timbunan tergantung ke bawah. >> [Pelajar] Jangan timbunan teknikal membesar juga, walaupun? 77 00:06:55,940 --> 00:07:01,100 Ia bergantung kepada apa yang anda maksudkan dengan membesar. 78 00:07:01,100 --> 00:07:04,010 Timbunan dan longgokan sentiasa berkembang dalam arah yang bertentangan. 79 00:07:04,010 --> 00:07:09,420 Timbunan sentiasa membesar dalam erti kata bahawa ia membesar 80 00:07:09,420 --> 00:07:12,940 ke arah alamat-alamat ingatan yang lebih tinggi, dan timbunan itu berkembang ke bawah 81 00:07:12,940 --> 00:07:17,260 bahawa ia berkembang ke arah alamat-alamat ingatan yang lebih rendah. 82 00:07:17,260 --> 00:07:20,250 Jadi atas adalah 0 dan bawah adalah alamat memori yang tinggi. 83 00:07:20,250 --> 00:07:26,390 Mereka kedua-dua semakin meningkat, hanya dalam menentang arahan. 84 00:07:26,390 --> 00:07:29,230 [Pelajar] saya hanya bermakna bahawa kerana anda berkata anda meletakkan timbunan di bahagian bawah 85 00:07:29,230 --> 00:07:33,640 kerana ia seolah-olah lebih intuitif kerana untuk timbunan untuk memulakan di bahagian atas timbunan, 86 00:07:33,640 --> 00:07:37,520 timbunan di atas dirinya terlalu, jadi that's - >> Yeah. 87 00:07:37,520 --> 00:07:44,960 Anda juga berfikir timbunan sebagai membesar dan lebih besar, tetapi timbunan lebih-lebih lagi. 88 00:07:44,960 --> 00:07:50,280 Jadi tindanan adalah salah satu yang kita jenis mahu menunjukkan membesar. 89 00:07:50,280 --> 00:07:55,390 Tetapi di mana-mana anda melihat sebaliknya akan menunjukkan alamat 0 di atas 90 00:07:55,390 --> 00:07:59,590 dan alamat ingatan yang tertinggi di bahagian bawah, jadi ini adalah pandangan biasa anda memori. 91 00:07:59,590 --> 00:08:02,100 >> Adakah anda mempunyai soalan? 92 00:08:02,100 --> 00:08:04,270 [Pelajar] Bolehkah anda memberitahu kami lebih lanjut mengenai timbunan itu? 93 00:08:04,270 --> 00:08:06,180 Yeah. Saya akan sampai ke dalam kedua. 94 00:08:06,180 --> 00:08:12,220 Pertama, akan kembali kepada mengapa kembali & y adalah satu perkara yang buruk, 95 00:08:12,220 --> 00:08:18,470 pada timbunan anda mempunyai sekumpulan bingkai tindanan yang mewakili semua fungsi-fungsi 96 00:08:18,470 --> 00:08:20,460 yang telah dipanggil. 97 00:08:20,460 --> 00:08:27,990 Jadi mengabaikan perkara sebelumnya, atas timbunan anda sentiasa akan menjadi fungsi utama 98 00:08:27,990 --> 00:08:33,090 kerana itulah fungsi pertama yang dipanggil. 99 00:08:33,090 --> 00:08:37,130 Dan kemudian apabila anda memanggil fungsi yang lain, timbunan akan berkembang ke bawah. 100 00:08:37,130 --> 00:08:41,640 Jadi jika saya memanggil beberapa fungsi, foo, dan ia mendapat bingkai tindanan sendiri, 101 00:08:41,640 --> 00:08:47,280 ia boleh memanggil beberapa fungsi, bar; ia mendapat bingkai tindanan sendiri. 102 00:08:47,280 --> 00:08:49,840 Dan bar boleh rekursi dan ia boleh memanggil dirinya, 103 00:08:49,840 --> 00:08:54,150 dan supaya panggilan kedua ke bar akan untuk mendapatkan bingkai tindanan sendiri. 104 00:08:54,150 --> 00:08:58,880 Dan jadi apa yang berlaku dalam bingkai tindanan adalah semua pembolehubah tempatan 105 00:08:58,880 --> 00:09:03,450 dan semua hujah fungsi yang - 106 00:09:03,450 --> 00:09:08,730 Mana-mana perkara yang tempatan scoped untuk fungsi ini pergi dalam bingkai tindanan. 107 00:09:08,730 --> 00:09:21,520 Supaya bermakna apabila saya berkata sesuatu seperti bar adalah fungsi, 108 00:09:21,520 --> 00:09:29,270 Saya hanya akan mengisytiharkan integer dan kemudian kembali penunjuk kepada integer itu. 109 00:09:29,270 --> 00:09:33,790 Jadi di manakah y hidup? 110 00:09:33,790 --> 00:09:36,900 [Pelajar] y tinggal di bar. >> [Bowden] Yeah. 111 00:09:36,900 --> 00:09:45,010 Di suatu tempat di dataran ini sedikit memori adalah persegi littler yang mempunyai y di dalamnya. 112 00:09:45,010 --> 00:09:53,370 Apabila saya kembali & y, saya kembali penunjuk untuk blok ini sedikit ingatan. 113 00:09:53,370 --> 00:09:58,400 Tetapi kemudian apabila fungsi pulangan, bingkai tindanan mendapat muncul dari timbunan. 114 00:10:01,050 --> 00:10:03,530 Dan itulah sebabnya ia dipanggil timbunan. 115 00:10:03,530 --> 00:10:06,570 Ia seperti struktur data timbunan, jika anda tahu apa yang. 116 00:10:06,570 --> 00:10:11,580 Atau pun seperti timbunan dulang sentiasa contoh, 117 00:10:11,580 --> 00:10:16,060 utama akan pergi di bahagian bawah, maka fungsi pertama yang anda panggil akan pergi di atas itu, 118 00:10:16,060 --> 00:10:20,400 dan anda tidak boleh mendapatkan kembali ke utama sehingga anda kembali dari semua fungsi yang telah dipanggil 119 00:10:20,400 --> 00:10:22,340 yang telah diletakkan di atasnya. 120 00:10:22,340 --> 00:10:28,650 >> [Pelajar] Jadi jika anda tidak melakukan kembali y &, nilai itu adalah tertakluk kepada perubahan tanpa notis. 121 00:10:28,650 --> 00:10:31,290 Ya, it's - >> [pelajar] Ia boleh ditulis ganti. >> Yeah. 122 00:10:31,290 --> 00:10:34,660 Ia adalah benar-benar - Jika anda cuba dan - 123 00:10:34,660 --> 00:10:38,040 Ini juga akan menjadi sebuah bar * int kerana ia kembali penunjuk, 124 00:10:38,040 --> 00:10:41,310 jadi jenis pulangan adalah int *. 125 00:10:41,310 --> 00:10:46,500 Jika anda cuba untuk menggunakan nilai pulangan fungsi ini, ia adalah tingkah laku undefined 126 00:10:46,500 --> 00:10:51,770 kerana penunjuk yang menunjuk ke memori buruk. >> [Pelajar] Okay. 127 00:10:51,770 --> 00:11:01,250 Jadi apa jika, sebagai contoh, anda mengisytiharkan int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 Itulah yang lebih baik. Ya. 129 00:11:03,740 --> 00:11:07,730 [Pelajar] Kita bercakap tentang bagaimana apabila kita mengheret perkara ke tong kitar semula kami 130 00:11:07,730 --> 00:11:11,750 mereka sebenarnya tidak dipadamkan; kita hanya kehilangan petunjuk mereka. 131 00:11:11,750 --> 00:11:15,550 Jadi dalam kes ini adakah kita sebenarnya memadam nilai atau ia masih ada dalam ingatan? 132 00:11:15,550 --> 00:11:19,130 Bagi sebahagian besar, ia akan masih berada di sana. 133 00:11:19,130 --> 00:11:24,220 Tetapi mari kita mengatakan bahawa kita berlaku untuk memanggil beberapa fungsi lain, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz akan untuk mendapatkan bingkai tindanan sendiri di sini. 135 00:11:28,990 --> 00:11:31,470 Ia akan penggantian semua barangan ini, 136 00:11:31,470 --> 00:11:34,180 dan kemudian jika anda kemudian cuba menggunakan penunjuk yang anda mendapat sebelum, 137 00:11:34,180 --> 00:11:35,570 ia tidak akan menjadi nilai yang sama. 138 00:11:35,570 --> 00:11:38,150 Ia akan telah berubah hanya kerana anda dipanggil Baz fungsi. 139 00:11:38,150 --> 00:11:43,080 [Pelajar] Tetapi sekiranya kita tidak akan kita masih mendapat 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Dalam semua kemungkinan, anda akan. 141 00:11:44,990 --> 00:11:49,670 Tetapi anda tidak boleh bergantung kepada itu. C hanya berkata tingkah laku undefined. 142 00:11:49,670 --> 00:11:51,920 >> [Pelajar] Oh, ia tidak. Okay. 143 00:11:51,920 --> 00:11:58,190 Jadi, apabila anda mahu untuk kembali penunjuk, ini adalah di mana malloc datang dalam digunakan. 144 00:12:00,930 --> 00:12:15,960 Saya menulis sebenarnya hanya kembali malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Kami akan pergi lebih malloc lebih dalam kedua, tetapi idea malloc semua pembolehubah tempatan anda 146 00:12:24,050 --> 00:12:26,760 selalu pergi pada timbunan. 147 00:12:26,760 --> 00:12:31,570 Apa sahaja yang malloced pergi pada timbunan, dan ia selama-lamanya dan akan sentiasa pada timbunan 148 00:12:31,570 --> 00:12:34,490 sehingga anda dengan jelas membebaskan ia. 149 00:12:34,490 --> 00:12:42,130 Jadi ini bermakna bahawa apabila anda malloc sesuatu, ia akan terus hidup selepas pulangan fungsi. 150 00:12:42,130 --> 00:12:46,800 [Pelajar] ia akan bertahan selepas program berhenti berjalan? >> No. 151 00:12:46,800 --> 00:12:53,180 Okay, jadi ia akan berada di sana sehingga program ini adalah semua cara yang dilakukan berjalan. >> Ya. 152 00:12:53,180 --> 00:12:57,510 Kita boleh pergi ke butir-butir apa yang berlaku apabila program ini berhenti berjalan. 153 00:12:57,510 --> 00:13:02,150 Anda mungkin perlu untuk mengingatkan saya, tetapi itu adalah satu perkara yang berasingan sepenuhnya. 154 00:13:02,150 --> 00:13:04,190 [Pelajar] Jadi malloc mewujudkan penunjuk? >> Yeah. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [pelajar] saya fikir malloc menandakan blok memori yang penunjuk boleh menggunakan. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Saya mahu rajah itu lagi. >> [Pelajar] Jadi fungsi ini berfungsi, walaupun? 157 00:13:19,610 --> 00:13:26,430 [Pelajar] Yeah, malloc menandakan blok memori yang anda boleh gunakan, 158 00:13:26,430 --> 00:13:30,470 dan kemudian ia kembali alamat blok memori yang pertama. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Yeah. Jadi apabila anda malloc, anda meraih beberapa blok memori 160 00:13:36,750 --> 00:13:38,260 yang sedang dalam timbunan. 161 00:13:38,260 --> 00:13:43,040 Jika timbunan itu terlalu kecil, maka timbunan itu hanya akan berkembang, dan ia tumbuh ke arah ini. 162 00:13:43,040 --> 00:13:44,650 Jadi mari kita mengatakan timbunan itu terlalu kecil. 163 00:13:44,650 --> 00:13:49,960 Maka ia adalah kira-kira untuk berkembang sedikit dan kembali penunjuk kepada blok ini yang hanya meningkat. 164 00:13:49,960 --> 00:13:55,130 Apabila anda barangan percuma, anda membuat lebih banyak ruang dalam timbunan, 165 00:13:55,130 --> 00:14:00,030 demikian maka kemudian memanggil malloc boleh menggunakan semula bahawa memori yang anda sebelum ini telah dibebaskan. 166 00:14:00,030 --> 00:14:09,950 Perkara penting mengenai malloc dan bebas adalah bahawa ia memberi anda kawalan sepenuhnya 167 00:14:09,950 --> 00:14:12,700 sepanjang hayat blok-blok memori. 168 00:14:12,700 --> 00:14:15,420 Pembolehubah global adalah sentiasa hidup. 169 00:14:15,420 --> 00:14:18,500 Pembolehubah tempatan hidup dalam skop mereka. 170 00:14:18,500 --> 00:14:22,140 Secepat anda pergi lalu bersedia kerinting, pembolehubah tempatan mati. 171 00:14:22,140 --> 00:14:28,890 Memori Malloced adalah hidup apabila anda mahu ia hidup 172 00:14:28,890 --> 00:14:33,480 dan kemudian dikeluarkan apabila anda memberitahu ia akan dikeluarkan. 173 00:14:33,480 --> 00:14:38,420 Mereka sebenarnya hanya 3 jenis memori, benar-benar. 174 00:14:38,420 --> 00:14:41,840 Ada pengurusan memori automatik, yang merupakan timbunan. 175 00:14:41,840 --> 00:14:43,840 Perkara yang berlaku untuk anda secara automatik. 176 00:14:43,840 --> 00:14:46,910 Apabila anda mengatakan int x, memori diperuntukkan bagi x int. 177 00:14:46,910 --> 00:14:51,630 Apabila x padam skop, memori ditebusguna bagi x. 178 00:14:51,630 --> 00:14:54,790 Kemudian terdapat pengurusan memori dinamik, yang adalah apa yang malloc, 179 00:14:54,790 --> 00:14:56,740 yang adalah apabila anda mempunyai kawalan. 180 00:14:56,740 --> 00:15:01,290 Anda dinamik memutuskan apabila memori harus dan tidak harus diperuntukkan. 181 00:15:01,290 --> 00:15:05,050 Dan kemudian ada yang statik, yang hanya bermakna bahawa ia hidup selama-lamanya, 182 00:15:05,050 --> 00:15:06,610 yang merupakan apa pembolehubah global. 183 00:15:06,610 --> 00:15:10,240 Mereka hanya sentiasa dalam ingatan. 184 00:15:10,960 --> 00:15:12,760 >> Soalan? 185 00:15:14,490 --> 00:15:17,230 [Pelajar] Bolehkah anda menentukan blok hanya dengan menggunakan pendakap kerinting 186 00:15:17,230 --> 00:15:21,220 tetapi tidak perlu mempunyai? jika pernyataan atau kenyataan sementara atau apa-apa seperti itu. 187 00:15:21,220 --> 00:15:29,130 Anda boleh menentukan blok seperti dalam fungsi, tetapi yang mempunyai kerinting pendakap terlalu. 188 00:15:29,130 --> 00:15:32,100 [Pelajar] Jadi anda tidak boleh hanya mempunyai seperti sepasang pendakap kerinting rawak dalam kod anda 189 00:15:32,100 --> 00:15:35,680 yang mempunyai pembolehubah tempatan? >> Ya, anda boleh. 190 00:15:35,680 --> 00:15:45,900 Inside bar int kita boleh mempunyai {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Itu sepatutnya menjadi hak di sini. 192 00:15:48,440 --> 00:15:52,450 Tetapi yang benar-benar mentakrifkan skop int y. 193 00:15:52,450 --> 00:15:57,320 Selepas bahawa pendakap kerinting kedua, y tidak boleh digunakan lagi. 194 00:15:57,910 --> 00:16:00,630 Anda hampir tidak pernah berbuat demikian, walaupun. 195 00:16:02,940 --> 00:16:07,370 Mendapatkan kembali kepada apa yang berlaku apabila program berakhir, 196 00:16:07,370 --> 00:16:18,760 ada jenis dusta tanggapan / setengah yang kita berikan dalam usaha untuk hanya membuat perkara yang mudah. 197 00:16:18,760 --> 00:16:24,410 Kami memberitahu anda bahawa apabila anda memperuntukkan memori 198 00:16:24,410 --> 00:16:29,860 anda memperuntukkan beberapa Sebahagian RAM bagi pemboleh ubah itu. 199 00:16:29,860 --> 00:16:34,190 Tetapi anda tidak benar-benar langsung menyentuh RAM pernah dalam program anda. 200 00:16:34,190 --> 00:16:37,490 Jika anda berfikir tentang hal itu, bagaimana saya menarik - 201 00:16:37,490 --> 00:16:44,330 Dan sebenarnya, jika anda pergi melalui dalam GDB anda akan melihat perkara yang sama. 202 00:16:51,120 --> 00:16:57,590 Tidak kira berapa kali anda menjalankan program anda atau apa program yang anda menjalankan, 203 00:16:57,590 --> 00:16:59,950 timbunan sentiasa akan bermula - 204 00:16:59,950 --> 00:17:06,510 anda sentiasa akan melihat pembolehubah sekitar sesuatu oxbffff alamat. 205 00:17:06,510 --> 00:17:09,470 Ia biasanya tempat di rantau itu. 206 00:17:09,470 --> 00:17:18,760 Tetapi bagaimana boleh 2 program mungkin mempunyai petunjuk untuk memori yang sama? 207 00:17:20,640 --> 00:17:27,650 [Pelajar] Terdapat beberapa jawatan sewenang-wenangnya mana oxbfff sepatutnya pada RAM 208 00:17:27,650 --> 00:17:31,320 yang sebenarnya boleh berada di tempat-tempat yang berbeza-beza apabila fungsi dipanggil. 209 00:17:31,320 --> 00:17:35,920 Yeah. Istilah ini adalah ingatan maya. 210 00:17:35,920 --> 00:17:42,250 Idea ini adalah bahawa setiap proses tunggal, setiap program tunggal yang sedang berjalan pada komputer anda 211 00:17:42,250 --> 00:17:49,450 mempunyai sendiri - mari kita andaikan 32 bit alamat benar-benar bebas ruang. 212 00:17:49,450 --> 00:17:51,590 Ini adalah ruang alamat. 213 00:17:51,590 --> 00:17:56,220 Ia mempunyai sendiri yang benar-benar bebas 4 gigabait untuk digunakan. 214 00:17:56,220 --> 00:18:02,220 >> Jadi, jika anda menjalankan 2 program serentak, program ini melihat 4 gigabait kepada dirinya, 215 00:18:02,220 --> 00:18:04,870 program ini melihat 4 gigabait untuk dirinya sendiri, 216 00:18:04,870 --> 00:18:07,720 dan ia adalah mustahil untuk program ini untuk dereference penunjuk 217 00:18:07,720 --> 00:18:10,920 dan akhirnya dengan memori daripada program ini. 218 00:18:10,920 --> 00:18:18,200 Dan apa memori maya adalah pemetaan daripada ruang alamat proses 219 00:18:18,200 --> 00:18:20,470 kepada perkara-perkara sebenar pada RAM. 220 00:18:20,470 --> 00:18:22,940 Jadi ia terpulang kepada sistem operasi anda untuk mengetahui bahawa, 221 00:18:22,940 --> 00:18:28,080 hey, apabila ini lelaki dereferences penunjuk oxbfff, yang benar-benar bermakna 222 00:18:28,080 --> 00:18:31,040 bahawa dia mahu RAM bait 1000, 223 00:18:31,040 --> 00:18:38,150 sedangkan jika ini oxbfff dereferences program, dia benar-benar mahu RAM bait 10000. 224 00:18:38,150 --> 00:18:41,590 Mereka boleh sewenang-wenangnya jauh. 225 00:18:41,590 --> 00:18:48,730 Ini adalah lebih benar perkara dalam ruang proses alamat tunggal. 226 00:18:48,730 --> 00:18:54,770 Jadi seperti ia melihat semua 4 gigabait untuk dirinya sendiri, tetapi katakan - 227 00:18:54,770 --> 00:18:57,290 [Pelajar] Adakah setiap proses tunggal - 228 00:18:57,290 --> 00:19:01,350 Katakan anda mempunyai komputer dengan hanya 4 gigabait RAM. 229 00:19:01,350 --> 00:19:06,430 Adakah setiap proses tunggal melihat keseluruhan 4 gigabait? >> Ya. 230 00:19:06,430 --> 00:19:13,060 Tetapi 4 gigabait ia melihat adalah satu pembohongan. 231 00:19:13,060 --> 00:19:20,460 Ia hanya ia berpendapat ia mempunyai semua memori ini kerana ia tidak tahu apa-apa proses lain wujud. 232 00:19:20,460 --> 00:19:28,140 Ia hanya akan menggunakan memori yang banyak seperti ia sebenarnya perlu. 233 00:19:28,140 --> 00:19:32,340 Sistem operasi tidak akan memberi RAM kepada proses ini 234 00:19:32,340 --> 00:19:35,750 jika ia tidak menggunakan apa-apa memori di seluruh rantau ini. 235 00:19:35,750 --> 00:19:39,300 Ia tidak akan memberikan memori untuk rantau itu. 236 00:19:39,300 --> 00:19:54,780 Tetapi idea bahawa - saya cuba untuk berfikir - saya tidak boleh berfikir satu analogi. 237 00:19:54,780 --> 00:19:56,780 Analogi sukar. 238 00:19:57,740 --> 00:20:02,700 Salah satu daripada isu-isu memori maya atau salah satu daripada perkara-perkara yang ia menyelesaikan 239 00:20:02,700 --> 00:20:06,810 adalah bahawa proses harus menyedari sepenuhnya antara satu sama lain. 240 00:20:06,810 --> 00:20:12,140 Dan supaya anda boleh menulis mana-mana program yang hanya dereferences penunjuk mana-mana, 241 00:20:12,140 --> 00:20:19,340 suka hanya menulis satu program yang mengatakan * (ox1234), 242 00:20:19,340 --> 00:20:22,890 dan bahawa memori dereferencing alamat 1234. 243 00:20:22,890 --> 00:20:28,870 >> Tetapi ia terpulang kepada sistem operasi kemudian menterjemahkan apa 1234 cara. 244 00:20:28,870 --> 00:20:33,960 Jadi, jika 1234 berlaku untuk menjadi alamat ingatan yang sah untuk proses ini, 245 00:20:33,960 --> 00:20:38,800 seperti ia pada timbunan atau sesuatu, maka ini akan memulangkan nilai alamat memori yang 246 00:20:38,800 --> 00:20:41,960 setakat sebagai proses tahu. 247 00:20:41,960 --> 00:20:47,520 Tetapi jika 1234 bukan alamat yang sah, seperti ia berlaku kepada tanah 248 00:20:47,520 --> 00:20:52,910 dalam sekeping beberapa sedikit ingatan di sini bahawa adalah di luar timbunan dan seterusnya timbunan itu 249 00:20:52,910 --> 00:20:57,200 dan anda tidak benar-benar digunakan, maka itulah apabila anda mendapatkan perkara-perkara seperti segfaults 250 00:20:57,200 --> 00:21:00,260 kerana anda menyentuh memori yang anda tidak perlu menyentuh. 251 00:21:07,180 --> 00:21:09,340 Ini juga benar - 252 00:21:09,340 --> 00:21:15,440 Satu sistem 32-bit, 32-bit bermakna anda mempunyai 32 bit untuk menentukan alamat ingatan. 253 00:21:15,440 --> 00:21:22,970 Ia itulah petunjuk 8 bait kerana 32 bit 8 bait - atau 4 bait. 254 00:21:22,970 --> 00:21:25,250 Penunjuk 4 bait. 255 00:21:25,250 --> 00:21:33,680 Jadi, apabila anda melihat penunjuk seperti oxbfffff, iaitu: - 256 00:21:33,680 --> 00:21:40,080 Dalam mana-mana program yang diberikan anda hanya boleh membina apa-apa penunjuk sewenang-wenangnya, 257 00:21:40,080 --> 00:21:46,330 mana-mana dari ox0 untuk lembu 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Pelajar] Tidakkah kamu katakan mereka 4 bait? >> Yeah. 259 00:21:49,180 --> 00:21:52,730 [Pelajar] Kemudian bait masing-masing akan mempunyai - >> [Bowden] Perenambelasan. 260 00:21:52,730 --> 00:21:59,360 Perenambelasan - 5, 6, 7, 8. Jadi petunjuk anda akan sentiasa melihat dalam perenambelasan. 261 00:21:59,360 --> 00:22:01,710 Ia hanya bagaimana kita mengklasifikasikan petunjuk. 262 00:22:01,710 --> 00:22:05,240 Setiap 2 digit perenambelasan adalah 1 bait. 263 00:22:05,240 --> 00:22:09,600 Jadi ada akan menjadi 8 digit perenambelasan untuk 4 bait. 264 00:22:09,600 --> 00:22:14,190 Jadi setiap penunjuk tunggal pada sistem 32-bit akan menjadi 4 bait, 265 00:22:14,190 --> 00:22:18,550 yang bermaksud bahawa dalam proses anda, anda boleh membina apa-apa sewenang-wenangnya 4 bait 266 00:22:18,550 --> 00:22:20,550 dan membuat penunjuk daripada itu, 267 00:22:20,550 --> 00:22:32,730 yang bermaksud bahawa sejauh ia sedar, ia boleh menangani keseluruhan tempoh 2 32 bait memori. 268 00:22:32,730 --> 00:22:34,760 Walaupun ia tidak benar-benar mempunyai akses kepada, 269 00:22:34,760 --> 00:22:40,190 walaupun komputer anda hanya mempunyai 512 megabait, ia berpendapat ia mempunyai memori yang banyak. 270 00:22:40,190 --> 00:22:44,930 Dan sistem operasi pintar cukup bahawa ia hanya akan memperuntukkan apa yang anda benar-benar perlu. 271 00:22:44,930 --> 00:22:49,630 Ia tidak hanya pergi, oh, proses baru: 4 gig. 272 00:22:49,630 --> 00:22:51,930 >> Yeah. >> [Pelajar] Apakah lembu bermakna? Mengapa anda menulis? 273 00:22:51,930 --> 00:22:54,980 Ia hanya simbol bagi perenambelasan. 274 00:22:54,980 --> 00:22:59,590 Apabila anda melihat permulaan nombor dengan lembu, perkara berturut perenambelasan. 275 00:23:01,930 --> 00:23:05,760 [Pelajar] Anda telah menjelaskan tentang apa yang berlaku apabila program berakhir. >> Ya. 276 00:23:05,760 --> 00:23:09,480 Apa yang berlaku apabila program berakhir adalah sistem operasi 277 00:23:09,480 --> 00:23:13,600 hanya memadamkan pemetaan bahawa ia mempunyai untuk alamat ini, dan itu sahaja. 278 00:23:13,600 --> 00:23:17,770 Sistem operasi kini boleh hanya memberi ingatan bahawa program lain untuk digunakan. 279 00:23:17,770 --> 00:23:19,490 [Pelajar] Okay. 280 00:23:19,490 --> 00:23:24,800 Jadi, apabila anda memperuntukkan sesuatu pada timbunan atau pembolehubah timbunan atau global atau apa-apa, 281 00:23:24,800 --> 00:23:27,010 mereka semua hanya hilang secepat program berakhir 282 00:23:27,010 --> 00:23:32,120 kerana sistem operasi kini bebas untuk memberi ingatan itu kepada apa-apa proses lain. 283 00:23:32,120 --> 00:23:35,150 [Pelajar] Walaupun mungkin masih terdapat nilai-nilai yang ditulis dalam? >> Yeah. 284 00:23:35,150 --> 00:23:37,740 Nilai-nilai yang mungkin masih ada. 285 00:23:37,740 --> 00:23:41,570 Ia hanya ia akan menjadi sukar untuk mendapatkan mereka. 286 00:23:41,570 --> 00:23:45,230 Ia adalah lebih sukar untuk mendapatkan mereka daripada ia adalah untuk mendapatkan sekurang-fail dipadam 287 00:23:45,230 --> 00:23:51,450 kerana jenis fail yang dipadam daripada duduk di sana untuk masa yang lama dan cakera keras adalah lebih besar. 288 00:23:51,450 --> 00:23:54,120 Jadi ia akan overwrite bahagian yang berlainan memori 289 00:23:54,120 --> 00:23:58,640 sebelum ia berlaku menimpa sebahagian ingatan bahawa fail yang digunakan untuk berada di. 290 00:23:58,640 --> 00:24:04,520 Tetapi ingatan utama, RAM, anda kitaran melalui banyak yang lebih cepat, 291 00:24:04,520 --> 00:24:08,040 jadi ia akan sangat cepat ditindih. 292 00:24:10,300 --> 00:24:13,340 Soalan ini atau apa-apa lagi? 293 00:24:13,340 --> 00:24:16,130 [Pelajar] Saya mempunyai soalan mengenai topik yang berbeza. >> Okay. 294 00:24:16,130 --> 00:24:19,060 Adakah sesiapa yang mempunyai soalan mengenai perkara ini? 295 00:24:20,170 --> 00:24:23,120 >> Okay. Topik yang berbeza. >> [Pelajar] Okay. 296 00:24:23,120 --> 00:24:26,550 Saya akan melalui beberapa ujian amalan, 297 00:24:26,550 --> 00:24:30,480 dan salah seorang daripada mereka, ia bercakap tentang sizeof 298 00:24:30,480 --> 00:24:35,630 dan nilai bahawa ia kembali atau jenis yang berubah-ubah. >> Ya. 299 00:24:35,630 --> 00:24:45,060 Dan ia berkata bahawa kedua-dua int dan panjang kedua-dua pulangan 4, jadi mereka kedua-dua 4 bait panjang. 300 00:24:45,060 --> 00:24:48,070 Adakah terdapat sebarang perbezaan di antara int dan panjang, atau adakah ia perkara yang sama? 301 00:24:48,070 --> 00:24:50,380 Ya, terdapat perbezaan. 302 00:24:50,380 --> 00:24:52,960 C standard - 303 00:24:52,960 --> 00:24:54,950 Saya mungkin akan merosakkan. 304 00:24:54,950 --> 00:24:58,800 Standard C adalah sama seperti apa yang C, dokumentasi rasmi C. 305 00:24:58,800 --> 00:25:00,340 Ini adalah apa yang dikatakannya. 306 00:25:00,340 --> 00:25:08,650 Jadi standard C hanya mengatakan bahawa char selama-lamanya dan akan sentiasa menjadi 1 bait. 307 00:25:10,470 --> 00:25:19,040 Segala-galanya selepas itu - pendek sentiasa hanya ditakrifkan sebagai lebih besar daripada atau sama kepada char. 308 00:25:19,040 --> 00:25:23,010 Ini mungkin tegas lebih besar daripada, tetapi tidak positif. 309 00:25:23,010 --> 00:25:31,940 Int hanya ditakrifkan sebagai lebih besar daripada atau sama pendek. 310 00:25:31,940 --> 00:25:36,210 Dan yang lama hanya ditakrifkan sebagai lebih besar daripada atau sama dengan int. 311 00:25:36,210 --> 00:25:41,600 Dan yang lama adalah lebih besar atau sama dengan yang lama. 312 00:25:41,600 --> 00:25:46,610 Jadi satu-satunya perkara standard C mentakrifkan adalah pesanan relatif segala-galanya. 313 00:25:46,610 --> 00:25:54,880 Jumlah sebenar memori bahawa perkara-perkara yang mengambil umumnya sehingga pelaksanaan, 314 00:25:54,880 --> 00:25:57,640 tetapi ia cukup ditakrifkan dengan baik pada ketika ini. >> [Pelajar] Okay. 315 00:25:57,640 --> 00:26:02,490 Jadi seluar pendek hampir sentiasa akan menjadi 2 bait. 316 00:26:04,920 --> 00:26:09,950 Ints hampir sentiasa akan menjadi 4 bait. 317 00:26:12,070 --> 00:26:15,340 Long Long hampir sentiasa akan menjadi 8 bait. 318 00:26:17,990 --> 00:26:23,160 Dan Roh meronta-ronta, ia bergantung kepada sama ada anda menggunakan 32-bit atau sistem 64-bit. 319 00:26:23,160 --> 00:26:27,450 Jadi panjang akan sesuai dengan jenis sistem. 320 00:26:27,450 --> 00:26:31,920 Jika anda menggunakan sistem 32-bit seperti Peralatan ini, ia akan menjadi 4 bait. 321 00:26:34,530 --> 00:26:42,570 Jika anda menggunakan 64-bit seperti banyak komputer kebelakangan ini, ia akan menjadi 8 bait. 322 00:26:42,570 --> 00:26:45,230 >> Ints adalah hampir sentiasa 4 bait pada ketika ini. 323 00:26:45,230 --> 00:26:47,140 Long Long adalah hampir sentiasa 8 bait. 324 00:26:47,140 --> 00:26:50,300 Pada masa lalu, ints digunakan untuk hanya menjadi 2 bait. 325 00:26:50,300 --> 00:26:56,840 Tetapi melihat bahawa ini benar-benar memenuhi semua hubungan ini lebih besar daripada dan sama dengan. 326 00:26:56,840 --> 00:27:01,280 Selagi sempurna dibenarkan untuk menjadi saiz yang sama seperti integer, 327 00:27:01,280 --> 00:27:04,030 dan ia juga dibenarkan untuk menjadi saiz yang sama seperti yang lama. 328 00:27:04,030 --> 00:27:11,070 Dan ia hanya kebetulan bahawa dalam 99,999% sistem, ia akan menjadi sama dengan 329 00:27:11,070 --> 00:27:15,800 sama ada int atau lama. Ia hanya bergantung kepada 32-bit atau 64-bit. >> [Pelajar] Okay. 330 00:27:15,800 --> 00:27:24,600 Dalam terapung, bagaimana adalah titik perpuluhan yang ditetapkan dari segi bit? 331 00:27:24,600 --> 00:27:27,160 Seperti sebagai binari? >> Yeah. 332 00:27:27,160 --> 00:27:30,570 Anda tidak perlu tahu bahawa bagi CS50. 333 00:27:30,570 --> 00:27:32,960 Anda bahkan tidak mengetahui bahawa pada tahun 61. 334 00:27:32,960 --> 00:27:37,350 Anda tidak mengetahui bahawa benar-benar dalam mana-mana kursus. 335 00:27:37,350 --> 00:27:42,740 Ia hanya gambaran. 336 00:27:42,740 --> 00:27:45,440 Saya lupa perumpukan bit tepat. 337 00:27:45,440 --> 00:27:53,380 Idea titik terapung adalah bahawa anda memperuntukkan sejumlah tertentu bit untuk mewakili - 338 00:27:53,380 --> 00:27:56,550 Pada asasnya, segala-galanya adalah dalam notasi saintifik. 339 00:27:56,550 --> 00:28:05,600 Jadi anda memperuntukkan bilangan tertentu bit untuk mewakili nombor itu sendiri, seperti 1,2345. 340 00:28:05,600 --> 00:28:10,200 Saya tidak boleh mewakili nombor dengan angka yang lebih daripada 5. 341 00:28:12,200 --> 00:28:26,300 Kemudian anda juga memperuntukkan satu bilangan tertentu bit supaya ia cenderung untuk menjadi seperti 342 00:28:26,300 --> 00:28:32,810 anda hanya boleh pergi sehingga kepada bilangan tertentu, seperti itulah eksponen terbesar anda boleh mempunyai, 343 00:28:32,810 --> 00:28:36,190 dan anda hanya boleh pergi ke eksponen tertentu, 344 00:28:36,190 --> 00:28:38,770 seperti itulah eksponen terkecil anda boleh mempunyai. 345 00:28:38,770 --> 00:28:44,410 >> Saya tidak ingat cara bit tepat diberikan kepada semua nilai-nilai ini, 346 00:28:44,410 --> 00:28:47,940 tetapi sebilangan bit didedikasikan kepada 1,2345, 347 00:28:47,940 --> 00:28:50,930 lain sebilangan bit khusus untuk eksponen, 348 00:28:50,930 --> 00:28:55,670 dan ia hanya mungkin untuk mewakili eksponen saiz tertentu. 349 00:28:55,670 --> 00:29:01,100 [Pelajar] Dan double? Adakah itu seperti apungan yang lebih panjang? >> Yeah. 350 00:29:01,100 --> 00:29:07,940 Ia adalah perkara yang sama sebagai apungan kecuali sekarang anda menggunakan 8 bait bukannya daripada 4 bait. 351 00:29:07,940 --> 00:29:11,960 Sekarang anda akan dapat untuk menggunakan 9 digit atau 10 digit, 352 00:29:11,960 --> 00:29:16,630 dan ini akan mampu untuk pergi ke 300 dan bukannya 100. >> [Pelajar] Okay. 353 00:29:16,630 --> 00:29:21,550 Dan terapung juga 4 bait. >> Ya. 354 00:29:21,550 --> 00:29:27,520 Nah, sekali lagi, ia mungkin bergantung keseluruhan mengenai pelaksanaan am, 355 00:29:27,520 --> 00:29:30,610 tetapi terapung 4 bait, beregu 8. 356 00:29:30,610 --> 00:29:33,440 Doubles dipanggil dua kali ganda kerana mereka adalah dua kali ganda saiz terapung. 357 00:29:33,440 --> 00:29:38,380 [Pelajar] Okay. Dan ada dua kali ganda beregu? >> Tidak. 358 00:29:38,380 --> 00:29:43,660 Saya fikir - >> [pelajar] Seperti Long lama? >> Yeah. Saya tidak fikir begitu. Ya. 359 00:29:43,660 --> 00:29:45,950 [Pelajar] Pada ujian tahun lepas terdapat soalan tentang fungsi utama 360 00:29:45,950 --> 00:29:49,490 perlu menjadi sebahagian daripada program anda. 361 00:29:49,490 --> 00:29:52,310 Jawapannya adalah bahawa ia tidak perlu untuk menjadi sebahagian daripada program anda. 362 00:29:52,310 --> 00:29:55,100 Dalam apa keadaan? Itulah apa yang saya lihat. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Nampaknya - >> [pelajar] Apa keadaan? 364 00:29:59,090 --> 00:30:02,880 Adakah anda mempunyai masalah? >> [Pelajar] Ya, saya pasti boleh tarik sehingga ia. 365 00:30:02,880 --> 00:30:07,910 Ia tidak perlu, teknikal, tetapi pada dasarnya ia akan menjadi. 366 00:30:07,910 --> 00:30:10,030 [Pelajar] saya nampak salah pada yang berbeza tahun ini. 367 00:30:10,030 --> 00:30:16,220 Ia adalah seperti Benar atau Palsu: A sah - >> Oh, fail c.? 368 00:30:16,220 --> 00:30:18,790 [Pelajar] Sebarang fail c mesti mempunyai - [kedua-dua bercakap pada sekali difahami] 369 00:30:18,790 --> 00:30:21,120 Okay. Jadi yang berasingan. 370 00:30:21,120 --> 00:30:26,800 >> Sebuah fail c hanya perlu mengandungi fungsi. 371 00:30:26,800 --> 00:30:32,400 Anda boleh menyusun fail ke dalam kod mesin, binari, apa jua, 372 00:30:32,400 --> 00:30:36,620 tanpa ia menjadi laku lagi. 373 00:30:36,620 --> 00:30:39,420 A laku yang sah mestilah mempunyai fungsi utama. 374 00:30:39,420 --> 00:30:45,460 Anda boleh menulis 100 fungsi dalam 1 fail tetapi tidak utama 375 00:30:45,460 --> 00:30:48,800 dan kemudian menyusun yang turun kepada perduaan, 376 00:30:48,800 --> 00:30:54,460 maka anda menulis fail yang lain hanya mempunyai utama tetapi ia memerlukan sekumpulan fungsi ini 377 00:30:54,460 --> 00:30:56,720 dalam fail ini perduaan di sini. 378 00:30:56,720 --> 00:31:01,240 Dan supaya apabila anda membuat laku, bahawa apa yang dilakukan oleh pemaut 379 00:31:01,240 --> 00:31:05,960 ia menggabungkan 2 fail binari ke laksana. 380 00:31:05,960 --> 00:31:11,400 Jadi fail c tidak perlu untuk mempunyai fungsi utama pada semua. 381 00:31:11,400 --> 00:31:19,220 Dan pada asas kod besar, anda akan melihat beribu-ribu c fail dan 1 file utama. 382 00:31:23,960 --> 00:31:26,110 Lebih banyak soalan? 383 00:31:29,310 --> 00:31:31,940 [Pelajar] Ada satu lagi soalan. 384 00:31:31,940 --> 00:31:36,710 Ia berkata buat ialah pengkompil. Benar atau Palsu? 385 00:31:36,710 --> 00:31:42,030 Dan jawapannya adalah palsu, dan saya memahami mengapa ia tidak seperti dilafaz. 386 00:31:42,030 --> 00:31:44,770 Tetapi apa yang kita panggil membuat jika ia tidak? 387 00:31:44,770 --> 00:31:49,990 Membuat adalah pada dasarnya hanya - saya boleh melihat apa yang ia memanggilnya. 388 00:31:49,990 --> 00:31:52,410 Tetapi ia hanya menjalankan arahan. 389 00:31:53,650 --> 00:31:55,650 Membuat. 390 00:31:58,240 --> 00:32:00,870 Saya boleh tarik sehingga ini. Yeah. 391 00:32:10,110 --> 00:32:13,180 Oh, ya. Buat juga tidak bahawa. 392 00:32:13,180 --> 00:32:17,170 Ini mengatakan tujuan utiliti membuat adalah untuk menentukan secara automatik 393 00:32:17,170 --> 00:32:19,610 yang keping program besar perlu recompiled 394 00:32:19,610 --> 00:32:22,350 dan mengeluarkan arahan kepada susun semula mereka. 395 00:32:22,350 --> 00:32:27,690 Anda boleh membuat membuat fail yang benar-benar besar. 396 00:32:27,690 --> 00:32:33,210 Buat kelihatan pada setem masa fail dan, seperti yang kita katakan sebelum ini, 397 00:32:33,210 --> 00:32:36,930 anda boleh menyusun fail individu, dan ia tidak sehingga anda sampai ke pemaut 398 00:32:36,930 --> 00:32:39,270 bahawa mereka sedang meletakkan bersama-sama ke dalam laksana. 399 00:32:39,270 --> 00:32:43,810 Jadi jika anda mempunyai 10 fail yang berbeza dan anda membuat perubahan kepada 1 daripada mereka, 400 00:32:43,810 --> 00:32:47,870 maka apa yang membuat akan lakukan adalah hanya susun semula 1 fail 401 00:32:47,870 --> 00:32:50,640 dan kemudian relink semua bersama-sama. 402 00:32:50,640 --> 00:32:53,020 Tetapi ia lebih dumber daripada itu. 403 00:32:53,020 --> 00:32:55,690 Ia terpulang kepada anda untuk benar-benar menentukan bahawa itulah apa yang ia harus lakukan. 404 00:32:55,690 --> 00:32:59,560 Ia secara lalai mempunyai keupayaan untuk mengenali barangan ini masa setem, 405 00:32:59,560 --> 00:33:03,220 tetapi anda boleh menulis fail membuat untuk berbuat apa-apa. 406 00:33:03,220 --> 00:33:09,150 Anda boleh menulis membuat fail supaya apabila anda menaip membuat ia hanya cd ke direktori lain. 407 00:33:09,150 --> 00:33:15,560 Saya telah semakin kecewa kerana saya jelujur segala-galanya di dalam Appliance saya 408 00:33:15,560 --> 00:33:21,740 dan kemudian saya melihat PDF dari Mac. 409 00:33:21,740 --> 00:33:30,720 >> Jadi saya pergi kepada Finder dan saya boleh Pergi, Sambung ke Server, 410 00:33:30,720 --> 00:33:36,950 dan pelayan saya menyambung ke Appliance saya, dan kemudian saya membuka PDF 411 00:33:36,950 --> 00:33:40,190 yang mendapat disusun oleh LaTeX. 412 00:33:40,190 --> 00:33:49,320 Tetapi saya telah semakin kecewa kerana setiap kali tunggal saya yang diperlukan untuk menyegarkan PDF, 413 00:33:49,320 --> 00:33:53,900 Saya terpaksa menyalin ke direktori tertentu bahawa ia boleh mengakses 414 00:33:53,900 --> 00:33:57,710 dan ia semakin menjengkelkan. 415 00:33:57,710 --> 00:34:02,650 Jadi sebaliknya saya menulis fail membuat, yang anda perlu menentukan bagaimana ia membuat perkara. 416 00:34:02,650 --> 00:34:06,130 Bagaimana anda membuat ini adalah PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Sama seperti fail membuat mana-mana - Saya rasa anda tidak pernah melihat fail membuat, 418 00:34:10,090 --> 00:34:13,510 tetapi kita mempunyai dalam Appliance fail membuat global yang hanya berkata, 419 00:34:13,510 --> 00:34:16,679 jika anda menyusun fail C, gunakan dilafaz. 420 00:34:16,679 --> 00:34:20,960 Dan sebagainya di sini dalam fail membuat saya bahawa saya membuat saya katakan, 421 00:34:20,960 --> 00:34:25,020 fail ini, anda akan mahu untuk menyusun dengan LaTeX PDF. 422 00:34:25,020 --> 00:34:27,889 Dan supaya ia LaTeX PDF yang melakukan menyusun. 423 00:34:27,889 --> 00:34:31,880 Buat tidak menyusun. Ia hanya menjalankan arahan ini dalam urutan yang saya sebutkan. 424 00:34:31,880 --> 00:34:36,110 Jadi ia berjalan PDF LaTeX, ia salinan direktori saya mahu ia akan disalin ke, 425 00:34:36,110 --> 00:34:38,270 ia cd ke direktori dan melakukan perkara-perkara lain, 426 00:34:38,270 --> 00:34:42,380 tetapi ia mengiktiraf apabila perubahan fail, 427 00:34:42,380 --> 00:34:45,489 dan jika ia berubah, maka ia akan berjalan arahan bahawa ia sepatutnya untuk menjalankan 428 00:34:45,489 --> 00:34:48,760 apabila perubahan fail. >> [Pelajar] Okay. 429 00:34:50,510 --> 00:34:54,420 Saya tidak tahu di mana fail membuat global bagi saya untuk check it out. 430 00:34:57,210 --> 00:35:04,290 Soalan-soalan lain? Apa-apa sahaja dari masa lalu kuiz? Apa-apa perkara penunjuk? 431 00:35:06,200 --> 00:35:08,730 Terdapat perkara-perkara yang halus dengan petunjuk seperti - 432 00:35:08,730 --> 00:35:10,220 Saya tidak akan dapat untuk mencari soalan kuiz di atasnya - 433 00:35:10,220 --> 00:35:16,250 tetapi hanya seperti jenis ini perkara. 434 00:35:19,680 --> 00:35:24,060 Pastikan anda memahami bahawa apabila saya mengatakan int * x * y - 435 00:35:24,890 --> 00:35:28,130 Ini tidak betul-betul apa-apa di sini, saya rasa. 436 00:35:28,130 --> 00:35:32,140 Tetapi seperti * x * y, mereka adalah 2 pembolehubah yang pada timbunan. 437 00:35:32,140 --> 00:35:37,220 Bila saya katakan x = malloc (sizeof (int)), x ialah masih pembolehubah pada timbunan, 438 00:35:37,220 --> 00:35:41,180 malloc adalah beberapa blok lebih dalam timbunan itu, dan kita mempunyai titik x kepada timbunan. 439 00:35:41,180 --> 00:35:43,900 >> Jadi sesuatu pada mata timbunan kepada timbunan. 440 00:35:43,900 --> 00:35:48,100 Apabila anda malloc apa-apa, anda pasti menyimpan ia di dalam penunjuk. 441 00:35:48,100 --> 00:35:55,940 Jadi penunjuk bahawa pada timbunan, blok malloced pada timbunan. 442 00:35:55,940 --> 00:36:01,240 Ramai orang mendapat keliru dan mengatakan int * x = malloc, x ialah pada timbunan. 443 00:36:01,240 --> 00:36:04,100 No Apa x menunjuk ke pada timbunan. 444 00:36:04,100 --> 00:36:08,540 x itu sendiri adalah pada timbunan, melainkan jika atas apa jua sebab anda telah x menjadi pembolehubah global, 445 00:36:08,540 --> 00:36:11,960 di mana ia berlaku untuk menjadi di rantau lain memori. 446 00:36:13,450 --> 00:36:20,820 Jadi mengesan, ini gambar rajah kotak dan anak panah adalah agak biasa bagi kuiz. 447 00:36:20,820 --> 00:36:25,740 Atau jika ia tidak kuiz 0, ia akan menjadi kuiz 1. 448 00:36:27,570 --> 00:36:31,940 Anda perlu tahu semua ini, langkah-langkah dalam menyusun 449 00:36:31,940 --> 00:36:35,740 kerana anda terpaksa menjawab soalan-soalan kepada orang-orang. Ya. 450 00:36:35,740 --> 00:36:38,940 [Pelajar] Bolehkah kita pergi ke langkah-langkah - >> Pasti. 451 00:36:48,340 --> 00:36:58,640 Sebelum langkah-langkah dan menyusun kita mempunyai prapemprosesan, 452 00:36:58,640 --> 00:37:16,750 menyusun, memasang, dan menghubungkan. 453 00:37:16,750 --> 00:37:21,480 Prapemprosesan. Apakah yang melakukan? 454 00:37:29,720 --> 00:37:32,290 Ia adalah langkah yang paling mudah di - baik, tidak seperti - 455 00:37:32,290 --> 00:37:35,770 itu tidak bermakna ia harus jelas, tetapi ia adalah langkah yang paling mudah. 456 00:37:35,770 --> 00:37:38,410 Kalian boleh melaksanakan diri sendiri. Yeah. 457 00:37:38,410 --> 00:37:43,410 [Pelajar] Ambil apa yang anda mempunyai dalam anda termasuk seperti ini dan ia salinan dan kemudian juga mentakrifkan. 458 00:37:43,410 --> 00:37:49,250 Ia kelihatan untuk perkara-perkara seperti # include dan # menentukan, 459 00:37:49,250 --> 00:37:53,800 dan ia hanya salinan dan Pes apa yang mereka sebenarnya bermakna. 460 00:37:53,800 --> 00:37:59,240 Jadi, apabila anda mengatakan # include cs50.h, prapemproses adalah menyalin dan menampal cs50.h 461 00:37:59,240 --> 00:38:01,030 ke dalam barisan itu. 462 00:38:01,030 --> 00:38:06,640 Apabila anda mengatakan # define x menjadi 4, prapemproses pergi melalui keseluruhan program 463 00:38:06,640 --> 00:38:10,400 dan menggantikan semua kejadian x dengan 4. 464 00:38:10,400 --> 00:38:17,530 Jadi prapemproses mengambil fail C yang sah dan output fail C yang sah 465 00:38:17,530 --> 00:38:20,300 mana perkara yang telah disalin dan ditampal. 466 00:38:20,300 --> 00:38:24,230 Jadi sekarang menyusun. Apakah yang melakukan? 467 00:38:25,940 --> 00:38:28,210 [Pelajar] Ia pergi dari C ke binari. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Ia tidak pergi sepanjang jalan kepada perduaan. 469 00:38:30,970 --> 00:38:34,220 [Pelajar] Untuk kod mesin kemudian? >> Ia bukan kod mesin. 470 00:38:34,220 --> 00:38:35,700 [Pelajar] Perhimpunan? >> Perhimpunan. 471 00:38:35,700 --> 00:38:38,890 Ia pergi ke Dewan sebelum ia pergi sepanjang jalan kepada kod C, 472 00:38:38,890 --> 00:38:45,010 dan kebanyakan bahasa melakukan sesuatu seperti ini. 473 00:38:47,740 --> 00:38:50,590 Memilih mana-mana bahasa peringkat tinggi, dan jika anda pergi untuk menyusun, 474 00:38:50,590 --> 00:38:52,390 ia adalah mungkin untuk menyusun dalam langkah-langkah. 475 00:38:52,390 --> 00:38:58,140 Pertama, ia akan untuk menyusun Python kepada C, maka ia akan menyusun C ke Perhimpunan, 476 00:38:58,140 --> 00:39:01,600 dan kemudian Perhimpunan akan mendapat diterjemahkan kepada perduaan. 477 00:39:01,600 --> 00:39:07,800 Jadi menyusun akan membawa ia dari C ke Perhimpunan. 478 00:39:07,800 --> 00:39:12,130 Perkataan menyusun biasanya bermakna membawa ia dari peringkat yang lebih tinggi 479 00:39:12,130 --> 00:39:14,340 kepada bahasa pengaturcaraan tahap yang lebih rendah. 480 00:39:14,340 --> 00:39:19,190 Jadi ini adalah langkah sahaja dalam penyusunan di mana anda bermula dengan bahasa peringkat tinggi 481 00:39:19,190 --> 00:39:23,270 dan akhirnya dalam bahasa tahap rendah, dan itulah mengapa langkah dipanggil menyusun. 482 00:39:25,280 --> 00:39:33,370 [Pelajar] Semasa menyusun, mari kita mengatakan bahawa anda telah melakukan # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Adakah pengkompil susun cs50.h, seperti fungsi yang berada di sana, 484 00:39:42,190 --> 00:39:45,280 dan menterjemahkan ke dalam kod Perhimpunan serta, 485 00:39:45,280 --> 00:39:50,830 atau ia akan menyalin dan tampal sesuatu yang menjadi pra-Perhimpunan? 486 00:39:50,830 --> 00:39:56,910 cs50.h akan cukup banyak tidak pernah berakhir di dalam Dewan. 487 00:39:59,740 --> 00:40:03,680 Perkara seperti prototaip fungsi dan perkara-perkara yang hanya untuk anda berhati-hati. 488 00:40:03,680 --> 00:40:09,270 Ia menjamin bahawa pengkompil boleh menyemak perkara-perkara seperti anda memanggil fungsi 489 00:40:09,270 --> 00:40:12,910 dengan jenis pulangan yang betul dan hujah-hujah yang betul dan barangan. 490 00:40:12,910 --> 00:40:18,350 >> Jadi cs50.h akan preprocessed ke dalam fail, dan kemudian apabila ia menyusun 491 00:40:18,350 --> 00:40:22,310 ia pada asasnya dibuang selepas ia memastikan bahawa segala-galanya yang dipanggil dengan betul. 492 00:40:22,310 --> 00:40:29,410 Tetapi fungsi yang ditakrifkan dalam perpustakaan CS50, yang berasingan daripada cs50.h, 493 00:40:29,410 --> 00:40:33,610 mereka tidak akan disusun secara berasingan. 494 00:40:33,610 --> 00:40:37,270 Itu sebenarnya akan datang ke bawah dalam langkah yang menghubungkan, jadi kami akan sampai ke dalam kedua. 495 00:40:37,270 --> 00:40:40,100 Tetapi pertama, apa yang memasang? 496 00:40:41,850 --> 00:40:44,500 [Pelajar] Perhimpunan binari? >> Yeah. 497 00:40:46,300 --> 00:40:48,190 Menghimpun. 498 00:40:48,190 --> 00:40:54,710 Kami tidak memanggil ia menyusun kerana Perhimpunan adalah cukup banyak terjemahan tulen binari. 499 00:40:54,710 --> 00:41:00,230 Terdapat logik sangat sedikit pergi dari Perhimpunan kepada perduaan. 500 00:41:00,230 --> 00:41:03,180 Ia hanya suka melihat ke atas dalam jadual, oh, kita mempunyai arahan ini; 501 00:41:03,180 --> 00:41:06,290 yang sepadan dengan 01110 binari. 502 00:41:10,200 --> 00:41:15,230 Dan sebagainya fail yang umumnya memasang output fail o. 503 00:41:15,230 --> 00:41:19,020 Dan o fail adalah apa yang kita telah berkata sebelum, 504 00:41:19,020 --> 00:41:21,570 bagaimana fail tidak perlu untuk mempunyai fungsi utama. 505 00:41:21,570 --> 00:41:27,640 Sebarang fail boleh disusun ke fail o selagi ia fail C yang sah. 506 00:41:27,640 --> 00:41:30,300 Ia boleh disusun ke o. 507 00:41:30,300 --> 00:41:43,030 Sekarang, menghubungkan apa yang sebenarnya membawa sekumpulan o fail dan membawa mereka untuk laksana. 508 00:41:43,030 --> 00:41:51,110 Dan sebagainya apa yang menghubungkan tidak boleh anda fikirkan perpustakaan CS50 sebagai fail o. 509 00:41:51,110 --> 00:41:56,980 Ia adalah fail binari yang sudah disusun. 510 00:41:56,980 --> 00:42:03,530 Dan sebagainya apabila anda menyusun fail anda, hello.c anda, yang menyeru GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c mendapat disusun turun ke hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o kini dalam perduaan. 513 00:42:08,910 --> 00:42:12,830 Ia menggunakan GetString, jadi ia perlu untuk pergi ke cs50.o, 514 00:42:12,830 --> 00:42:16,390 dan pemaut smooshes mereka bersama-sama dan menyalinnya GetString ke fail ini 515 00:42:16,390 --> 00:42:20,640 dan keluar dengan laku yang mempunyai semua fungsi yang diperlukan. 516 00:42:20,640 --> 00:42:32,620 Jadi cs50.o tidak sebenarnya fail O, tetapi ia cukup dekat bahawa tidak ada perbezaan asas. 517 00:42:32,620 --> 00:42:36,880 Jadi menghubungkan hanya membawa sekumpulan fail bersama-sama 518 00:42:36,880 --> 00:42:41,390 yang berasingan mengandungi semua fungsi saya perlu menggunakan 519 00:42:41,390 --> 00:42:46,120 dan mencipta executable yang sebenarnya akan berjalan. 520 00:42:48,420 --> 00:42:50,780 >> Dan supaya juga apa yang kita telah berkata sebelum 521 00:42:50,780 --> 00:42:55,970 mana anda boleh mempunyai 1000. fail c, anda menyusun mereka semua. fail o, 522 00:42:55,970 --> 00:43:00,040 yang mungkin akan mengambil sedikit masa, maka anda menukar 1. fail c. 523 00:43:00,040 --> 00:43:05,480 Anda hanya perlu susun semula bahawa 1 c fail dan kemudian segala-galanya relink lain, 524 00:43:05,480 --> 00:43:07,690 mengaitkan segala-galanya kembali bersama-sama. 525 00:43:09,580 --> 00:43:11,430 [Pelajar] Apabila kita menghubungkan kita menulis lcs50? 526 00:43:11,430 --> 00:43:20,510 Ya, jadi-lcs50. Itu bendera isyarat untuk pemaut yang anda perlu menghubungkan di perpustakaan itu. 527 00:43:26,680 --> 00:43:28,910 Soalan? 528 00:43:41,310 --> 00:43:46,860 Pernahkah kita pergi lebih binari selain bahawa 5 saat dalam syarahan pertama? 529 00:43:50,130 --> 00:43:53,010 Saya tidak fikir begitu. 530 00:43:55,530 --> 00:43:58,820 Anda perlu tahu semua Os besar bahawa kita telah pergi, 531 00:43:58,820 --> 00:44:02,670 dan anda harus mampu, jika kita memberikan anda fungsi, 532 00:44:02,670 --> 00:44:09,410 anda perlu dapat mengatakan ia besar O, kira-kira. Atau baik, besar O adalah kasar. 533 00:44:09,410 --> 00:44:15,300 Jadi, jika anda lihat yang bersarang untuk gelung gelung selama beberapa perkara yang sama, 534 00:44:15,300 --> 00:44:22,260 seperti int i, i > [pelajar] n kuasa dua. >> Ia cenderung untuk menjadi n kuasa dua. 535 00:44:22,260 --> 00:44:25,280 Jika anda telah tiga bersarang, ia cenderung untuk menjadi n cubed. 536 00:44:25,280 --> 00:44:29,330 Jadi yang jenis perkara yang anda harus dapat menunjukkan dengan serta-merta. 537 00:44:29,330 --> 00:44:33,890 Anda perlu tahu apapun penyisipan dan isih gelembung dan bergabung apapun dan semua orang. 538 00:44:33,890 --> 00:44:41,420 Ia adalah mudah untuk memahami mengapa mereka adalah orang-orang n kuasa dua dan n log n dan semua itu 539 00:44:41,420 --> 00:44:47,810 kerana saya fikir ada kuiz satu tahun di mana kita pada asasnya memberikan anda 540 00:44:47,810 --> 00:44:55,050 pelaksanaan apapun gelembung dan berkata, "Apakah masa menjalankan fungsi ini?" 541 00:44:55,050 --> 00:45:01,020 Jadi, jika anda mengenali ia sebagai sejenis gelembung, maka anda segera boleh mengatakan n kuasa dua. 542 00:45:01,020 --> 00:45:05,470 Tetapi jika anda hanya melihat ia, anda tidak perlu untuk merealisasikan isih gelembung ia; 543 00:45:05,470 --> 00:45:08,990 anda hanya boleh mengatakan ini melakukan ini dan ini. Ini n persegi. 544 00:45:12,350 --> 00:45:14,710 [Pelajar] Adakah terdapat mana-mana contoh yang sukar anda boleh tampil dengan, 545 00:45:14,710 --> 00:45:20,370 seperti idea yang sama memikirkan? 546 00:45:20,370 --> 00:45:24,450 >> Saya tidak fikir kita akan memberikan anda sebarang contoh yang sukar. 547 00:45:24,450 --> 00:45:30,180 Perkara gelembung apapun adalah kira-kira sebagai sukar seperti yang kita akan pergi, 548 00:45:30,180 --> 00:45:36,280 dan juga bahawa, selagi anda memahami bahawa anda iterating lebih array 549 00:45:36,280 --> 00:45:41,670 bagi setiap elemen dalam array, yang akan menjadi sesuatu yang n kuasa dua. 550 00:45:45,370 --> 00:45:49,940 Terdapat soalan umum, seperti di sini kita - Oh. 551 00:45:55,290 --> 00:45:58,530 Hanya pada hari yang lain, Doug mendakwa, "Saya telah mencipta algoritma yang boleh menyusun array 552 00:45:58,530 --> 00:46:01,780 "Nombor n dalam O (log n) masa!" 553 00:46:01,780 --> 00:46:04,900 Jadi bagaimana kita tahu bahawa adalah mustahil? 554 00:46:04,900 --> 00:46:08,850 [Sambutan pelajar didengar] >> Yeah. 555 00:46:08,850 --> 00:46:13,710 Sekurang-kurangnya, anda perlu menyentuh setiap elemen dalam array, 556 00:46:13,710 --> 00:46:16,210 jadi ia adalah mustahil untuk menyelesaikan pelbagai - 557 00:46:16,210 --> 00:46:20,850 Jika segala-galanya adalah dalam perintah Unsorted, maka anda akan menyentuh segala-galanya dalam array, 558 00:46:20,850 --> 00:46:25,320 jadi ia adalah mustahil untuk melakukannya dalam masa kurang daripada O n. 559 00:46:27,430 --> 00:46:30,340 [Pelajar] Anda menunjukkan kepada kita bahawa contoh yang mampu untuk melakukannya di O n 560 00:46:30,340 --> 00:46:33,920 jika anda menggunakan banyak memori. >> Yeah. 561 00:46:33,920 --> 00:46:37,970 Dan that's - saya terlupa apa that's - Adakah ia mengira apapun? 562 00:46:47,360 --> 00:46:51,330 Hmm. Itu adalah satu algoritma isihan integer. 563 00:46:59,850 --> 00:47:05,100 Saya sedang mencari nama khas untuk ini bahawa saya tidak dapat ingat minggu lepas. 564 00:47:05,100 --> 00:47:13,000 Yeah. Ini adalah jenis jenis yang boleh mencapai perkara-perkara yang di besar O n. 565 00:47:13,000 --> 00:47:18,430 Tetapi terdapat batasan, seperti anda hanya boleh menggunakan integer sehingga bilangan tertentu. 566 00:47:20,870 --> 00:47:24,560 Plus jika anda cuba untuk menyelesaikan sesuatu that's - 567 00:47:24,560 --> 00:47:30,750 Jika pelbagai anda adalah 012, -12, 151, 4 juta, 568 00:47:30,750 --> 00:47:35,120 maka bahawa elemen tunggal akan benar-benar merosakkan sorting keseluruhan. 569 00:47:42,060 --> 00:47:44,030 >> Soalan? 570 00:47:49,480 --> 00:47:58,870 [Pelajar] Jika anda mempunyai fungsi rekursi dan ia hanya membuat panggilan rekursi 571 00:47:58,870 --> 00:48:02,230 dalam penyata pulangan, yang ekor rekursi, 572 00:48:02,230 --> 00:48:07,360 dan sebagainya akan yang tidak menggunakan memori yang lebih semasa runtime 573 00:48:07,360 --> 00:48:12,550 atau sekurang-kurangnya akan menggunakan memori setanding sebagai lelaran penyelesaian? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Ya. 575 00:48:14,530 --> 00:48:19,840 Ia mungkin akan menjadi agak perlahan, tetapi tidak benar-benar. 576 00:48:19,840 --> 00:48:23,290 Tail rekursi agak baik. 577 00:48:23,290 --> 00:48:32,640 Melihat sekali lagi pada bingkai tindanan, mari kita mengatakan bahawa kita mempunyai utama 578 00:48:32,640 --> 00:48:42,920 dan kita mempunyai bar int (int x) atau sesuatu. 579 00:48:42,920 --> 00:48:52,310 Ini bukan fungsi rekursi yang sempurna, tetapi pulangan bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Jadi jelas, ini adalah cacat. Anda perlu kes asas dan barangan. 581 00:48:57,620 --> 00:49:00,360 Tetapi idea di sini adalah bahawa ini adalah ekor rekursi, 582 00:49:00,360 --> 00:49:06,020 yang bermakna apabila bar panggilan utama ia akan mendapatkan bingkai tindanan. 583 00:49:09,550 --> 00:49:12,440 Dalam bingkai tindanan ini terdapat akan menjadi blok memori yang sedikit 584 00:49:12,440 --> 00:49:17,490 yang sepadan ke x hujah. 585 00:49:17,490 --> 00:49:25,840 Dan sebagainya katakan utama berlaku untuk memanggil bar (100); 586 00:49:25,840 --> 00:49:30,050 Jadi x akan bermula sebagai 100. 587 00:49:30,050 --> 00:49:35,660 Jika pengkompil mengiktiraf bahawa ini adalah satu fungsi rekursi ekor, 588 00:49:35,660 --> 00:49:38,540 kemudian apabila bar membuat panggilan rekursi untuk bar, 589 00:49:38,540 --> 00:49:45,490 bukannya membuat bingkai tindanan yang baru, yang mana timbunan mula berkembang sebahagian besarnya, 590 00:49:45,490 --> 00:49:48,220 akhirnya ia akan berjalan ke dalam timbunan itu dan kemudian anda mendapat segfaults 591 00:49:48,220 --> 00:49:51,590 kerana memori bermula berlanggar. 592 00:49:51,590 --> 00:49:54,830 >> Jadi bukannya membuat bingkai tindanan sendiri, ia boleh menyedari, 593 00:49:54,830 --> 00:49:59,080 hey, saya tidak pernah benar-benar perlu untuk kembali kepada bingkai tindanan ini, 594 00:49:59,080 --> 00:50:08,040 jadi sebaliknya saya hanya akan menggantikan hujah ini dengan 99 dan kemudian mula bar seluruh. 595 00:50:08,040 --> 00:50:11,810 Dan kemudian ia akan melakukannya lagi dan ia akan mencapai pulangan bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 dan bukannya membuat bingkai tindanan baru, ia hanya akan menggantikan hujah semasa dengan 98 597 00:50:17,320 --> 00:50:20,740 dan kemudian melompat kembali ke permulaan sangat bar. 598 00:50:23,860 --> 00:50:30,430 Mereka operasi, menggantikan bahawa nilai 1 pada timbunan dan melompat kembali ke permulaan, 599 00:50:30,430 --> 00:50:32,430 cukup berkesan. 600 00:50:32,430 --> 00:50:41,500 Jadi, bukan sahaja ini penggunaan memori yang sama seperti fungsi yang berasingan yang lelaran 601 00:50:41,500 --> 00:50:45,390 kerana anda hanya menggunakan 1 bingkai tindanan, tetapi anda tidak menderita kelemahan 602 00:50:45,390 --> 00:50:47,240 perlu untuk memanggil fungsi. 603 00:50:47,240 --> 00:50:50,240 Memanggil fungsi boleh menjadi agak mahal kerana ia mempunyai kaitan semua persediaan ini 604 00:50:50,240 --> 00:50:52,470 dan teardown dan semua barangan ini. 605 00:50:52,470 --> 00:50:58,160 Jadi ini rekursi ekor adalah baik. 606 00:50:58,160 --> 00:51:01,170 [Pelajar] Mengapa ia tidak mewujudkan langkah-langkah baru? 607 00:51:01,170 --> 00:51:02,980 Kerana ia menyedari ia tidak perlu. 608 00:51:02,980 --> 00:51:07,800 Panggilan ke bar hanya kembali panggilan rekursi. 609 00:51:07,800 --> 00:51:12,220 Jadi ia tidak perlu berbuat apa-apa dengan nilai pulangan. 610 00:51:12,220 --> 00:51:15,120 Ia hanya akan dengan serta-merta mengembalikan. 611 00:51:15,120 --> 00:51:20,530 Jadi ia hanya akan menggantikan hujah sendiri dan mula semula. 612 00:51:20,530 --> 00:51:25,780 Dan juga, jika anda tidak mempunyai versi rekursi ekor, 613 00:51:25,780 --> 00:51:31,460 maka anda mendapat semua ini bar di mana apabila bar ini kembali 614 00:51:31,460 --> 00:51:36,010 ia mempunyai untuk kembali nilainya kepada satu ini, maka bahawa bar segera kembali 615 00:51:36,010 --> 00:51:39,620 dan ia kembali nilainya kepada satu ini, maka ia hanya akan dengan serta-merta mengembalikan 616 00:51:39,620 --> 00:51:41,350 dan kembali nilainya untuk yang satu ini. 617 00:51:41,350 --> 00:51:45,350 Jadi anda menyimpan ini muncul semua perkara-perkara yang jauh daripada timbunan 618 00:51:45,350 --> 00:51:48,730 sejak nilai pulangan hanya akan lulus sepanjang jalan kembali anyway. 619 00:51:48,730 --> 00:51:55,400 Jadi mengapa tidak hanya menggantikan hujah kita dengan hujah yang dikemaskini dan mula semula? 620 00:51:57,460 --> 00:52:01,150 Jika fungsi tidak rekursi ekor, jika anda melakukan sesuatu seperti - 621 00:52:01,150 --> 00:52:07,530 [Pelajar] jika bar (x + 1). >> Yeah. 622 00:52:07,530 --> 00:52:11,770 >> Jadi, jika anda meletakkan ia dalam keadaan, maka anda melakukan sesuatu dengan nilai pulangan. 623 00:52:11,770 --> 00:52:16,260 Atau walaupun anda hanya melakukan pulangan 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Jadi sekarang bar (x - 1) perlu kembali dalam usaha untuk ia mengira 2 kali bahawa nilai, 625 00:52:23,560 --> 00:52:26,140 jadi sekarang ia tidak memerlukan bingkai tindanan sendiri yang berasingan, 626 00:52:26,140 --> 00:52:31,180 dan kini, tidak kira berapa keras anda cuba, anda akan perlu - 627 00:52:31,180 --> 00:52:34,410 Ini bukan ekor rekursi. 628 00:52:34,410 --> 00:52:37,590 [Pelajar] saya cuba untuk membawa rekursi bertujuan untuk rekursi ekor - 629 00:52:37,590 --> 00:52:41,450 [Bowden] Dalam dunia yang ideal, tetapi dalam CS50 anda tidak perlu. 630 00:52:43,780 --> 00:52:49,280 Dalam usaha untuk mendapatkan rekursi ekor, secara amnya, anda menubuhkan hujah tambahan 631 00:52:49,280 --> 00:52:53,550 mana bar akan mengambil int x ke y 632 00:52:53,550 --> 00:52:56,990 dan y sepadan dengan perkara utama yang anda mahu untuk kembali. 633 00:52:56,990 --> 00:53:03,650 Jadi maka ini anda akan kembali bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Jadi itulah hanya peringkat tinggi bagaimana anda mengubah perkara yang menjadi ekor rekursi. 635 00:53:09,810 --> 00:53:13,790 Tetapi hujah tambahan - 636 00:53:13,790 --> 00:53:17,410 Dan kemudian di akhir apabila anda mencapai kes asas anda, anda hanya kembali y 637 00:53:17,410 --> 00:53:22,740 kerana anda telah mengumpul masa keseluruhan nilai pulangan yang anda mahu. 638 00:53:22,740 --> 00:53:27,280 Anda jenis telah melakukannya iterative tetapi menggunakan panggilan rekursi. 639 00:53:32,510 --> 00:53:34,900 Soalan? 640 00:53:34,900 --> 00:53:39,890 [Pelajar] Mungkin tentang aritmetik penunjuk, seperti apabila menggunakan tali. >> Pasti. 641 00:53:39,890 --> 00:53:43,610 Aritmetik pointer. 642 00:53:43,610 --> 00:53:48,440 Apabila menggunakan tali ia mudah kerana rentetan bintang char, 643 00:53:48,440 --> 00:53:51,860 aksara adalah selama-lamanya dan sentiasa bait tunggal, 644 00:53:51,860 --> 00:53:57,540 dan jadi aritmetik penunjuk adalah bersamaan dengan aritmetik tetap apabila anda berurusan dengan rentetan. 645 00:53:57,540 --> 00:54:08,790 Mari kita hanya mengatakan char * s = "hello". 646 00:54:08,790 --> 00:54:11,430 Jadi kita mempunyai blok dalam ingatan. 647 00:54:19,490 --> 00:54:22,380 Ia memerlukan 6 bait kerana anda sentiasa perlu null. 648 00:54:22,380 --> 00:54:28,620 Dan char * s akan ke titik permulaan array ini. 649 00:54:28,620 --> 00:54:32,830 Jadi s mata di sana. 650 00:54:32,830 --> 00:54:36,710 Sekarang, ini adalah pada dasarnya bagaimana pelbagai apa-apa kerja, 651 00:54:36,710 --> 00:54:40,780 tanpa mengira sama ada ia adalah pulangan oleh malloc atau sama ada ia adalah pada timbunan. 652 00:54:40,780 --> 00:54:47,110 Pelbagai Mana-mana asasnya penunjuk permulaan array, 653 00:54:47,110 --> 00:54:53,640 dan kemudian mana-mana operasi array, pengindeksan mana-mana, hanya pergi ke pelbagai yang tertentu mengimbangi. 654 00:54:53,640 --> 00:55:05,360 >> Jadi, apabila saya mengatakan sesuatu seperti [3]; ini akan s dan mengira 3 aksara. 655 00:55:05,360 --> 00:55:12,490 Jadi s [3], kita mempunyai 0, 1, 2, 3, jadi s [3] akan merujuk kepada l ini. 656 00:55:12,490 --> 00:55:20,460 [Pelajar] Dan kita boleh mencapai nilai yang sama dengan melakukan s + 3 dan kemudian bintang kurungan? 657 00:55:20,460 --> 00:55:22,570 Ya. 658 00:55:22,570 --> 00:55:26,010 Ini adalah bersamaan dengan * (+ 3); 659 00:55:26,010 --> 00:55:31,240 dan itu adalah selama-lamanya dan sentiasa bersamaan tidak kira apa yang kamu lakukan. 660 00:55:31,240 --> 00:55:34,070 Anda tidak perlu untuk menggunakan sintaks kurungan. 661 00:55:34,070 --> 00:55:37,770 Anda sentiasa boleh menggunakan * sintaks (s + 3). 662 00:55:37,770 --> 00:55:40,180 Orang cenderung untuk suka sintaks kurungan, walaupun. 663 00:55:40,180 --> 00:55:43,860 [Pelajar] Jadi semua array sebenarnya hanya petunjuk. 664 00:55:43,860 --> 00:55:53,630 Ada perbezaan sedikit apabila saya mengatakan int x [4]; >> [pelajar] Adakah yang mencipta memori? 665 00:55:53,630 --> 00:56:03,320 [Bowden] Itu akan mewujudkan 4 ints pada timbunan, jadi keseluruhan 16 bait. 666 00:56:03,320 --> 00:56:05,700 Ia akan mewujudkan 16 bait pada timbunan. 667 00:56:05,700 --> 00:56:09,190 x tidak disimpan di mana-mana. 668 00:56:09,190 --> 00:56:13,420 Ia adalah hanya simbol merujuk kepada permulaan perkara itu. 669 00:56:13,420 --> 00:56:17,680 Kerana anda mengisytiharkan array di dalam fungsi ini, 670 00:56:17,680 --> 00:56:22,340 apa pengkompil akan lakukan hanya menggantikan semua kejadian x ubah 671 00:56:22,340 --> 00:56:26,400 dengan mana ia berlaku untuk memilih untuk meletakkan 16 bait. 672 00:56:26,400 --> 00:56:30,040 Ia tidak boleh berbuat demikian dengan char * s kerana s merupakan penunjuk sebenar. 673 00:56:30,040 --> 00:56:32,380 Ia adalah percuma untuk kemudian menunjukkan kepada perkara-perkara lain. 674 00:56:32,380 --> 00:56:36,140 x ialah pemalar. Anda tidak boleh mempunyai ia satu titik untuk pelbagai berbeza. >> [Pelajar] Okay. 675 00:56:36,140 --> 00:56:43,420 Tetapi idea ini, pengindeksan ini, adalah sama tanpa mengira sama ada ia adalah pelbagai tradisional 676 00:56:43,420 --> 00:56:48,230 atau jika ia adalah penunjuk kepada sesuatu atau jika ia penunjuk kepada pelbagai malloced. 677 00:56:48,230 --> 00:56:59,770 Dan pada hakikatnya, ia begitu bersamaan bahawa itu adalah juga perkara yang sama. 678 00:56:59,770 --> 00:57:05,440 Ia sebenarnya hanya diterjemahkan apa yang di dalam kurungan dan apa yang ditinggalkan kurungan, 679 00:57:05,440 --> 00:57:07,970 menambah mereka bersama-sama, dan dereferences. 680 00:57:07,970 --> 00:57:14,710 Jadi ini adalah hanya sebagai sah sebagai * (s + 3) atau s [3]. 681 00:57:16,210 --> 00:57:22,090 [Pelajar] Bolehkah anda mempunyai petunjuk menunjuk kepada barisan 2-dimensi? 682 00:57:22,090 --> 00:57:27,380 >> Ia lebih sukar. Secara tradisinya, tidak. 683 00:57:27,380 --> 00:57:34,720 Satu pelbagai 2-dimensi adalah hanya pelbagai 1-dimensi dengan sintaks beberapa mudah 684 00:57:34,720 --> 00:57:54,110 kerana apabila saya mengatakan int x [3] [3], ini adalah benar-benar hanya 1 tatasusunan dengan 9 nilai. 685 00:57:55,500 --> 00:58:03,000 Dan sebagainya apabila saya indeks, pengkompil tahu apa yang saya maksudkan. 686 00:58:03,000 --> 00:58:13,090 Jika saya katakan x [1] [2], ia tahu saya mahu pergi ke barisan kedua, jadi ia akan melangkau 3 pertama, 687 00:58:13,090 --> 00:58:17,460 dan kemudian ia mahu perkara kedua dalam itu, jadi ia akan mendapatkan satu ini. 688 00:58:17,460 --> 00:58:20,480 Tetapi ia masih hanya pelbagai dimensi tunggal. 689 00:58:20,480 --> 00:58:23,660 Dan jadi jika saya mahu memberi penunjuk kepada pelbagai itu, 690 00:58:23,660 --> 00:58:29,770 Saya akan mengatakan int * p = x; 691 00:58:29,770 --> 00:58:33,220 Jenis x hanya - 692 00:58:33,220 --> 00:58:38,280 Ia adalah jenis kasar mengatakan x kerana ia adalah hanya simbol dan ia bukan satu pembolehubah yang sebenar, 693 00:58:38,280 --> 00:58:40,140 tetapi ia hanya * int. 694 00:58:40,140 --> 00:58:44,840 x hanya penunjuk untuk permulaan ini. >> [Pelajar] Okay. 695 00:58:44,840 --> 00:58:52,560 Dan jadi saya tidak akan dapat untuk mengakses [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Saya fikir terdapat sintaks khas untuk mengisytiharkan penunjuk, 697 00:58:58,370 --> 00:59:12,480 sesuatu yang tidak masuk akal seperti int (* p [- sesuatu yang benar-benar tidak masuk akal, saya tidak tahu. 698 00:59:12,480 --> 00:59:17,090 Tetapi ada satu sintaks untuk mengisytiharkan petunjuk seperti dengan kurungan dan perkara-perkara. 699 00:59:17,090 --> 00:59:22,960 Ia mungkin tidak membolehkan anda berbuat demikian. 700 00:59:22,960 --> 00:59:26,640 Saya boleh melihat kembali pada sesuatu yang akan beritahu saya kebenaran. 701 00:59:26,640 --> 00:59:34,160 Saya akan mencari kemudian, jika terdapat sintaks untuk titik. Tetapi anda tidak akan melihat ia. 702 00:59:34,160 --> 00:59:39,670 Dan walaupun sintaks begitu kuno bahawa jika anda menggunakan ia, orang akan bingung. 703 00:59:39,670 --> 00:59:43,540 Tatasusunan multidimensi cukup jarang berlaku kerana ia adalah. 704 00:59:43,540 --> 00:59:44,630 Anda cukup banyak - 705 00:59:44,630 --> 00:59:48,490 Nah, jika anda melakukan perkara-perkara matriks ia tidak akan menjadi jarang, 706 00:59:48,490 --> 00:59:56,730 tetapi dalam C anda jarang akan menggunakan tatasusunan multidimensi. 707 00:59:57,630 --> 01:00:00,470 Yeah. >> [Pelajar] Katakan anda mempunyai pelbagai yang benar-benar panjang. 708 01:00:00,470 --> 01:00:03,900 >> Jadi dalam ingatan maya, ia akan muncul untuk menjadi semua berturut-turut, 709 01:00:03,900 --> 01:00:05,640 seperti elemen-elemen yang betul-betul bersebelahan antara satu sama lain, 710 01:00:05,640 --> 01:00:08,770 tetapi dalam memori fizikal, ia akan menjadi mustahil bagi yang akan berpecah? >> Ya. 711 01:00:08,770 --> 01:00:16,860 Bagaimana kerja-kerja maya memori ia hanya memisahkan - 712 01:00:19,220 --> 01:00:24,860 Unit peruntukan adalah halaman, yang cenderung untuk menjadi 4 kilobytes, 713 01:00:24,860 --> 01:00:29,680 dan sebagainya apabila proses berkata, hey, saya mahu untuk menggunakan memori ini, 714 01:00:29,680 --> 01:00:35,970 sistem operasi akan memperuntukkan 4 kilobytes untuk blok yang sedikit memori. 715 01:00:35,970 --> 01:00:39,100 Malah jika anda hanya menggunakan satu bait tunggal sedikit dalam blok keseluruhan ingatan, 716 01:00:39,100 --> 01:00:42,850 sistem operasi akan memberi ia penuh 4 kilobait. 717 01:00:42,850 --> 01:00:49,410 Jadi apakah ini bermakna saya boleh mempunyai - katakan ini adalah timbunan saya. 718 01:00:49,410 --> 01:00:53,180 Timbunan ini boleh dipisahkan. Timbunan saya boleh megabait dan megabait. 719 01:00:53,180 --> 01:00:55,020 Timbunan saya boleh menjadi besar. 720 01:00:55,020 --> 01:01:00,220 Tetapi timbunan itu sendiri akan berpecah ke dalam laman individu, 721 01:01:00,220 --> 01:01:09,010 yang jika kita melihat di sini mari kita mengatakan ini adalah RAM kita, 722 01:01:09,010 --> 01:01:16,600 jika saya mempunyai 2 Gigabyte RAM, ini ialah 0 alamat sebenar seperti bait 0 RAM saya, 723 01:01:16,600 --> 01:01:22,210 dan ini adalah 2 gigabait sepanjang jalan ke sini. 724 01:01:22,210 --> 01:01:27,230 Jadi halaman ini mungkin sesuai untuk blok ini di sini. 725 01:01:27,230 --> 01:01:29,400 Laman ini mungkin sesuai untuk blok ini di sini. 726 01:01:29,400 --> 01:01:31,560 Ini mungkin sesuai kepada yang satu ini di sini. 727 01:01:31,560 --> 01:01:35,540 Jadi sistem operasi adalah bebas untuk memberikan memori fizikal 728 01:01:35,540 --> 01:01:39,320 kepada mana-mana halaman individu secara sewenang-wenangnya. 729 01:01:39,320 --> 01:01:46,180 Dan itu bererti bahawa jika sempadan ini berlaku untuk bercelapak array, 730 01:01:46,180 --> 01:01:50,070 array berlaku untuk kiri dan kanan perintah ini halaman, 731 01:01:50,070 --> 01:01:54,460 maka pelbagai bahawa akan berpecah dalam memori fizikal. 732 01:01:54,460 --> 01:01:59,280 Dan kemudian apabila anda berhenti program ini, apabila proses itu berakhir, 733 01:01:59,280 --> 01:02:05,690 pemetaan ini mendapat terpadam dan kemudian ia adalah bebas untuk menggunakan blok-blok kecil untuk perkara-perkara lain. 734 01:02:14,730 --> 01:02:17,410 Lebih banyak soalan? 735 01:02:17,410 --> 01:02:19,960 [Pelajar] aritmetik penunjuk. >> Oh yeah. 736 01:02:19,960 --> 01:02:28,410 Strings adalah lebih mudah, tetapi melihat sesuatu seperti ints, 737 01:02:28,410 --> 01:02:35,000 kembali ke int x [4]; 738 01:02:35,000 --> 01:02:41,810 Sama ada ini adalah array atau sama ada ia adalah penunjuk kepada pelbagai malloced daripada 4 integer, 739 01:02:41,810 --> 01:02:47,060 ia akan dirawat dengan cara yang sama. 740 01:02:50,590 --> 01:02:53,340 [Pelajar] Jadi tatasusunan adalah pada timbunan? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Perlengkapan tidak pada timbunan. >> [Pelajar] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Ini jenis pelbagai cenderung untuk menjadi pada timbunan 743 01:03:08,320 --> 01:03:12,220 melainkan anda mengisytiharkan ia di - mengabaikan pembolehubah global. Jangan gunakan pembolehubah global. 744 01:03:12,220 --> 01:03:16,280 Dalam fungsi saya katakan int x [4]; 745 01:03:16,280 --> 01:03:22,520 Ia akan mewujudkan satu blok 4-integer pada timbunan untuk pelbagai ini. 746 01:03:22,520 --> 01:03:26,960 Tetapi ini malloc (4 * sizeof (int)); akan pergi pada timbunan. 747 01:03:26,960 --> 01:03:31,870 Tetapi selepas titik ini saya boleh menggunakan x dan p dalam cukup banyak cara yang sama, 748 01:03:31,870 --> 01:03:36,140 selain pengecualian yang saya katakan sebelum tentang anda boleh menyerahhakkan semula p. 749 01:03:36,140 --> 01:03:40,960 Teknikalnya, saiz mereka adalah agak berbeza, tetapi yang benar-benar tidak relevan. 750 01:03:40,960 --> 01:03:43,310 Anda sebenarnya tidak pernah menggunakan saiz mereka. 751 01:03:48,020 --> 01:03:56,810 P saya boleh katakan p [3] = 2; atau x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Anda boleh menggunakan mereka dalam cara yang tepat sama. 753 01:03:59,680 --> 01:04:01,570 Jadi aritmetik penunjuk sekarang - Ya. 754 01:04:01,570 --> 01:04:07,390 [Pelajar] Adakah anda tidak perlu melakukan p * jika anda mempunyai kurungan? 755 01:04:07,390 --> 01:04:11,720 Kurungan adalah dereference tersirat. >> Okay. 756 01:04:11,720 --> 01:04:20,200 Sebenarnya, juga apa yang anda katakan dengan anda boleh mendapatkan tatasusunan multidimensi 757 01:04:20,200 --> 01:05:02,650 dengan petunjuk, apa yang boleh anda lakukan adalah sesuatu seperti, katakan, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Saya hanya akan menulis semua keluar pertama. 759 01:05:37,880 --> 01:05:41,020 Saya tidak mahu bahawa satu. 760 01:05:41,020 --> 01:05:42,550 Okay. 761 01:05:42,550 --> 01:05:48,910 Apa yang saya lakukan di sini adalah - Itu harus pp [i]. 762 01:05:48,910 --> 01:05:53,680 Jadi pp adalah penunjuk kepada penunjuk. 763 01:05:53,680 --> 01:06:02,420 Anda sedang mallocing pp untuk menunjukkan pelbagai 5 bintang int. 764 01:06:02,420 --> 01:06:10,950 Jadi dalam ingatan anda mempunyai pada ms tindanan 765 01:06:10,950 --> 01:06:20,150 Ia akan menunjukkan pelbagai 5 blok yang semua sendiri petunjuk. 766 01:06:20,150 --> 01:06:28,210 Dan kemudian apabila saya malloc ke sini, saya malloc bahawa setiap mereka petunjuk individu 767 01:06:28,210 --> 01:06:32,080 harus menunjukkan blok berasingan daripada 4 bait pada timbunan. 768 01:06:32,080 --> 01:06:35,870 Jadi ini mata kepada 4 bait. 769 01:06:37,940 --> 01:06:40,660 Dan ini satu mata kepada 4 bait yang berbeza. 770 01:06:40,660 --> 01:06:43,200 >> Dan kesemua mereka menunjukkan mereka sendiri 4 bait. 771 01:06:43,200 --> 01:06:49,080 Ini memberikan saya satu cara untuk melakukan perkara-perkara yang multidimensi. 772 01:06:49,080 --> 01:06:58,030 Saya boleh mengatakan pp [3] [4], tetapi sekarang ini tidak adalah perkara yang sama sebagai tatasusunan multidimensi 773 01:06:58,030 --> 01:07:05,390 kerana tatasusunan multidimensi ia diterjemahkan [3] [4] ke dalam satu diimbangi ke dalam tatasusunan x. 774 01:07:05,390 --> 01:07:14,790 Ini p dereferences, mengakses indeks ketiga, maka dereferences yang 775 01:07:14,790 --> 01:07:20,790 dan mengakses - 4 akan menjadi sah - indeks kedua. 776 01:07:24,770 --> 01:07:31,430 Manakala apabila kita mempunyai int x [3] [4] sebelum sebagai pelbagai multidimensi 777 01:07:31,430 --> 01:07:35,740 dan apabila anda menggandakan kurungan ia adalah benar-benar hanya dereference tunggal, 778 01:07:35,740 --> 01:07:40,490 anda sedang mengikuti penunjuk tunggal dan kemudian satu ofset, 779 01:07:40,490 --> 01:07:42,850 ini adalah benar-benar rujukan 2D. 780 01:07:42,850 --> 01:07:45,840 Anda mengikuti 2 petunjuk yang berasingan. 781 01:07:45,840 --> 01:07:50,420 Jadi ini juga teknikal membolehkan anda untuk mempunyai tatasusunan multidimensi 782 01:07:50,420 --> 01:07:53,550 di mana setiap individu pelbagai saiz yang berbeza. 783 01:07:53,550 --> 01:07:58,000 Jadi saya fikir bergerigi tatasusunan multidimensi adalah apa ia dipanggil 784 01:07:58,000 --> 01:08:01,870 kerana benar-benar perkara pertama yang boleh menunjukkan kepada sesuatu yang mempunyai 10 unsur, 785 01:08:01,870 --> 01:08:05,540 Perkara kedua yang boleh menunjukkan kepada sesuatu yang mempunyai 100 unsur. 786 01:08:05,540 --> 01:08:10,790 [Pelajar] Adakah terdapat apa-apa had kepada bilangan penunjuk anda boleh mempunyai 787 01:08:10,790 --> 01:08:14,290 menunjuk kepada petunjuk lain? >> No. 788 01:08:14,290 --> 01:08:17,010 Anda boleh mempunyai int ***** p. 789 01:08:18,050 --> 01:08:23,760 Kembali kepada aritmetik penunjuk - >> [pelajar] Oh. >> Yeah. 790 01:08:23,760 --> 01:08:35,649 [Pelajar] Jika saya mempunyai int *** p dan kemudian saya melakukan dereferencing satu dan saya katakan p * adalah bersamaan dengan nilai ini, 791 01:08:35,649 --> 01:08:39,560 ia hanya akan untuk melakukan tahap 1 dereferencing? >> Ya. 792 01:08:39,560 --> 01:08:43,340 Jadi jika saya mahu mengakses perkara yang penunjuk terakhir menunjuk pada - 793 01:08:43,340 --> 01:08:46,210 Kemudian anda melakukan p ***. >> Okay. 794 01:08:46,210 --> 01:08:54,080 Jadi ini adalah mata p 1 blok, mata ke blok lain, mata ke blok lain. 795 01:08:54,080 --> 01:09:02,010 Kemudian jika anda lakukan * p = sesuatu yang lain, maka anda akan berubah ini 796 01:09:02,010 --> 01:09:13,640 kini menunjukkan ke blok berbeza. >> Okay. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] Dan jika ini telah malloced, maka anda kini telah bocor memori 798 01:09:17,649 --> 01:09:20,430 melainkan jika anda mempunyai rujukan yang berbeza ini 799 01:09:20,430 --> 01:09:25,270 kerana anda tidak boleh mendapatkan kembali kepada orang-orang yang bahawa anda hanya melemparkan. 800 01:09:25,270 --> 01:09:29,550 Aritmetik pointer. 801 01:09:29,550 --> 01:09:36,310 int x [4]; akan memperuntukkan pelbagai daripada 4 integer 802 01:09:36,310 --> 01:09:40,670 mana x akan ke titik permulaan array. 803 01:09:40,670 --> 01:09:50,420 Jadi, apabila saya berkata sesuatu seperti x [1]; saya mahu ia bermakna pergi ke integer kedua dalam array, 804 01:09:50,420 --> 01:09:53,319 yang akan menjadi salah satu ini. 805 01:09:53,319 --> 01:10:04,190 Tetapi benar-benar, itulah 4 bait ke dalam array sejak integer ini mengambil masa sehingga 4 bait. 806 01:10:04,190 --> 01:10:08,470 Jadi mengimbangi 1 benar-benar bermakna mengimbangi 1 807 01:10:08,470 --> 01:10:12,030 kali saiz apa jua jenis array. 808 01:10:12,030 --> 01:10:17,170 Ini adalah pelbagai integer, jadi ia tahu untuk berbuat 1 kali saiz int apabila ia mahu untuk mengimbangi. 809 01:10:17,170 --> 01:10:25,260 Sintaks lain. Ingatlah bahawa ini adalah bersamaan dengan * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Bila saya katakan penunjuk + 1, apa yang pulangan adalah alamat bahawa penunjuk menyimpan 811 01:10:35,250 --> 01:10:40,360 ditambah 1 kali saiz jenis penunjuk. 812 01:10:40,360 --> 01:10:59,510 Jadi, jika x = ox100, maka x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 Dan anda boleh menyalahgunakan ini dan mengatakan sesuatu seperti char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 dan kini c akan menjadi alamat yang sama seperti x. 815 01:11:23,050 --> 01:11:26,040 c akan menjadi sama dengan ox100, 816 01:11:26,040 --> 01:11:31,490 tetapi c + 1 akan menjadi sama dengan ox101 817 01:11:31,490 --> 01:11:38,030 sejak aritmetik penunjuk bergantung kepada jenis penunjuk bahawa anda menambah. 818 01:11:38,030 --> 01:11:45,390 Jadi c + 1, ia kelihatan di c, ia adalah penunjuk char, jadi ia akan untuk menambah 1 kali saiz char, 819 01:11:45,390 --> 01:11:48,110 yang sentiasa akan menjadi 1, jadi anda mendapat 101, 820 01:11:48,110 --> 01:11:54,890 sedangkan jika saya melakukan x, yang juga masih 100, x + 1 akan menjadi 104. 821 01:11:56,660 --> 01:12:06,340 [Pelajar] Bolehkah anda menggunakan c + + dalam usaha untuk memajukan pointer anda dengan 1? 822 01:12:06,340 --> 01:12:09,810 Ya, anda boleh. 823 01:12:09,810 --> 01:12:16,180 Anda tidak boleh berbuat demikian dengan x kerana x adalah hanya simbol, ia adalah pemalar; anda tidak boleh menukar x. 824 01:12:16,180 --> 01:12:22,610 >> Tetapi c berlaku hanya menjadi penunjuk, jadi c + + adalah sah dan ia akan kenaikan sebanyak 1. 825 01:12:22,610 --> 01:12:32,440 Jika c hanya * int, maka c + + akan 104. 826 01:12:32,440 --> 01:12:41,250 + + Tidak penunjuk aritmetik seperti c + 1 akan mempunyai dilakukan penunjuk aritmetik. 827 01:12:43,000 --> 01:12:48,870 Ini sebenarnya adalah bagaimana banyak perkara seperti apapun merge - 828 01:12:49,670 --> 01:12:55,710 Sebaliknya mewujudkan salinan perkara, sebaliknya anda boleh lulus - 829 01:12:55,710 --> 01:13:02,400 Seperti jika saya mahu lulus separuh array - biarkan yang memadam beberapa ini. 830 01:13:04,770 --> 01:13:10,520 Katakan saya mahu lulus sampingan ini array ke dalam fungsi. 831 01:13:10,520 --> 01:13:12,700 Apa yang saya akan lulus dengan fungsi itu? 832 01:13:12,700 --> 01:13:17,050 Jika saya lulus x, saya lulus alamat ini. 833 01:13:17,050 --> 01:13:23,780 Tetapi saya mahu lulus alamat tertentu. Jadi apa yang saya perlu lulus? 834 01:13:23,780 --> 01:13:26,590 [Pelajar] pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Jadi x + 2. Ya. 836 01:13:29,350 --> 01:13:31,620 Itu akan menjadi alamat ini. 837 01:13:31,620 --> 01:13:42,810 Anda akan juga sangat kerap melihat ia sebagai x [2] dan kemudian alamat itu. 838 01:13:42,810 --> 01:13:47,850 Jadi, anda perlu mengambil alamat kerana kurungan adalah dereference tersirat. 839 01:13:47,850 --> 01:13:53,250 x [2] merujuk kepada nilai yang berada dalam kotak ini, dan kemudian anda mahu alamat kotak yang, 840 01:13:53,250 --> 01:13:56,850 jadi anda mengatakan & x [2]. 841 01:13:56,850 --> 01:14:02,880 Jadi itulah bagaimana sesuatu apapun merge di mana anda mahu untuk lulus setengah senarai kepada sesuatu 842 01:14:02,880 --> 01:14:08,790 anda benar-benar hanya lulus & x [2], dan kini sejauh panggilan rekursi berkenaan, 843 01:14:08,790 --> 01:14:12,510 pelbagai baru saya bermula di sana. 844 01:14:12,510 --> 01:14:15,130 Soalan minit terakhir. 845 01:14:15,130 --> 01:14:20,050 [Pelajar] Jika kita tidak meletakkan #: glib satu atau - apa yang dipanggil? >> Bintang? 846 01:14:20,050 --> 01:14:23,200 [Pelajar] Bintang. Teknikalnya >>, dereference pengendali, tetapi - >> [pelajar] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Jika kita tidak meletakkan bintang atau #: glib, apa yang berlaku jika saya hanya mengatakan y = x dan x adalah penunjuk? 848 01:14:29,310 --> 01:14:34,620 Apakah jenis y? >> [Pelajar] saya hanya akan mengatakan penunjuk ia 2. 849 01:14:34,620 --> 01:14:38,270 Jadi jika anda hanya mengatakan y = x, sekarang x dan y titik kepada perkara yang sama. >> [Pelajar] Point kepada perkara yang sama. 850 01:14:38,270 --> 01:14:45,180 Dan jika x ialah penunjuk int? >> Ia akan mengadu kerana anda tidak boleh menyerahhakkan petunjuk. 851 01:14:45,180 --> 01:14:46,540 [Pelajar] Okay. 852 01:14:46,540 --> 01:14:51,860 Ingatlah bahawa petunjuk, walaupun kita menarik mereka sebagai anak panah, 853 01:14:51,860 --> 01:15:02,010 benar-benar semua kedai mereka - int * x - benar-benar semua x menyimpan sesuatu seperti ox100, 854 01:15:02,010 --> 01:15:06,490 mana kita berlaku untuk mewakili sebagai menunjuk ke blok disimpan di 100. 855 01:15:06,490 --> 01:15:19,660 Jadi, apabila saya mengatakan int * y = x; saya hanya menyalin ox100 ke y, 856 01:15:19,660 --> 01:15:24,630 yang kita hanya akan untuk mewakili sebagai y, juga menunjuk ke ox100. 857 01:15:24,630 --> 01:15:39,810 Dan jika saya katakan int i = (int) x; maka i akan menyimpan apa jua nilai ox100 858 01:15:39,810 --> 01:15:45,100 di dalamnya, tetapi kini ia akan ditafsirkan sebagai integer bukan penunjuk. 859 01:15:45,100 --> 01:15:49,310 Tetapi anda perlu dibuang atau jika tidak, ia akan mengadu. 860 01:15:49,310 --> 01:15:53,300 [Pelajar] Jadi adakah anda bermakna untuk membuang - 861 01:15:53,300 --> 01:16:00,290 Adakah ia akan pemutus int x atau pemutus int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Apa? 863 01:16:03,700 --> 01:16:07,690 [Pelajar] Okay. Selepas kurungan ini ada akan menjadi x atau ay sana? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Sama ada. x dan y adalah sama. >> [Pelajar] Okay. 865 01:16:11,500 --> 01:16:14,390 Kerana mereka berdua petunjuk. >> Yeah. 866 01:16:14,390 --> 01:16:21,050 [Pelajar] Maka ia akan menyimpan 100 perenambelasan dalam bentuk integer? >> [Bowden] Yeah. 867 01:16:21,050 --> 01:16:23,620 Tetapi tidak nilai apa sahaja yang ia menunjuk ke. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Yeah. >> [Pelajar] Jadi hanya alamat dalam bentuk integer. Okay. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Jika anda mahu untuk sebab-sebab tertentu yang pelik, 870 01:16:34,720 --> 01:16:38,900 anda boleh berurusan eksklusif dengan petunjuk dan tidak pernah berurusan dengan integer 871 01:16:38,900 --> 01:16:49,240 dan hanya menjadi seperti int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Kemudian anda akan mendapat benar-benar keliru apabila aritmetik penunjuk bermula berlaku. 873 01:16:53,000 --> 01:16:56,570 Jadi nombor yang mereka menyimpan adalah sia-sia. 874 01:16:56,570 --> 01:16:58,940 Ia hanya bagaimana anda akhirnya mentafsirkan mereka. 875 01:16:58,940 --> 01:17:02,920 Jadi saya bebas untuk menyalin ox100 dari * int int an, 876 01:17:02,920 --> 01:17:07,790 dan saya bebas untuk menetapkan - you're mungkin akan mendapatkan menjerit kerana tidak pemutus - 877 01:17:07,790 --> 01:17:18,160 Saya bebas untuk memberikan sesuatu seperti (int *) ox1234 ke * int ini sewenang-wenangnya. 878 01:17:18,160 --> 01:17:25,480 Jadi ox123 adalah hanya sebagai sah alamat memori & y. 879 01:17:25,480 --> 01:17:32,060 & Y berlaku untuk mengembalikan sesuatu yang cukup banyak ox123. 880 01:17:32,060 --> 01:17:35,430 [Pelajar] yang Adakah cara yang benar-benar sejuk untuk pergi dari perenambelasan kepada bentuk perpuluhan, 881 01:17:35,430 --> 01:17:39,230 suka jika anda mempunyai penunjuk dan anda membuang ia sebagai int an? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Anda benar-benar hanya boleh mencetak menggunakan seperti printf. 883 01:17:44,860 --> 01:17:50,300 Katakan saya mempunyai int y = 100. 884 01:17:50,300 --> 01:18:02,700 Jadi printf (% d \ n - kerana anda sudah perlu tahu - mencetak bahawa sebagai integer% x,. 885 01:18:02,700 --> 01:18:05,190 Kami hanya akan mencetak ia sebagai perenambelasan. 886 01:18:05,190 --> 01:18:10,760 Jadi penunjuk tidak disimpan sebagai perenambelasan, 887 01:18:10,760 --> 01:18:12,960 dan integer tidak disimpan sebagai perpuluhan. 888 01:18:12,960 --> 01:18:14,700 Semuanya disimpan sebagai binari. 889 01:18:14,700 --> 01:18:17,950 Ia hanya bahawa kita cenderung untuk menunjukkan penunjuk sebagai perenambelasan 890 01:18:17,950 --> 01:18:23,260 kerana kita berfikir tentang perkara-perkara dalam blok-blok 4-bait, 891 01:18:23,260 --> 01:18:25,390 dan alamat memori cenderung untuk menjadi biasa. 892 01:18:25,390 --> 01:18:28,890 Kami seperti, jika ia bermula dengan bf, maka ia berlaku pada timbunan. 893 01:18:28,890 --> 01:18:35,560 Jadi ia hanya tafsiran kita petunjuk sebagai perenambelasan. 894 01:18:35,560 --> 01:18:39,200 Okay. Sebarang soalan terakhir? 895 01:18:39,200 --> 01:18:41,700 >> Saya akan berada di sini untuk sedikit selepas jika anda mempunyai apa-apa lagi. 896 01:18:41,700 --> 01:18:46,070 Dan itulah akhir itu. 897 01:18:46,070 --> 01:18:48,360 >> [Pelajar] Yay! [Tepukan] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]