1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Oddiel 4 - Viac Komfortné] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Harvard University] 3 00:00:04,850 --> 00:00:07,370 [To je CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Máme kvíz zajtra, v prípade, že vy nevedel, že. 5 00:00:14,810 --> 00:00:20,970 Je to v podstate na všetko, čo ste mohli vidieť v triede alebo mali vidieť v triede. 6 00:00:20,970 --> 00:00:26,360 To zahŕňa ukazovatele, aj keď sú veľmi nedávnej tému. 7 00:00:26,360 --> 00:00:29,860 Tie sa aspoň pochopiť vysokej úrovne z nich. 8 00:00:29,860 --> 00:00:34,760 Čokoľvek, čo bol preč cez v triede, mali by ste pochopiť, pre kvíz. 9 00:00:34,760 --> 00:00:37,320 Takže ak máte nejaké otázky na nich, môžete požiadať je teraz. 10 00:00:37,320 --> 00:00:43,280 Ale to bude veľmi študent-viedol zasadnutie, kde ste klásť otázky, 11 00:00:43,280 --> 00:00:45,060 takže dúfajme, že ľudia majú otázky. 12 00:00:45,060 --> 00:00:48,020 Má niekto nejaké otázky? 13 00:00:49,770 --> 00:00:52,090 Áno. >> [Študent] Môžeš ísť cez ukazovateľov znova? 14 00:00:52,090 --> 00:00:54,350 Pôjdem cez ukazovateľov. 15 00:00:54,350 --> 00:00:59,180 Všetky vaše premenných nutne žiť v pamäti, 16 00:00:59,180 --> 00:01:04,450 ale zvyčajne nemusíte báť, že a stačí povedať x + 2 a y + 3 17 00:01:04,450 --> 00:01:07,080 a kompilátor bude zistiť, kde veci sú živé na vás. 18 00:01:07,080 --> 00:01:12,990 Akonáhle máte čo do činenia s ukazovateľmi, teraz si explicitne pomocou týchto adresy pamäte. 19 00:01:12,990 --> 00:01:19,800 Takže jediné premenné iba niekedy žiť v jednom adresu v danom okamihu. 20 00:01:19,800 --> 00:01:24,040 Ak chceme deklarovať ukazovateľ, čo sa typu bude vyzerať? 21 00:01:24,040 --> 00:01:26,210 >> Chcem vyhlásiť ukazovateľ p Čo typu vyzerať? 22 00:01:26,210 --> 00:01:33,530 [Študent] int * p Jo >>. Takže int * p 23 00:01:33,530 --> 00:01:38,030 A ako mám urobiť to poukázať na x? >> [Študent] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Tak ampersand je doslova nazýva adresa prevádzkovateľa. 25 00:01:45,300 --> 00:01:50,460 Takže keď hovorím, a x je to stále na pamäti adresu premennej x. 26 00:01:50,460 --> 00:01:56,790 Takže teraz mám ukazovateľ p, a kdekoľvek v mojom kóde môžem použiť * p 27 00:01:56,790 --> 00:02:02,960 alebo by som mohol použiť x a bude to presne to isté. 28 00:02:02,960 --> 00:02:09,520 (* P). Čo je to robíš? Čo, že hviezda znamená? 29 00:02:09,520 --> 00:02:13,120 [Študent] To znamená, že hodnota v tomto bode. Jo >>. 30 00:02:13,120 --> 00:02:17,590 Takže keď sa pozrieme na to, môže to byť veľmi užitočné upozorniť na diagramy 31 00:02:17,590 --> 00:02:22,230 ak je to krabička pamäte pre x, ktoré sa stane, že na hodnotu 4, 32 00:02:22,230 --> 00:02:25,980 potom máme malú krabičku pamäte pre p, 33 00:02:25,980 --> 00:02:31,590 a tak p ukazuje na x, takže sme nakresliť šípku z bodu P do x. 34 00:02:31,590 --> 00:02:40,270 Takže keď hovoríme, * p hovoríme ísť do poľa, ktoré je p 35 00:02:40,270 --> 00:02:46,480 Hviezda je sledovať šípku a potom robiť, čo chcete s týmto box tu. 36 00:02:46,480 --> 00:03:01,090 Takže môžem povedať, * p = 7, a že pôjde na pole, ktoré je x, a zmeny, ktoré sa 7. 37 00:03:01,090 --> 00:03:13,540 Alebo by som mohol povedať, int z = * p * 2; To mätúce, pretože je to hviezda, hviezda. 38 00:03:13,540 --> 00:03:19,230 Jedna hviezda je dereferencing p, druhý hviezda vynásobením 2. 39 00:03:19,230 --> 00:03:26,780 Všimnite si, by som mohol mať rovnako dobre nahradil * p s x. 40 00:03:26,780 --> 00:03:29,430 Môžete ich použiť rovnakým spôsobom. 41 00:03:29,430 --> 00:03:38,000 A potom o niečo neskôr I môže mať p bod na úplne novú vec. 42 00:03:38,000 --> 00:03:42,190 Môžem len povedať, p = &z; 43 00:03:42,190 --> 00:03:44,940 Takže teraz p už neodkazuje na x, ale poukazuje na z. 44 00:03:44,940 --> 00:03:50,510 A kedykoľvek som to * p je to rovnaké, ako robí z 45 00:03:50,510 --> 00:03:56,170 Takže užitočná vec na tom je, akonáhle začneme dostať do funkcií. 46 00:03:56,170 --> 00:03:59,790 >> Je to trochu zbytočné deklarovať ukazovateľ, ktorý ukazuje na niečo, čo 47 00:03:59,790 --> 00:04:03,140 a potom ste len dereferencing to 48 00:04:03,140 --> 00:04:06,060 keď ste mohol použiť pôvodnú premennú začať. 49 00:04:06,060 --> 00:04:18,190 Ale keď sa dostanete do funkcií - tak povedzme, že máme nejakú funkciu, int foo, 50 00:04:18,190 --> 00:04:32,810 ktorý berie ukazovateľ a len robí * P = 6; 51 00:04:32,810 --> 00:04:39,990 Rovnako ako sme videli predtým, než sa swapu, môžete to urobiť efektívne swap a samostatnú funkciu 52 00:04:39,990 --> 00:04:45,180 tým, že len okolo celých čísel, pretože všetko v C je vždy okolo hodnoty. 53 00:04:45,180 --> 00:04:48,360 Aj keď ste okolo ukazovatele ste okolo hodnoty. 54 00:04:48,360 --> 00:04:51,940 To len tak sa stane, že tieto hodnoty sú adresy pamäte. 55 00:04:51,940 --> 00:05:00,770 Takže keď hovorím foo (p), som okolo ukazovateľ do funkcie foo 56 00:05:00,770 --> 00:05:03,910 a potom foo robí * p = 6; 57 00:05:03,910 --> 00:05:08,600 Takže v tejto funkcie, * p je stále ekvivalentná x, 58 00:05:08,600 --> 00:05:12,720 ale nemôžem použiť x vnútri tejto funkcie, pretože to nie je rozsahom v tejto funkcii. 59 00:05:12,720 --> 00:05:19,510 Takže * p = 6 je jediný spôsob, ako môžem získať prístup k miestnej premennej z inej funkcie. 60 00:05:19,510 --> 00:05:23,600 Alebo, no, ukazovatele sú jediný spôsob, ako môžem získať prístup k miestnej premennej z inej funkcie. 61 00:05:23,600 --> 00:05:31,600 [Študent] Povedzme, že ste sa chceli vrátiť ukazovateľ. Ako presne to robíte, že? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Vracia ukazovateľ ako v niečo ako int y = 3; return & y? >> [Študent] Jo. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Dobre. Nikdy by ste nemali urobiť. To je zlé. 64 00:05:48,480 --> 00:05:59,480 Myslím, že som videl v týchto prednáškových snímok si začal vidieť celý tento diagram pamäte 65 00:05:59,480 --> 00:06:02,880 kde tu máte pamäťovú adresu 0 66 00:06:02,880 --> 00:06:09,550 a tu máte adresu v pamäti 4 koncerty alebo 2 na 32. 67 00:06:09,550 --> 00:06:15,120 Takže máš nejaké veci a nejaké veci a potom sa budete musieť váš stack 68 00:06:15,120 --> 00:06:21,780 a máte svoj haldy, ktoré ste práve začal poznávať, rastie. 69 00:06:21,780 --> 00:06:24,390 [Študent] Nie haldy nad zásobníka? 70 00:06:24,390 --> 00:06:27,760 >> Jo. Halda je na vrchole, je to tak? >> [Študent] No, dal 0 na vrchole. 71 00:06:27,760 --> 00:06:30,320 [Študent] Oh, dal 0 na vrchole. >> [Študent] Oh, dobre. 72 00:06:30,320 --> 00:06:36,060 Upozornenie: Kdekoľvek s CS50 budete vidieť, že týmto spôsobom. >> [Študent] Dobre. 73 00:06:36,060 --> 00:06:40,290 Je to len, že keď ste najprv vidieť stohy, 74 00:06:40,290 --> 00:06:45,000 ako keď si myslíte, že stoh si myslíte, že stohovanie veci na vrchole jedného iný. 75 00:06:45,000 --> 00:06:50,810 Takže máme tendenciu otočiť to asi tak stack rastie ako stack normálne 76 00:06:50,810 --> 00:06:55,940 miesto zásobníka visí dole. >> [Študent] Ešte nie hromady technicky rastú až príliš, aj keď? 77 00:06:55,940 --> 00:07:01,100 Záleží na tom, čo máte na mysli tým, vyrastať. 78 00:07:01,100 --> 00:07:04,010 Zásobník a halda vždy rastú v opačných smeroch. 79 00:07:04,010 --> 00:07:09,420 Zásobník je vždy vyrastá v tom zmysle, že je to rastie 80 00:07:09,420 --> 00:07:12,940 k vyššej pamäťovej adresy, a haldy rastie dole 81 00:07:12,940 --> 00:07:17,260 v tom, že je to stále k nižším adresy pamäte. 82 00:07:17,260 --> 00:07:20,250 Takže vrchol je 0 a dno je vysoká adresy pamäte. 83 00:07:20,250 --> 00:07:26,390 Sú obaja rastie, len v protiľahlých smeroch. 84 00:07:26,390 --> 00:07:29,230 [Študent] Len som myslel, že preto, že ste povedal, že ste dal hromadu na dne 85 00:07:29,230 --> 00:07:33,640 pretože sa zdá viac intuitívne, pretože pre zásobník začať na vrchole haldy, 86 00:07:33,640 --> 00:07:37,520 haldy je na vrchole seba taky, takže to je - >> Jo. 87 00:07:37,520 --> 00:07:44,960 Môžete tiež myslieť na hromadu ako vyrastať a väčšie, ale zásobník viac. 88 00:07:44,960 --> 00:07:50,280 Takže stack je ten, že sme trochu chcieť ukázať rastie. 89 00:07:50,280 --> 00:07:55,390 Ale všade, kam sa pozriete inak sa chystá ukázať adresu 0 hore 90 00:07:55,390 --> 00:07:59,590 a najvyšší adresa pamäte v dolnej časti, takže to je váš obvyklý pohľad na pamäti. 91 00:07:59,590 --> 00:08:02,100 >> Máte otázku? 92 00:08:02,100 --> 00:08:04,270 [Študent] Môžete nám povedať viac o hromadu? 93 00:08:04,270 --> 00:08:06,180 Jo. Aj k tomu sa dostaneme za chvíľu. 94 00:08:06,180 --> 00:08:12,220 Po prvé, ísť späť, prečo vracať & Y je zlá vec, 95 00:08:12,220 --> 00:08:18,470 na zásobníku budete mať veľa zásobníka snímok, ktoré reprezentujú všetky funkcie 96 00:08:18,470 --> 00:08:20,460 ktoré boli povolaní. 97 00:08:20,460 --> 00:08:27,990 Takže ignorovať predchádzajúce veci, horná časť zásobníka je vždy bude hlavné funkcie 98 00:08:27,990 --> 00:08:33,090 pretože to je to prvá funkcia, ktorá je volaná. 99 00:08:33,090 --> 00:08:37,130 A potom, keď budete volať inú funkciu, zásobník porastie dole. 100 00:08:37,130 --> 00:08:41,640 Takže keď ti budem hovoriť nejakú funkciu, foo, a to má svoj vlastný zásobník rám, 101 00:08:41,640 --> 00:08:47,280 môže volať nejakú funkciu, bar, to dostane jeho vlastné zásobníka rám. 102 00:08:47,280 --> 00:08:49,840 A bar môže byť rekurzívne, a to mohol zavolať sám, 103 00:08:49,840 --> 00:08:54,150 a tak, aby druhý hovor do baru bude mať svoje vlastné zásobníka rám. 104 00:08:54,150 --> 00:08:58,880 A tak, čo sa deje v týchto stack rámy sú všetky lokálne premenné 105 00:08:58,880 --> 00:09:03,450 a všetky argumenty funkcie, ktoré - 106 00:09:03,450 --> 00:09:08,730 Všetky veci, ktoré sú lokálne rozsahom tejto funkcii pokračovať v týchto zásobníku rámov. 107 00:09:08,730 --> 00:09:21,520 Takže to znamená, že keď som povedal niečo ako bar je funkcia, 108 00:09:21,520 --> 00:09:29,270 Idem len vyhlásiť celé číslo a vráti ukazovateľ na tento integer. 109 00:09:29,270 --> 00:09:33,790 Tak kde y žijú? 110 00:09:33,790 --> 00:09:36,900 [Študent] y žije v bare. >> [Bowden] Jo. 111 00:09:36,900 --> 00:09:45,010 Niekde v tomto malom námestí pamäte je štvorec littler, ktorý má y v ňom. 112 00:09:45,010 --> 00:09:53,370 Keď som sa vrátiť a y, vraciam ukazovateľ na tento malý blok pamäte. 113 00:09:53,370 --> 00:09:58,400 Ale potom, keď funkcia vracia, jeho stack frame dostane vyskočila zo zásobníka. 114 00:10:01,050 --> 00:10:03,530 A to je dôvod, prečo sa tomu hovorí stack. 115 00:10:03,530 --> 00:10:06,570 Je to ako štruktúry zásobníka dát, ak viete, čo to je. 116 00:10:06,570 --> 00:10:11,580 Alebo dokonca ako hromada zásobníkov je vždy príkladom, 117 00:10:11,580 --> 00:10:16,060 Hlavné je ísť na dne, potom prvá funkcia voláte sa ísť na vrchole, že 118 00:10:16,060 --> 00:10:20,400 a môžete sa dostať späť do hlavného, ​​až sa vrátite zo všetkých funkcií, ktoré boli tzv 119 00:10:20,400 --> 00:10:22,340 , Ktoré boli umiestnené na vrchole toho. 120 00:10:22,340 --> 00:10:28,650 >> [Študent] Takže ak ste to vrátiť a y, že hodnota sa môžu zmeniť bez predchádzajúceho upozornenia. 121 00:10:28,650 --> 00:10:31,290 Áno, to - >> [Študent] Mohlo by to byť prepísané. Jo >>. 122 00:10:31,290 --> 00:10:34,660 Je to úplne - Ak sa pokúsite - 123 00:10:34,660 --> 00:10:38,040 To by tiež int * bar, pretože sa vracia ukazovateľ, 124 00:10:38,040 --> 00:10:41,310 tak jeho návratový typ je int *. 125 00:10:41,310 --> 00:10:46,500 Ak sa pokúsite použiť návratovú hodnotu tejto funkcie, je to nedefinované správanie 126 00:10:46,500 --> 00:10:51,770 preto, že ukazovateľ ukazuje na zlú spomienkou. >> [Študent] Dobre. 127 00:10:51,770 --> 00:11:01,250 Takže čo keď, napríklad, ste vyhlásil int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 To je lepšie. Áno. 129 00:11:03,740 --> 00:11:07,730 [Študent] Hovorili sme o tom, ako keď sme pretiahnuť veci do nášho koša 130 00:11:07,730 --> 00:11:11,750 oni nie sú v skutočnosti odstránené, sme len stratiť ich ukazovatele. 131 00:11:11,750 --> 00:11:15,550 Takže v tomto prípade sa budeme vlastne vymazať hodnotu, alebo je tam ešte v pamäti? 132 00:11:15,550 --> 00:11:19,130 Z väčšej časti, bude to ešte bude. 133 00:11:19,130 --> 00:11:24,220 Ale povedzme, že náhodou zavolať nejakú inú funkciu, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz dostane svoj vlastný zásobník rám tu. 135 00:11:28,990 --> 00:11:31,470 Je to bude prepísanie všetkých týchto vecí, 136 00:11:31,470 --> 00:11:34,180 a potom, ak sa neskôr vyskúšať a používať ukazovateľ, ktorý ste dostali skôr, 137 00:11:34,180 --> 00:11:35,570 to nebude mať rovnakú hodnotu. 138 00:11:35,570 --> 00:11:38,150 Bude to zmenilo len preto, že ste volal funkciu Baz. 139 00:11:38,150 --> 00:11:43,080 [Študent] Ale už nie sme, stále by sme si 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] S najväčšou pravdepodobnosťou, že nie. 141 00:11:44,990 --> 00:11:49,670 Ale nemôžete spoľahnúť na to. C len hovorí, nedefinované správanie. 142 00:11:49,670 --> 00:11:51,920 >> [Študent] Oh, to robí. Dobre. 143 00:11:51,920 --> 00:11:58,190 Takže keď sa chcete vrátiť ukazovateľ, to je miesto, kde malloc prichádza v prevádzke. 144 00:12:00,930 --> 00:12:15,960 Píšem vlastne len návrat malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Pôjdeme cez malloc viac sekundu, ale predstava, že malloc je všetko vaše lokálnych premenných 146 00:12:24,050 --> 00:12:26,760 vždy ísť na stack. 147 00:12:26,760 --> 00:12:31,570 Čokoľvek, čo sa malloced pokračuje na halde, a to navždy a vždy na halde 148 00:12:31,570 --> 00:12:34,490 kým je výslovne uvoľniť ju. 149 00:12:34,490 --> 00:12:42,130 Takže to znamená, že keď malloc niečo, bude to prežiť po funkcia vráti. 150 00:12:42,130 --> 00:12:46,800 [Študent] Bude to prežiť po programu sa zastaví? >> Nie 151 00:12:46,800 --> 00:12:53,180 Dobre, takže to tam bude, kým program je predovšetkým spôsob, ako urobiť chodu. Áno >>. 152 00:12:53,180 --> 00:12:57,510 Môžeme ísť cez detaily o tom, čo sa stane, keď sa program zastaví. 153 00:12:57,510 --> 00:13:02,150 Možno budete musieť pripomínať mňa, ale to je samostatná vec úplne. 154 00:13:02,150 --> 00:13:04,190 [Študent] Tak malloc vytvára ukazovateľ? Jo >>. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [Študent] Myslím, že malloc označuje blok pamäti, že ukazovateľ môže použiť. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Chcem, aby diagram znovu. >> [Študent] Takže táto funkcia funguje, aj keď? 157 00:13:19,610 --> 00:13:26,430 [Študent] Jo, malloc označuje blok pamäte, ktoré môžete použiť, 158 00:13:26,430 --> 00:13:30,470 a potom sa vráti adresu prvého bloku tejto pamäte. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Jo. Takže, keď malloc, ste chytil nejaký blok pamäte 160 00:13:36,750 --> 00:13:38,260 že je v súčasnej dobe v halde. 161 00:13:38,260 --> 00:13:43,040 Ak Halda je príliš malý, potom haldy je len porastie, a to rastie v tomto smere. 162 00:13:43,040 --> 00:13:44,650 Takže povedzme, že haldy je príliš malý. 163 00:13:44,650 --> 00:13:49,960 Potom je to o rast trochu a vráti ukazovateľ na tento blok, ktorý práve vyrástol. 164 00:13:49,960 --> 00:13:55,130 Keď veci zadarmo, robíš väčší priestor v halde, 165 00:13:55,130 --> 00:14:00,030 takže potom neskôr nazvali malloc môžete znovu použiť, že pamäť, ktorú predtým uvoľnený. 166 00:14:00,030 --> 00:14:09,950 Dôležitá vec, o malloc a free je, že vám dáva úplnú kontrolu 167 00:14:09,950 --> 00:14:12,700 po celú dobu životnosti týchto pamäťových blokov. 168 00:14:12,700 --> 00:14:15,420 Globálne premenné sú vždy živý. 169 00:14:15,420 --> 00:14:18,500 Lokálne premenné sú nažive do ich pôsobnosti. 170 00:14:18,500 --> 00:14:22,140 Akonáhle idete okolo ortézy kučeravé, miestne premenné sú mŕtvi. 171 00:14:22,140 --> 00:14:28,890 Malloced pamäť je nažive, keď chcete, aby to bolo nažive 172 00:14:28,890 --> 00:14:33,480 a potom sa uvoľní, keď poviete, že môžu byť prepustený. 173 00:14:33,480 --> 00:14:38,420 To sú vlastne len 3 druhy pamäte, naozaj. 174 00:14:38,420 --> 00:14:41,840 Tam je automatická správa pamäte, čo je zásobník. 175 00:14:41,840 --> 00:14:43,840 Veci sa dejú za vás automaticky. 176 00:14:43,840 --> 00:14:46,910 Keď sa povie int x, je pamäť pridelená pre int x. 177 00:14:46,910 --> 00:14:51,630 Keď x dostane mimo rozsah, je pamäť kultivovaný pre x. 178 00:14:51,630 --> 00:14:54,790 Potom je tu dynamická správa pamäte, ktorá je čo malloc je, 179 00:14:54,790 --> 00:14:56,740 čo je, keď máte kontrolu. 180 00:14:56,740 --> 00:15:01,290 Môžete dynamicky rozhodnúť, kedy by mali pamäť a nemali by byť pridelené. 181 00:15:01,290 --> 00:15:05,050 A potom je tu statická, čo jednoducho znamená, že to žije večne, 182 00:15:05,050 --> 00:15:06,610 čo je to, čo globálne premenné. 183 00:15:06,610 --> 00:15:10,240 Sú to len vždy v pamäti. 184 00:15:10,960 --> 00:15:12,760 >> Otázky? 185 00:15:14,490 --> 00:15:17,230 [Študent] Môžete definovať blok len pomocou zložené zátvorky 186 00:15:17,230 --> 00:15:21,220 ale nemal by mať v prípade straty alebo while alebo niečo také? 187 00:15:21,220 --> 00:15:29,130 Môžete definovať blok ako vo funkcii, ale že má zložené zátvorky taky. 188 00:15:29,130 --> 00:15:32,100 [Študent] Takže nemôžete jednoducho ako náhodné dvojice zložených zátvoriek v kóde 189 00:15:32,100 --> 00:15:35,680 ktoré majú lokálne premenné? >> Áno, môžete. 190 00:15:35,680 --> 00:15:45,900 Vnútri int bare by sme mohli mať {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 Že to má byť tu. 192 00:15:48,440 --> 00:15:52,450 Ale to kompletne definuje rozsah int y. 193 00:15:52,450 --> 00:15:57,320 Po tomto druhom rovnátka kučeravé, môžete y nesmú byť naďalej používať. 194 00:15:57,910 --> 00:16:00,630 Skoro si to nikdy neurobil, hoci. 195 00:16:02,940 --> 00:16:07,370 Dostať sa späť na to, čo sa stane, keď program skončí, 196 00:16:07,370 --> 00:16:18,760 je to niečo ako rozšírený omyl / polovica lži, že dávame, aby sa len robiť veci lepšie. 197 00:16:18,760 --> 00:16:24,410 Povieme vám, že keď sa alokovať pamäť 198 00:16:24,410 --> 00:16:29,860 ste vyčleňujú kus RAM pre dané premenné. 199 00:16:29,860 --> 00:16:34,190 Ale ty si naozaj priamo dotýkať RAM niekedy vo svojich programoch. 200 00:16:34,190 --> 00:16:37,490 Ak si myslíte, že o tom, ako som kreslil - 201 00:16:37,490 --> 00:16:44,330 A skutočne, ak si prejsť v GDB uvidíte to isté. 202 00:16:51,120 --> 00:16:57,590 Bez ohľadu na to, koľkokrát si spustiť program alebo aký program používate, 203 00:16:57,590 --> 00:16:59,950 zásobník je vždy začať - 204 00:16:59,950 --> 00:17:06,510 ste vždy uvidí premenné okolo niečoho adresu oxbffff. 205 00:17:06,510 --> 00:17:09,470 Je to zvyčajne niekde v tejto oblasti. 206 00:17:09,470 --> 00:17:18,760 Ale ako môže 2 programy mohol mať ukazovatele na rovnakej pamäti? 207 00:17:20,640 --> 00:17:27,650 [Študent] Tam je nejaký ľubovoľný určenia, kde je oxbfff mal byť na RAM 208 00:17:27,650 --> 00:17:31,320 , Ktoré môžu byť v skutočnosti v rôznych miestach v závislosti na tom, kedy bola volaná funkcia. 209 00:17:31,320 --> 00:17:35,920 Jo. Termín je virtuálna pamäť. 210 00:17:35,920 --> 00:17:42,250 Myšlienka je, že každý jednotlivý proces, každý program, ktorý je spustený na počítači 211 00:17:42,250 --> 00:17:49,450 má vlastné - predpokladajme, že 32 bitov - úplne nezávislý adresový priestor. 212 00:17:49,450 --> 00:17:51,590 To je adresový priestor. 213 00:17:51,590 --> 00:17:56,220 Má svoje vlastné úplne nezávislé 4 GB na použitie. 214 00:17:56,220 --> 00:18:02,220 >> Takže, ak sa dostanete 2 programy súčasne, tento program vidí 4 GB k sebe, 215 00:18:02,220 --> 00:18:04,870 tento program vidí 4 GB k sebe, 216 00:18:04,870 --> 00:18:07,720 a to je nemožné pre tento program dereferencia ukazovatele 217 00:18:07,720 --> 00:18:10,920 a skončiť s pamäťou z tohto programu. 218 00:18:10,920 --> 00:18:18,200 A čo virtuálna pamäť je mapovanie z procesov adresového priestoru 219 00:18:18,200 --> 00:18:20,470 na skutočné veci na pamäti. 220 00:18:20,470 --> 00:18:22,940 Takže je to pre váš operačný systém, aby vedeli, 221 00:18:22,940 --> 00:18:28,080 hej, keď ten chlap dereferences ukazovateľ oxbfff, že v skutočnosti znamená 222 00:18:28,080 --> 00:18:31,040 že chce RAM byte 1000, 223 00:18:31,040 --> 00:18:38,150 vzhľadom k tomu, ak tento program dereferences oxbfff, že naozaj chce RAM byte 10000. 224 00:18:38,150 --> 00:18:41,590 Môžu byť ľubovoľne ďaleko od seba. 225 00:18:41,590 --> 00:18:48,730 To platí dokonca aj vecí v rámci jedného procesov adresného priestoru. 226 00:18:48,730 --> 00:18:54,770 Tak ako to vidia všetky 4 GB k sebe, ale povedzme, že - 227 00:18:54,770 --> 00:18:57,290 [Študent] Má každý proces - 228 00:18:57,290 --> 00:19:01,350 Povedzme, že máte počítač iba s 4 GB pamäte RAM. 229 00:19:01,350 --> 00:19:06,430 Má každý proces vidieť celé 4 GB? Áno >>. 230 00:19:06,430 --> 00:19:13,060 Ale 4 GB to vidí je lož. 231 00:19:13,060 --> 00:19:20,460 Je to jednoducho, že si myslí, že má všetky tieto pamäte, pretože nevie, iný proces existuje. 232 00:19:20,460 --> 00:19:28,140 To bude používať iba toľko pamäte, ako to vlastne potrebuje. 233 00:19:28,140 --> 00:19:32,340 Operačný systém sa nebude dať RAM do tohto procesu 234 00:19:32,340 --> 00:19:35,750 či to nebol použitý žiadny pamäť celého tohto regiónu. 235 00:19:35,750 --> 00:19:39,300 Nebude to, aby to pamäť pre túto oblasť. 236 00:19:39,300 --> 00:19:54,780 Ale nápad je to - ja sa snažím myslieť na - ja si nemyslím, že analógia. 237 00:19:54,780 --> 00:19:56,780 Analógie sú tvrdé. 238 00:19:57,740 --> 00:20:02,700 Jednou z otázok, virtuálnej pamäte alebo jedna z vecí, je to riešenie 239 00:20:02,700 --> 00:20:06,810 je to, že proces by mal byť úplne vedomí seba. 240 00:20:06,810 --> 00:20:12,140 A tak si môžete zapísať ľubovoľný program, ktorý len dereferences žiadny ukazovateľ, 241 00:20:12,140 --> 00:20:19,340 Páči stačí napísať program, ktorý hovorí, že * (ox1234), 242 00:20:19,340 --> 00:20:22,890 a to je to, dereferencing adresa pamäte 1234. 243 00:20:22,890 --> 00:20:28,870 >> Ale je to až do operačného systému a potom preložiť, čo znamená 1234. 244 00:20:28,870 --> 00:20:33,960 Takže ak 1234 sa stane, že platné adresa pamäte pre tento proces, 245 00:20:33,960 --> 00:20:38,800 ako je to na fronte, alebo tak niečo, potom to vráti hodnotu tejto pamäťovej adresy 246 00:20:38,800 --> 00:20:41,960 pokiaľ ide o proces vie. 247 00:20:41,960 --> 00:20:47,520 Ale ak 1234 nie je platná adresa, rovnako ako sa to stane pristáť 248 00:20:47,520 --> 00:20:52,910 v nejakom malom kúsku pamäti tu, ktorý je mimo zásobníka a za hromadu 249 00:20:52,910 --> 00:20:57,200 a vy ste naozaj používať, potom to je, keď sa dostanete veci, ako segfault chýb 250 00:20:57,200 --> 00:21:00,260 preto, že ste sa dotknete pamäti, že by ste nemali dotýkať. 251 00:21:07,180 --> 00:21:09,340 To je tiež pravda - 252 00:21:09,340 --> 00:21:15,440 32-bit systém, 32 bitov znamená, že máte 32 bitov pri definovaní adresu pamäte. 253 00:21:15,440 --> 00:21:22,970 Je to dôvod, prečo ukazovatele sú 8 bytov, pretože 32 bitov je 8 bytov - alebo 4 bajty. 254 00:21:22,970 --> 00:21:25,250 Ukazovatele sú 4 byty. 255 00:21:25,250 --> 00:21:33,680 Takže keď vidíte ukazovateľ, ako oxbfffff, že je - 256 00:21:33,680 --> 00:21:40,080 V akomkoľvek programe stačí postaviť ľubovoľnú ukazovateľ, 257 00:21:40,080 --> 00:21:46,330 kdekoľvek od ox0 do volské 8 f 's - FFFFFFFF. 258 00:21:46,330 --> 00:21:49,180 [Študent] Nevravel si, že sú 4 byty? Jo >>. 259 00:21:49,180 --> 00:21:52,730 [Študent] Potom každý byte bude mať - >> [Bowden] Hexadecimálny. 260 00:21:52,730 --> 00:21:59,360 Hexadecimálne - 5, 6, 7, 8. Takže ukazovateľmi budete vždy vidieť v šestnástkovej sústave. 261 00:21:59,360 --> 00:22:01,710 Je to len, ako delíme ukazovatele. 262 00:22:01,710 --> 00:22:05,240 Každé 2 číslice šestnástkovej je 1 byte. 263 00:22:05,240 --> 00:22:09,600 Takže tam to bude 8 hexadecimálnych číslic pre 4 byty. 264 00:22:09,600 --> 00:22:14,190 Takže každý ukazovateľ na 32-bitovom systéme bude 4 byty, 265 00:22:14,190 --> 00:22:18,550 čo znamená, že vo vašom procese môžete postaviť ľubovoľného 4 bajty 266 00:22:18,550 --> 00:22:20,550 a aby ukazovateľ z toho, 267 00:22:20,550 --> 00:22:32,730 , Čo znamená, že ak je to známe, môže to riešiť celý 2 až 32 bajtov pamäte. 268 00:22:32,730 --> 00:22:34,760 Aj keď to naozaj nie je prístup k že, 269 00:22:34,760 --> 00:22:40,190 aj keď je počítač má iba 512 MB, si myslí, že má toľko pamäte. 270 00:22:40,190 --> 00:22:44,930 A operačný systém je dosť šikovný na to, že to bude len pridelí to, čo skutočne potrebujete. 271 00:22:44,930 --> 00:22:49,630 To nie je len tak, oh, nový proces: 4 koncerty. 272 00:22:49,630 --> 00:22:51,930 >> Jo. >> [Študent] Čo vôl znamená? Prečo si to napísal? 273 00:22:51,930 --> 00:22:54,980 Je to len symbol na hexadecimálne. 274 00:22:54,980 --> 00:22:59,590 Keď vidíte číslo začiatok s volom, postupné veci sú hexadecimálne. 275 00:23:01,930 --> 00:23:05,760 [Študent] si vysvetľoval, čo sa stane, keď program skončí. Áno >>. 276 00:23:05,760 --> 00:23:09,480 Čo sa stane, keď program skončí, je operačný systém 277 00:23:09,480 --> 00:23:13,600 len vymaže mapovanie, že má pre tieto adresy, a to je to. 278 00:23:13,600 --> 00:23:17,770 Operačný systém môže teraz len dať tú spomienku na iný program používať. 279 00:23:17,770 --> 00:23:19,490 [Študent] Dobre. 280 00:23:19,490 --> 00:23:24,800 Takže keď budete prideľovať niečo na halde alebo zásobníka alebo globálne premenné alebo niečo, 281 00:23:24,800 --> 00:23:27,010 všetci len tak zmiznúť, akonáhle program skončí 282 00:23:27,010 --> 00:23:32,120 pretože operačný systém je teraz zadarmo, aby sa pamäť iných procesov. 283 00:23:32,120 --> 00:23:35,150 [Študent] I keď tam sú pravdepodobne stále hodnoty písané v? Jo >>. 284 00:23:35,150 --> 00:23:37,740 Hodnoty sú pravdepodobne stále existujú. 285 00:23:37,740 --> 00:23:41,570 Je to jednoducho, že to bude ťažké dostať sa na ne. 286 00:23:41,570 --> 00:23:45,230 Je to oveľa ťažšie dostať sa na ne, než je dostať sa na zmazaného súboru 287 00:23:45,230 --> 00:23:51,450 pretože zmazaný súbor druh sedí tam po dlhú dobu, a pevný disk je oveľa väčší. 288 00:23:51,450 --> 00:23:54,120 Takže to bude prepisovať rôzne časti pamäte 289 00:23:54,120 --> 00:23:58,640 pred tým, než sa stane prepísať kus pamäti, že súbor používa k byť. 290 00:23:58,640 --> 00:24:04,520 Ale hlavnej pamäte, RAM, môžete prechádzať oveľa rýchlejšie, 291 00:24:04,520 --> 00:24:08,040 takže to bude veľmi rýchlo byť prepísané. 292 00:24:10,300 --> 00:24:13,340 Otázky týkajúce sa tejto alebo čokoľvek iné? 293 00:24:13,340 --> 00:24:16,130 [Študent] Mám otázky týkajúce sa inej témy. Dobre >>. 294 00:24:16,130 --> 00:24:19,060 Má niekto nejaké otázky na túto tému? 295 00:24:20,170 --> 00:24:23,120 >> Dobre. Iná téma. >> [Študent] Dobre. 296 00:24:23,120 --> 00:24:26,550 Chcel som cez niektoré z praktických testov, 297 00:24:26,550 --> 00:24:30,480 a v jednom z nich sa hovorilo o sizeof 298 00:24:30,480 --> 00:24:35,630 a hodnota, ktorá sa vracia, alebo rôzne typy premenných. Áno >>. 299 00:24:35,630 --> 00:24:45,060 A povedal, že obaja int a dlho obe vrátiť 4, takže obaja sú dĺžke 4 bajty. 300 00:24:45,060 --> 00:24:48,070 Je nejaký rozdiel medzi int a dlhé, alebo je to to isté? 301 00:24:48,070 --> 00:24:50,380 Áno, tam je rozdiel. 302 00:24:50,380 --> 00:24:52,960 C štandard - 303 00:24:52,960 --> 00:24:54,950 Ja som asi ísť pokaziť. 304 00:24:54,950 --> 00:24:58,800 C štandard je presne to, čo C je oficiálna dokumentácia C. 305 00:24:58,800 --> 00:25:00,340 To je to, čo hovorí. 306 00:25:00,340 --> 00:25:08,650 Takže C štandard len hovorí, že char bude navždy a vždy 1 bajt. 307 00:25:10,470 --> 00:25:19,040 Všetko po tom - krátky, je vždy len definovaný ako väčšie alebo rovné znak. 308 00:25:19,040 --> 00:25:23,010 Toto by mohlo byť prísne väčší ako, ale nie je pozitívny. 309 00:25:23,010 --> 00:25:31,940 Int je práve definovaná ako väčšie alebo rovné krátky. 310 00:25:31,940 --> 00:25:36,210 A dlhá je práve definoval ako väčší alebo rovná int. 311 00:25:36,210 --> 00:25:41,600 A dlho dlho je väčší alebo rovný dlho. 312 00:25:41,600 --> 00:25:46,610 Takže jediné, čo C štandard definuje je relatívna usporiadanie všetkého. 313 00:25:46,610 --> 00:25:54,880 Skutočná veľkosť pamäti, že veci zaberajú je všeobecne až po realizáciu, 314 00:25:54,880 --> 00:25:57,640 ale je to celkom dobre definovaná v tomto bode. >> [Študent] Dobre. 315 00:25:57,640 --> 00:26:02,490 Takže šortky sú takmer vždy bude 2 bytov. 316 00:26:04,920 --> 00:26:09,950 Ints sú takmer vždy bude 4 byty. 317 00:26:12,070 --> 00:26:15,340 Dlhé dlhé výrobky sú takmer vždy bude 8 bytov. 318 00:26:17,990 --> 00:26:23,160 A túži, to záleží na tom, či používate 32-bit alebo 64-bit systém. 319 00:26:23,160 --> 00:26:27,450 Tak dlho bude zodpovedať typu systému. 320 00:26:27,450 --> 00:26:31,920 Ak používate 32-bitový systém ako Appliance, že to bude 4 byty. 321 00:26:34,530 --> 00:26:42,570 Ak používate 64-bit ako veľa novších počítačoch, to bude 8 bytov. 322 00:26:42,570 --> 00:26:45,230 >> Ints sú takmer vždy 4 bytov v tomto bode. 323 00:26:45,230 --> 00:26:47,140 Dlhé dlhé výrobky sú takmer vždy 8 bytov. 324 00:26:47,140 --> 00:26:50,300 V minulosti, ints používaný len 2 byty. 325 00:26:50,300 --> 00:26:56,840 Ale si všimnúť, že táto plne spĺňa všetky tieto vzťahov väčší ako a rovné. 326 00:26:56,840 --> 00:27:01,280 Tak dlho sa dokonale dovolené byť rovnakej veľkosti ako celé číslo, 327 00:27:01,280 --> 00:27:04,030 a je to tiež mohli byť rovnakej veľkosti ako long long. 328 00:27:04,030 --> 00:27:11,070 A to len tak náhodou, že v 99,999% systémov, sa bude rovnať 329 00:27:11,070 --> 00:27:15,800 buď int alebo long long. Záleží len na 32-bit alebo 64-bit. >> [Študent] Dobre. 330 00:27:15,800 --> 00:27:24,600 V pláva, ako je desatinné miesto určené v podmienkach kúskov? 331 00:27:24,600 --> 00:27:27,160 Rovnako ako ako binárny? Jo >>. 332 00:27:27,160 --> 00:27:30,570 Nemusíte vedieť, že pre CS50. 333 00:27:30,570 --> 00:27:32,960 Nemusíte ani dozvedieť, že v 61. 334 00:27:32,960 --> 00:27:37,350 Nemáte naučiť, že skutočne v každom predmete. 335 00:27:37,350 --> 00:27:42,740 Je to len charakter. 336 00:27:42,740 --> 00:27:45,440 Zabudol som presne bit prídely. 337 00:27:45,440 --> 00:27:53,380 Myšlienka s plávajúcou desatinnou čiarkou, je, že môžete alokovať určitý počet bitov reprezentovať - 338 00:27:53,380 --> 00:27:56,550 V podstate všetko, čo je vo vedeckej notácii. 339 00:27:56,550 --> 00:28:05,600 Takže si prideliť určitý počet bitov na reprezentáciu čísla sám, ako 1,2345. 340 00:28:05,600 --> 00:28:10,200 Nikdy predstavovať číslo s viac číslicami, ako 5. 341 00:28:12,200 --> 00:28:26,300 Potom sa tiež prideliť určitý počet bitov, takže má tendenciu byť ako 342 00:28:26,300 --> 00:28:32,810 môžete ísť len do určitej číslo, tak je najväčší exponent môžete mať, 343 00:28:32,810 --> 00:28:36,190 a môžete ísť len do určitej exponentom, 344 00:28:36,190 --> 00:28:38,770 rád, že je to najmenší exponent môžete mať. 345 00:28:38,770 --> 00:28:44,410 >> Nespomínam si presne spôsob, akým bity sú určené pre všetky z týchto hodnôt, 346 00:28:44,410 --> 00:28:47,940 ale určitý počet bitov sú venované 1,2345, 347 00:28:47,940 --> 00:28:50,930 ďalšie určitý počet bitov sú určené pre exponent, 348 00:28:50,930 --> 00:28:55,670 a je to len možné reprezentovať exponentu o určitej veľkosti. 349 00:28:55,670 --> 00:29:01,100 [Študent] A double? Je to ako extra dlhú plaváku? Jo >>. 350 00:29:01,100 --> 00:29:07,940 Je to to isté ako float, s výnimkou teraz používate 8 bajtov miesto 4 bajty. 351 00:29:07,940 --> 00:29:11,960 Teraz budete môcť používať 9 číslic alebo 10 číslic, 352 00:29:11,960 --> 00:29:16,630 a to bude môcť ísť do 300 namiesto 100. >> [Študent] Dobre. 353 00:29:16,630 --> 00:29:21,550 A plaváky sú tiež 4 byty. Áno >>. 354 00:29:21,550 --> 00:29:27,520 No, opäť, pravdepodobne záleží celkovo o všeobecné vykonávanie, 355 00:29:27,520 --> 00:29:30,610 ale plaváky sú 4 byty, dvojlôžkové sú 8. 356 00:29:30,610 --> 00:29:33,440 Zdvojnásobí sa nazývajú dvojitá, pretože sú dvakrát veľkosť plaváky. 357 00:29:33,440 --> 00:29:38,380 [Študent] Dobre. A sú tam double štvorhre? >> Nie sú. 358 00:29:38,380 --> 00:29:43,660 Myslím, že - >> [Študent] Ako dlhých túžia? Jo >>. To si nemyslím. Áno. 359 00:29:43,660 --> 00:29:45,950 [Študent] Na minuloročnej testu bola otázka o hlavnú funkciu 360 00:29:45,950 --> 00:29:49,490 musel byť súčasťou vášho programu. 361 00:29:49,490 --> 00:29:52,310 Odpoveď bola, že to nemusí byť súčasťou vášho programu. 362 00:29:52,310 --> 00:29:55,100 V akej situácii? To je to, čo som videl. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Zdá sa, že - >> [Študent] Akú situáciu? 364 00:29:59,090 --> 00:30:02,880 Máte problém? >> [Študent] Jo, môžem rozhodne vytiahnite ju. 365 00:30:02,880 --> 00:30:07,910 To nemusí byť, technicky, ale v podstate to bude. 366 00:30:07,910 --> 00:30:10,030 [Študent] Videl som jeden na iné roku. 367 00:30:10,030 --> 00:30:16,220 Bolo to ako True alebo False: platná - >> Oh, c súbor.? 368 00:30:16,220 --> 00:30:18,790 . [Študent] Každý c súbor musí mať - [ako povedané naraz - nezrozumiteľný] 369 00:30:18,790 --> 00:30:21,120 Dobre. Tak to je samostatná. 370 00:30:21,120 --> 00:30:26,800 >> . C súbor iba musí obsahovať funkcie. 371 00:30:26,800 --> 00:30:32,400 Môžete zostaviť súbor do strojového kódu, binárne, bez ohľadu, 372 00:30:32,400 --> 00:30:36,620 aby bolo spustiteľný ešte. 373 00:30:36,620 --> 00:30:39,420 Platný spustiteľný, musí mať hlavnú funkciu. 374 00:30:39,420 --> 00:30:45,460 Môžete napísať 100 funkcie v 1 súbore, ale nie hlavné 375 00:30:45,460 --> 00:30:48,800 a potom skompilovať, ktoré sa na binárne, 376 00:30:48,800 --> 00:30:54,460 potom môžete napísať iný súbor, ktorý má len hlavné, ale to si vyžaduje veľa z týchto funkcií 377 00:30:54,460 --> 00:30:56,720 v tomto binárny súbor sem. 378 00:30:56,720 --> 00:31:01,240 A tak, keď robíš spustiteľný súbor, ktorý je čo linker robí 379 00:31:01,240 --> 00:31:05,960 je to kombinuje tieto 2 binárne súbory do spustiteľného. 380 00:31:05,960 --> 00:31:11,400 Tak. C súbor nemusí mať hlavnú funkciu vôbec. 381 00:31:11,400 --> 00:31:19,220 A na veľké bázou kódu uvidíte tisíce. Súbory C a 1 hlavného súboru. 382 00:31:23,960 --> 00:31:26,110 Ďalšie otázky? 383 00:31:29,310 --> 00:31:31,940 [Študent] Tam bol ďalšia otázka. 384 00:31:31,940 --> 00:31:36,710 To povedal, aby ich kompilátor. Pravda alebo lož? 385 00:31:36,710 --> 00:31:42,030 A odpoveď bola falošná, a pochopil som, prečo to nie je ako Clang. 386 00:31:42,030 --> 00:31:44,770 Ale čo hovoríme, aby, ak to nie je? 387 00:31:44,770 --> 00:31:49,990 Urobte je v podstate len - vidím presne to, čo hovorí. 388 00:31:49,990 --> 00:31:52,410 Ale to len spúšťa príkazy. 389 00:31:53,650 --> 00:31:55,650 Urobte. 390 00:31:58,240 --> 00:32:00,870 Môžem vytiahnuť toto hore. Jo. 391 00:32:10,110 --> 00:32:13,180 Oh, yeah. Skontrolujte tiež to robí. 392 00:32:13,180 --> 00:32:17,170 To hovorí, že účelom utilitou make je určiť automaticky 393 00:32:17,170 --> 00:32:19,610 ktoré časti veľkého programu sa musí prekompilovať 394 00:32:19,610 --> 00:32:22,350 a vydávať príkazy k prekompilovať. 395 00:32:22,350 --> 00:32:27,690 Môžete urobiť make súbory, ktoré sú úplne obrovská. 396 00:32:27,690 --> 00:32:33,210 Urobte pozerá na časové pečiatky súborov a ako sme povedali skôr, 397 00:32:33,210 --> 00:32:36,930 môžete zostaviť jednotlivé súbory dole, a nie je to až sa dostanete do linker 398 00:32:36,930 --> 00:32:39,270 že sú dohromady do spustiteľného súboru. 399 00:32:39,270 --> 00:32:43,810 Takže ak máte 10 rôznych súborov a vykonať zmenu na 1 z nich, 400 00:32:43,810 --> 00:32:47,870 potom to, čo urobiť, je robiť, je len prekompilovať, že 1 súbor 401 00:32:47,870 --> 00:32:50,640 a potom znova všetko dohromady. 402 00:32:50,640 --> 00:32:53,020 Ale je to oveľa hlúpejší než to. 403 00:32:53,020 --> 00:32:55,690 Je na vás, aby ste kompletne definovať, že je to to, čo by mala robiť. 404 00:32:55,690 --> 00:32:59,560 Je štandardne má schopnosť rozpoznať toto časovú pečiatku veci, 405 00:32:59,560 --> 00:33:03,220 ale môžete napísať make súbor nič robiť. 406 00:33:03,220 --> 00:33:09,150 Môžete napísať, aby súbor tak, že keď zadáte, aby to len cd do iného adresára. 407 00:33:09,150 --> 00:33:15,560 Bola som frustrovaná, pretože som pripináčika všetko vnútri môjho spotrebiče 408 00:33:15,560 --> 00:33:21,740 a potom som zobraziť PDF z Mac. 409 00:33:21,740 --> 00:33:30,720 >> Tak som ísť do Finder a môžem si ísť, Pripojiť k serveru, 410 00:33:30,720 --> 00:33:36,950 a server sa pripojiť k je môj spotrebiča, a potom som otvoriť PDF 411 00:33:36,950 --> 00:33:40,190 , Ktorý sa zostavuje LaTeXu. 412 00:33:40,190 --> 00:33:49,320 Ale ja som začínal byť frustrovaný, pretože zakaždým som potreboval obnoviť PDF, 413 00:33:49,320 --> 00:33:53,900 Musel som skopírovať ho do konkrétneho adresára, ktorý by mohol získať prístup 414 00:33:53,900 --> 00:33:57,710 a to bolo stále nepríjemné. 415 00:33:57,710 --> 00:34:02,650 Takže namiesto toho som napísal make súbor, ktorý budete musieť definovať, ako to robí veci. 416 00:34:02,650 --> 00:34:06,130 Ako urobíte v tomto je PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Rovnako ako akúkoľvek inú značku súboru - alebo som asi ste nevideli Make súbory, 418 00:34:10,090 --> 00:34:13,510 ale máme v Appliance globálnej make súbor, ktorý práve hovorí, 419 00:34:13,510 --> 00:34:16,679 Ak sa kompilácie súbor C, použite rinčať. 420 00:34:16,679 --> 00:34:20,960 A tak tu v mojom súbore, ktorý na značku robím ja hovorím, 421 00:34:20,960 --> 00:34:25,020 Tento súbor budete chcieť kompilovať PDF LaTeXu. 422 00:34:25,020 --> 00:34:27,889 A tak je to PDF LaTeX, že to robí kompilácie. 423 00:34:27,889 --> 00:34:31,880 Urobte nie je kompilácie. Je to proste beží tieto príkazy v poradí som uviedol. 424 00:34:31,880 --> 00:34:36,110 Tak to beží PDF LaTeX, skopíruje ho do adresára chcem to byť skopírované, 425 00:34:36,110 --> 00:34:38,270 to cd do adresára a robí iné veci, 426 00:34:38,270 --> 00:34:42,380 ale všetko, čo robí, je uznať, keď súbor zmien, 427 00:34:42,380 --> 00:34:45,489 a ak zmení, potom to bude spustite príkazy, ktoré to má spustiť 428 00:34:45,489 --> 00:34:48,760 keď sa súbor zmení. >> [Študent] Dobre. 429 00:34:50,510 --> 00:34:54,420 Ja neviem, kde sa globálne Urobte súbory sú pre mňa pozrieť sa na to. 430 00:34:57,210 --> 00:35:04,290 Ďalšie otázky? Niečo z minulosti kvízy? Akékoľvek ukazovateľ veci? 431 00:35:06,200 --> 00:35:08,730 Existujú jemné veci, s ukazovateľmi, ako je - 432 00:35:08,730 --> 00:35:10,220 Nebudem mať možnosť nájsť kvízovú otázku na to - 433 00:35:10,220 --> 00:35:16,250 ale rovnako ako tieto veci. 434 00:35:19,680 --> 00:35:24,060 Uistite sa, že ste pochopili, že keď poviem, int * x * y - 435 00:35:24,890 --> 00:35:28,130 To nie je zrovna nič tu, myslím. 436 00:35:28,130 --> 00:35:32,140 Ale ako * x * y, ktoré sú 2 premenné, ktoré sú vo fronte. 437 00:35:32,140 --> 00:35:37,220 Keď poviem, že x = malloc (sizeof (int)), x je stále variabilný na zásobníku, 438 00:35:37,220 --> 00:35:41,180 malloc je nejaký blok nad v halde, a my máme x bod do haldy. 439 00:35:41,180 --> 00:35:43,900 >> Takže niečo na zásobníku ukazuje na hromadu. 440 00:35:43,900 --> 00:35:48,100 Kedykoľvek budete malloc niečo, ste nevyhnutne uložením vnútri ukazovateľ. 441 00:35:48,100 --> 00:35:55,940 Tak to je ukazovateľ na zásobníku, je malloced blok na halde. 442 00:35:55,940 --> 00:36:01,240 Mnoho ľudí si zmätený a povedať int * x = malloc, x je na hromadu. 443 00:36:01,240 --> 00:36:04,100 Nie, čo x poukazuje, je na halde. 444 00:36:04,100 --> 00:36:08,540 x sám je na stacku, ak z nejakého dôvodu ste x byť globálna premenná, 445 00:36:08,540 --> 00:36:11,960 v takom prípade sa stane, že je v inom regióne pamäti. 446 00:36:13,450 --> 00:36:20,820 Takže sledovanie, tieto krabice a šípka diagramy sú celkom bežné, že kvíz. 447 00:36:20,820 --> 00:36:25,740 Alebo, ak to nie je na kvíz 0, bude na teste 1. 448 00:36:27,570 --> 00:36:31,940 Mali by ste vedieť, všetky z nich, podľa krokov v zostavovaní 449 00:36:31,940 --> 00:36:35,740 pretože ste museli odpovedať na otázky týkajúce sa tých. Áno. 450 00:36:35,740 --> 00:36:38,940 [Študent] Mohli by sme vyraziť cez tieto kroky - >> Jasne. 451 00:36:48,340 --> 00:36:58,640 Pred krokov a zostavovaní sme predspracovanie, 452 00:36:58,640 --> 00:37:16,750 zostavovanie, montáž a prepojenie. 453 00:37:16,750 --> 00:37:21,480 Predspracovanie. Čo to má robiť? 454 00:37:29,720 --> 00:37:32,290 Je to najjednoduchší krok - dobre, nie ako - 455 00:37:32,290 --> 00:37:35,770 to neznamená, že by malo byť zrejmé, ale je to najjednoduchší krok. 456 00:37:35,770 --> 00:37:38,410 Vy mohli vykonávať to sami. Jo. 457 00:37:38,410 --> 00:37:43,410 [Študent] Vezmi si, čo máte vo vašej zahŕňa takto, a to kopíruje a potom tiež definuje. 458 00:37:43,410 --> 00:37:49,250 Vyzerá to na veci ako # include a # define, 459 00:37:49,250 --> 00:37:53,800 a to len kópie a pasty, čo skutočne znamenajú. 460 00:37:53,800 --> 00:37:59,240 Takže keď hovoríte # include cs50.h, preprocesor je kopírovanie a vkladanie cs50.h 461 00:37:59,240 --> 00:38:01,030 do tohto riadku. 462 00:38:01,030 --> 00:38:06,640 Keď sa povie # define x za 4, preprocesor prechádza celý program 463 00:38:06,640 --> 00:38:10,400 a nahrádza všetky výskyty x s 4. 464 00:38:10,400 --> 00:38:17,530 Takže preprocesor má platnú C súbor a výstupy platný C súbor 465 00:38:17,530 --> 00:38:20,300 kde veci boli skopírovať a vložiť. 466 00:38:20,300 --> 00:38:24,230 Takže teraz kompiláciu. Čo to má robiť? 467 00:38:25,940 --> 00:38:28,210 [Študent] To ide z C na binárne. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] To nie je ísť celú cestu na binárne. 469 00:38:30,970 --> 00:38:34,220 [Študent] do strojového kódu a potom? >> To nie je strojový kód. 470 00:38:34,220 --> 00:38:35,700 [Študent] zhromaždenia? >> Zhromaždenie. 471 00:38:35,700 --> 00:38:38,890 Ide to zhromaždenie, než prejde celú cestu ku kódu C, 472 00:38:38,890 --> 00:38:45,010 a väčšina jazykov niečo také. 473 00:38:47,740 --> 00:38:50,590 Vybrať akýkoľvek vysokej úrovni jazyka, a ak budete kompilovať, 474 00:38:50,590 --> 00:38:52,390 je pravdepodobné, zostaviť v krokoch. 475 00:38:52,390 --> 00:38:58,140 Najprv to bude kompilovať Python do C, potom to bude kompilovať C do zhromaždenia, 476 00:38:58,140 --> 00:39:01,600 a potom zhromaždenie sa chystá preložené do binárne. 477 00:39:01,600 --> 00:39:07,800 Takže kompilácie bude, aby ju z C na zhromaždení. 478 00:39:07,800 --> 00:39:12,130 Slovo zostavovaní zvyčajne znamená uviesť ho na vyššej úrovni 479 00:39:12,130 --> 00:39:14,340 na nižšej úrovni programovacieho jazyka. 480 00:39:14,340 --> 00:39:19,190 Tak to je len krok pri zostavovaní, kde môžete začať s high-úrovni jazyka 481 00:39:19,190 --> 00:39:23,270 a skončí v low-level jazyk, a to je dôvod, prečo je krok nazýva kompilácia. 482 00:39:25,280 --> 00:39:33,370 [Študent] Počas zostavovania, povedzme, že ste urobili # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Bude kompilátor rekompilaci cs50.h, rovnako ako funkcií, ktoré sú tam, 484 00:39:42,190 --> 00:39:45,280 a previesť do assembleri rovnako, 485 00:39:45,280 --> 00:39:50,830 alebo to bude skopírovať a vložiť niečo, čo bolo pre-zhromaždenie? 486 00:39:50,830 --> 00:39:56,910 cs50.h bude do značnej miery nikdy skončiť v zhromaždení. 487 00:39:59,740 --> 00:40:03,680 Veci ako funkcia prototypov a veci sú len pre vás byť opatrní. 488 00:40:03,680 --> 00:40:09,270 To zaručuje, že kompilátor môžete skontrolovať veci, ako ste volanie funkcií 489 00:40:09,270 --> 00:40:12,910 s právom návratové typy a správne argumenty a tak. 490 00:40:12,910 --> 00:40:18,350 >> Takže cs50.h bude predspracovanie do súboru, a potom, keď je to kompiláciu 491 00:40:18,350 --> 00:40:22,310 je to v podstate vyhodiť po dbá na to, aby všetko, čo je nazývané správne. 492 00:40:22,310 --> 00:40:29,410 Ale funkcie definované v CS50 knižnici, ktoré sú oddelené od cs50.h, 493 00:40:29,410 --> 00:40:33,610 ti nebudú samostatne zostavený. 494 00:40:33,610 --> 00:40:37,270 To bude skutočne zostúpi v prepojení kroku, takže k tomu sa dostaneme za chvíľu. 495 00:40:37,270 --> 00:40:40,100 Ale najprv, čo je montáž? 496 00:40:41,850 --> 00:40:44,500 [Študent] Montáž na binárne? Jo >>. 497 00:40:46,300 --> 00:40:48,190 Zostavenie. 498 00:40:48,190 --> 00:40:54,710 Nechceme hovoriť, že zostavovanie, pretože zhromaždenie je do značnej miery čistej preklad binárne. 499 00:40:54,710 --> 00:41:00,230 Tam je veľmi málo logiku ísť od zhromaždenia na binárne. 500 00:41:00,230 --> 00:41:03,180 Je to ako hľadať v tabuľke, oh, máme tento návod; 501 00:41:03,180 --> 00:41:06,290 ktorá zodpovedá binárne 01110. 502 00:41:10,200 --> 00:41:15,230 A tak sa súbory, ktoré montáž všeobecne výstupy sú. O súbory. 503 00:41:15,230 --> 00:41:19,020 A o Súbory sú to, čo sme hovorili skôr, 504 00:41:19,020 --> 00:41:21,570 Ako súbor nemusí mať hlavnú funkciu. 505 00:41:21,570 --> 00:41:27,640 Každý súbor môže byť zostavený až do. Súboru ° tak dlho, ako je to platný C súboru. 506 00:41:27,640 --> 00:41:30,300 To môže byť zostavený do. O.. 507 00:41:30,300 --> 00:41:43,030 Teraz, prepojenie je, čo vlastne prináša veľa. O súbory a prináša im spustiteľný. 508 00:41:43,030 --> 00:41:51,110 A tak to, čo robí, je linkovanie môžete myslieť na CS50 knižnice ako. Súbor °. 509 00:41:51,110 --> 00:41:56,980 Je to už skompilovaný binárny súbor. 510 00:41:56,980 --> 00:42:03,530 A tak pri kompilácii súboru, váš hello.c, ktorý volá GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c dostane zostavujú do hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o je teraz v binárnom formáte. 513 00:42:08,910 --> 00:42:12,830 Používa GetString, tak to musí ísť cez k cs50.o, 514 00:42:12,830 --> 00:42:16,390 a linker smooshes dohromady a skopíruje GetString do tohto súboru 515 00:42:16,390 --> 00:42:20,640 a prichádza s spustiteľný súbor, ktorý má všetky funkcie, ktoré potrebuje. 516 00:42:20,640 --> 00:42:32,620 Takže cs50.o nie je vlastne O súbor, ale je to dosť blízko, že nie je žiadny podstatný rozdiel. 517 00:42:32,620 --> 00:42:36,880 Takže prepojenie práve prináša veľa súborov dohromady 518 00:42:36,880 --> 00:42:41,390 že samostatne obsahujú všetky funkcie je potrebné použiť 519 00:42:41,390 --> 00:42:46,120 a vytvára spustiteľný súbor, ktorý bude skutočne spustiť. 520 00:42:48,420 --> 00:42:50,780 >> A tak to aj to, čo sme hovorili pred 521 00:42:50,780 --> 00:42:55,970 kde môžete mať 1000. c súbory, kompilovať ich všetky. o súbory, 522 00:42:55,970 --> 00:43:00,040 ktorá bude pravdepodobne chvíľu trvať, potom zmeníte 1. c súboru. 523 00:43:00,040 --> 00:43:05,480 Jediné, čo potrebujete prekompilovať, že 1. C súbor a potom znova všetko ostatné, 524 00:43:05,480 --> 00:43:07,690 odkaz všetko dohromady. 525 00:43:09,580 --> 00:43:11,430 [Študent] Keď sme prepájanie píšeme lcs50? 526 00:43:11,430 --> 00:43:20,510 Jo, tak lcs50. Tá vlajka signály linker, ktorý by mal byť spájajúci v tejto knižnici. 527 00:43:26,680 --> 00:43:28,910 Otázky? 528 00:43:41,310 --> 00:43:46,860 Už sme prešli binárne iné ako tie, ktoré 5 sekúnd na prvej prednáške? 529 00:43:50,130 --> 00:43:53,010 To si nemyslím. 530 00:43:55,530 --> 00:43:58,820 Mali by ste vedieť, všetky veľké Os, že sme preč cez, 531 00:43:58,820 --> 00:44:02,670 a vy by ste mali byť schopní, keby sme vám dal funkciu, 532 00:44:02,670 --> 00:44:09,410 mali by ste byť schopní povedať, že je to veľký O, zhruba. Alebo dobre, veľký O je drsný. 533 00:44:09,410 --> 00:44:15,300 Takže ak ste vidieť vnorené cykly for smyčkování cez rovnaký počet vecí, 534 00:44:15,300 --> 00:44:22,260 ako int i, i > [Študent] n na druhú. >> To býva n na druhú. 535 00:44:22,260 --> 00:44:25,280 Ak ste triple vnorené, to inklinuje byť n Cubed. 536 00:44:25,280 --> 00:44:29,330 Takže tieto veci by ste mali byť schopní poukázať okamžite. 537 00:44:29,330 --> 00:44:33,890 Musíte vedieť, vloženie druh bubliny a radenie a zlúčiť druh a všetky z nich. 538 00:44:33,890 --> 00:44:41,420 Je to ľahšie pochopiť, prečo sú tie, n na druhú a n log n a všetky, ktoré 539 00:44:41,420 --> 00:44:47,810 pretože si myslím, že bol na teste jeden rok, ak sme v podstate vám dal 540 00:44:47,810 --> 00:44:55,050 vykonávanie bublinkové druhu a povedal: "Čo je doba chodu tejto funkcie?" 541 00:44:55,050 --> 00:45:01,020 Takže ak ste uznať, že ako bubliny radiť, potom môžete okamžite povedať, n na druhú. 542 00:45:01,020 --> 00:45:05,470 Ale ak ste na neho len pozrú, vy ani nemusíte uvedomiť, že je to bublina druhu; 543 00:45:05,470 --> 00:45:08,990 stačí povedať, je to robí toto a toto. Toto je n na druhú. 544 00:45:12,350 --> 00:45:14,710 [Študent] Existujú nejaké ťažké príklady môžete prísť s, 545 00:45:14,710 --> 00:45:20,370 ako podobné myšlienky prísť? 546 00:45:20,370 --> 00:45:24,450 >> Nemyslím si, že by sme vám žiadne nepríjemné príklady. 547 00:45:24,450 --> 00:45:30,180 Bublina sort vec je asi tak ťažké, ako by sme ísť, 548 00:45:30,180 --> 00:45:36,280 a dokonca aj to, že tak dlho, ako ste pochopili, že ste iterácie pole 549 00:45:36,280 --> 00:45:41,670 pre každý prvok v poli, ktorý sa bude niečo, čo sa n na druhú. 550 00:45:45,370 --> 00:45:49,940 Existujú všeobecné otázky, ako tu máme - Oh. 551 00:45:55,290 --> 00:45:58,530 Len druhý deň, Doug tvrdil, "som vymyslel algoritmus, ktorý je možné triediť pole 552 00:45:58,530 --> 00:46:01,780 "Zn čísel v O (log n) čas!" 553 00:46:01,780 --> 00:46:04,900 Tak ako môžeme vedieť, že to nie je možné? 554 00:46:04,900 --> 00:46:08,850 [Nepočuteľné Študent odpoveď] >> Jo. 555 00:46:08,850 --> 00:46:13,710 Prinajmenšom, budete musieť dotknúť každý prvok v poli, 556 00:46:13,710 --> 00:46:16,210 takže je možné triediť pole - 557 00:46:16,210 --> 00:46:20,850 Ak je všetko v poriadku netriedeného, ​​potom budete dotýkať všetko v poli, 558 00:46:20,850 --> 00:46:25,320 takže je možné to urobiť za menej než O n 559 00:46:27,430 --> 00:46:30,340 [Študent] Ukázal si nám, že príklad, že sú schopní to urobiť v O n 560 00:46:30,340 --> 00:46:33,920 ak používate veľké množstvo pamäte. Jo >>. 561 00:46:33,920 --> 00:46:37,970 A to je - ja zabudol, čo to je - je to počítanie druh? 562 00:46:47,360 --> 00:46:51,330 Hmm. To je celé číslo triedenie algoritmus. 563 00:46:59,850 --> 00:47:05,100 Hľadal som zvláštne mená pre to, že som si nemohol spomenúť minulý týždeň. 564 00:47:05,100 --> 00:47:13,000 Jo. Jedná sa o typy druhov, ktoré môžu docieliť veci vo veľkom O n 565 00:47:13,000 --> 00:47:18,430 Ale existujú obmedzenia, ako je možné použiť iba celé čísla do určité číslo. 566 00:47:20,870 --> 00:47:24,560 Plus, ak sa snažíte vyriešiť niečo to je - 567 00:47:24,560 --> 00:47:30,750 Ak váš pole je 012, -12, 151, 4000000, 568 00:47:30,750 --> 00:47:35,120 potom, že jeden prvok bude úplne zničiť celý triedenie. 569 00:47:42,060 --> 00:47:44,030 >> Otázky? 570 00:47:49,480 --> 00:47:58,870 [Študent] Ak máte rekurzívne funkciu, a to len robí rekurzívne volanie 571 00:47:58,870 --> 00:48:02,230 v rámci return, to je chvost rekurzívny, 572 00:48:02,230 --> 00:48:07,360 a tak by nebolo využívajú viac pamäte za behu 573 00:48:07,360 --> 00:48:12,550 , Alebo by aspoň používať porovnateľné pamäte ako opakujúce sa riešenie? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Áno. 575 00:48:14,530 --> 00:48:19,840 Bolo by pravdepodobne trochu pomalší, ale nie tak celkom. 576 00:48:19,840 --> 00:48:23,290 Chvost rekurzívne je docela dobrý. 577 00:48:23,290 --> 00:48:32,640 Sa znovu pozrieme stack snímok, povedzme, že máme hlavné 578 00:48:32,640 --> 00:48:42,920 a máme int bar (int x), alebo tak niečo. 579 00:48:42,920 --> 00:48:52,310 To nie je dokonalý rekurzívne funkcie, ale návrat bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Tak samozrejme, toto je chybný. Musíte základné prípady a tak. 581 00:48:57,620 --> 00:49:00,360 Ale myšlienka je, že toto je chvost rekurzívny, 582 00:49:00,360 --> 00:49:06,020 čo znamená, že keď hlavné hovory bar to dostane jeho stack frame. 583 00:49:09,550 --> 00:49:12,440 V tomto zásobníku ráme to bude málo blok pamäte 584 00:49:12,440 --> 00:49:17,490 ktorá zodpovedá jeho argument x. 585 00:49:17,490 --> 00:49:25,840 A tak povedzme, že hlavné stane volať bar (100); 586 00:49:25,840 --> 00:49:30,050 Takže x bude začať ako 100. 587 00:49:30,050 --> 00:49:35,660 Ak kompilátor uznáva, že je to chvost rekurzívne funkcie, 588 00:49:35,660 --> 00:49:38,540 potom, keď bar robí jeho rekurzívne volanie bar, 589 00:49:38,540 --> 00:49:45,490 namiesto toho, aby sa nový zásobníka rám, ktorý je miesto, kde zásobník začne rastúce prevažne, 590 00:49:45,490 --> 00:49:48,220 nakoniec to bude prebiehať do haldy a potom dostanete segfault chýb 591 00:49:48,220 --> 00:49:51,590 pretože pamäť začína zrážať. 592 00:49:51,590 --> 00:49:54,830 >> Takže namiesto toho, aby svoj vlastný zásobník rám, môže si uvedomiť, 593 00:49:54,830 --> 00:49:59,080 hej, ja nikdy musieť vrátiť k tomuto rámca frontu, 594 00:49:59,080 --> 00:50:08,040 takže namiesto toho som si len vymeniť tento argument s 99 a potom začať bar po celom tele. 595 00:50:08,040 --> 00:50:11,810 A potom to bude robiť to znova a dosiahnu návrate bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 a namiesto toho, aby nový rámec frontu, bude to len nahradenie súčasnej argument s 98 597 00:50:17,320 --> 00:50:20,740 a potom skočiť späť na začiatku bare. 598 00:50:23,860 --> 00:50:30,430 Tieto operácie, ktoré je nahradí hodnotu 1 na zásobníku a skákanie späť na začiatok, 599 00:50:30,430 --> 00:50:32,430 sú celkom účinné. 600 00:50:32,430 --> 00:50:41,500 Takže je nielen to isté využitie pamäte ako samostatná funkcia, ktorá je interaktívne 601 00:50:41,500 --> 00:50:45,390 preto, že ste iba pomocou 1 zásobníka frame, ale nie ste utrpenie nevýhody 602 00:50:45,390 --> 00:50:47,240 mať volanie funkcií. 603 00:50:47,240 --> 00:50:50,240 Volanie funkcie môže byť trochu drahé, pretože má toto všetko nastavenie 604 00:50:50,240 --> 00:50:52,470 a teardown a všetky tieto veci. 605 00:50:52,470 --> 00:50:58,160 Tak toto chvost rekurzia je dobrá. 606 00:50:58,160 --> 00:51:01,170 [Študent] Prečo to nevytvára nové kroky? 607 00:51:01,170 --> 00:51:02,980 Vzhľadom k tomu, že si uvedomuje, že nie je potrebné. 608 00:51:02,980 --> 00:51:07,800 Výzva k baru je len vracia rekurzívneho volania. 609 00:51:07,800 --> 00:51:12,220 Takže to nemusí robiť nič s návratovú hodnotu. 610 00:51:12,220 --> 00:51:15,120 Je to len tak, aby okamžite vrátiť. 611 00:51:15,120 --> 00:51:20,530 Tak to len tak nahradiť jeho vlastné argumentácii a začať znovu. 612 00:51:20,530 --> 00:51:25,780 A tiež, ak nemáte chvost rekurzívne verzii, 613 00:51:25,780 --> 00:51:31,460 potom dostanete všetky tieto bary, kde, kedy tento ukazovateľ vracia 614 00:51:31,460 --> 00:51:36,010 má vrátiť jeho hodnotu na tento jeden, a potom, že bar sa okamžite vráti 615 00:51:36,010 --> 00:51:39,620 a vráti jeho hodnotu na tento jeden, potom je to len tak, aby sa ihneď vrátiť 616 00:51:39,620 --> 00:51:41,350 a vráti jeho hodnotu na tento jeden. 617 00:51:41,350 --> 00:51:45,350 Takže šetríte to objavovať všetky tieto veci preč zásobníka 618 00:51:45,350 --> 00:51:48,730 pretože vrátená hodnota je len tak, aby sa preniesla celú cestu späť rovnako. 619 00:51:48,730 --> 00:51:55,400 Tak prečo nie len vymeniť náš argument s aktualizovaným argumentu a začať znovu? 620 00:51:57,460 --> 00:52:01,150 Ak funkcia nie je chvost rekurzívny, ak robíte niečo ako - 621 00:52:01,150 --> 00:52:07,530 [Študent], pokiaľ bar (x + 1). Jo >>. 622 00:52:07,530 --> 00:52:11,770 >> Takže ak ste to v stave, potom robíte niečo s návratovú hodnotu. 623 00:52:11,770 --> 00:52:16,260 Alebo aj keď ste práve urobiť návrat 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Takže teraz bar (x - 1) musí vrátiť, aby sa pre výpočet 2 krát, že hodnoty, 625 00:52:23,560 --> 00:52:26,140 takže teraz to potrebujú svoj samostatný zásobník rám, 626 00:52:26,140 --> 00:52:31,180 a teraz, bez ohľadu na to, ako veľmi sa snažíš, budete musieť - 627 00:52:31,180 --> 00:52:34,410 To nie je chvost rekurzívne. 628 00:52:34,410 --> 00:52:37,590 [Študent] Chcel som skúsiť priviesť rekurziu usilovať o koncovej rekurzia - 629 00:52:37,590 --> 00:52:41,450 [Bowden] V ideálnom svete, ale v CS50 nemusíte sa. 630 00:52:43,780 --> 00:52:49,280 S cieľom získať rekurzia chvosta, všeobecne, môžete nastaviť ďalší argument 631 00:52:49,280 --> 00:52:53,550 kde bar bude mať int x do y 632 00:52:53,550 --> 00:52:56,990 a y zodpovedá konečnému vec, ktorú chcete vrátiť. 633 00:52:56,990 --> 00:53:03,650 Takže potom budete vracať bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Takže je to len na vysokej úrovni, ako transformovať veci boli chvost rekurzívne. 635 00:53:09,810 --> 00:53:13,790 Ale navyše argument - 636 00:53:13,790 --> 00:53:17,410 A potom na konci, keď sa dostanete na základné prípad, stačí sa vrátiť y 637 00:53:17,410 --> 00:53:22,740 pretože ste sa hromadia po celú dobu návratovú hodnotu, ktorú chcete. 638 00:53:22,740 --> 00:53:27,280 Tak nejako si to robím iteratívne, ale pomocou rekurzívne volanie. 639 00:53:32,510 --> 00:53:34,900 Otázky? 640 00:53:34,900 --> 00:53:39,890 [Študent] Možno o ukazovateľ aritmetický, rovnako ako pri použití reťazca. Iste >>. 641 00:53:39,890 --> 00:53:43,610 Ukazovateľ aritmetika. 642 00:53:43,610 --> 00:53:48,440 Pri použití reťazcov je to ľahké, pretože reťazce sú char hviezdy, 643 00:53:48,440 --> 00:53:51,860 znaky sú navždy a vždy jeden byte, 644 00:53:51,860 --> 00:53:57,540 a tak ukazovateľ aritmetické je ekvivalentná k pravidelnému aritmetiky, keď máte čo do činenia s reťazcami. 645 00:53:57,540 --> 00:54:08,790 Povedzme, že char * s = "hello". 646 00:54:08,790 --> 00:54:11,430 Takže máme blok v pamäti. 647 00:54:19,490 --> 00:54:22,380 Treba 6 bajtov, pretože sa vždy potrebujete null terminátor. 648 00:54:22,380 --> 00:54:28,620 A char * s sa bude poukázať na začiatku tohto poľa. 649 00:54:28,620 --> 00:54:32,830 Takže s bodmi tam. 650 00:54:32,830 --> 00:54:36,710 Teraz, to je v podstate, ako každý pole funguje, 651 00:54:36,710 --> 00:54:40,780 bez ohľadu na to, či bol návrat do malloc alebo či je to na zásobníku. 652 00:54:40,780 --> 00:54:47,110 Každá rada je v podstate ukazovateľ na začiatok poľa, 653 00:54:47,110 --> 00:54:53,640 a potom každý pole operácie, akékoľvek indexovanie, je len tak do tohto poľa určité vyrovnanie. 654 00:54:53,640 --> 00:55:05,360 >> Takže keď som povedal niečo ako s [3], čo bude s a počítanie 3 znaky a 655 00:55:05,360 --> 00:55:12,490 Tak s [3], máme 0, 1, 2, 3, takže s [3] sa bude vo vzťahu k tomuto l 656 00:55:12,490 --> 00:55:20,460 [Študent] A tak by sme mohli dosiahnuť rovnakú hodnotu tým, že robí S + 3 a potom zátvorky star? 657 00:55:20,460 --> 00:55:22,570 Áno. 658 00:55:22,570 --> 00:55:26,010 To je ekvivalentná * (s + 3); 659 00:55:26,010 --> 00:55:31,240 a že je navždy a vždy ekvivalentné bez ohľadu na to, čo robíte. 660 00:55:31,240 --> 00:55:34,070 Už nikdy nebudete musieť použiť držiak syntax. 661 00:55:34,070 --> 00:55:37,770 Môžete vždy použiť * (y + 3) syntax. 662 00:55:37,770 --> 00:55:40,180 Ľudia majú tendenciu rád držiaku syntax, hoci. 663 00:55:40,180 --> 00:55:43,860 [Študent] Takže všetky polia sú vlastne len ukazovatele. 664 00:55:43,860 --> 00:55:53,630 Tam je nepatrný rozdiel, keď poviem, int x [4]; >> [Študent] Znamená to, že vytvoriť pamäť? 665 00:55:53,630 --> 00:56:03,320 [Bowden] To bude vytvárať 4 ints vo fronte, tak 16 bytov celkovo. 666 00:56:03,320 --> 00:56:05,700 Bude to vytvoriť 16 bajtov na zásobníku. 667 00:56:05,700 --> 00:56:09,190 x nie je uložené kdekoľvek. 668 00:56:09,190 --> 00:56:13,420 Je to len symbol odkazuje na začiatku vec. 669 00:56:13,420 --> 00:56:17,680 Pretože ste vyhlásila, pole vnútri tejto funkcie, 670 00:56:17,680 --> 00:56:22,340 čo kompilátor urobí je len nahradiť všetky výskyty premennej x 671 00:56:22,340 --> 00:56:26,400 tam, kde sa to stalo zvoliť, aby týchto 16 bajtov. 672 00:56:26,400 --> 00:56:30,040 Je možné to urobiť s char * s, pretože s je skutočný ukazovateľ. 673 00:56:30,040 --> 00:56:32,380 Je zadarmo ku prejdite na iné veci. 674 00:56:32,380 --> 00:56:36,140 x je konštantná. Nemožno mať miesto na inom poli. >> [Študent] Dobre. 675 00:56:36,140 --> 00:56:43,420 Ale táto myšlienka, toto indexovanie, je rovnaká bez ohľadu na to, či je to tradičné pole 676 00:56:43,420 --> 00:56:48,230 alebo či je to ukazovateľ na niečo alebo či je to ukazovateľ na malloced poľa. 677 00:56:48,230 --> 00:56:59,770 A v skutočnosti, že je tak ekvivalentná, že je tiež jedno a to isté. 678 00:56:59,770 --> 00:57:05,440 Je to vlastne len znamená, čo je vo vnútri hranatých zátvoriek a to, čo zostalo z držiakov, 679 00:57:05,440 --> 00:57:07,970 je spočíta, a dereferences. 680 00:57:07,970 --> 00:57:14,710 Tak toto je rovnako platný ako * (y + 3), alebo s [3]. 681 00:57:16,210 --> 00:57:22,090 [Študent] Môžete mať ukazovatele ukazujúce na 2-rozmerné pole? 682 00:57:22,090 --> 00:57:27,380 >> Je to ťažšie. Tradične, no. 683 00:57:27,380 --> 00:57:34,720 2-rozmerné pole je len 1-rozmerné pole s nejakou pohodlnú syntax 684 00:57:34,720 --> 00:57:54,110 pretože keď poviem, int x [3] [3], je to naozaj len 1 pole s 9 hodnotami. 685 00:57:55,500 --> 00:58:03,000 A tak keď som index, kompilátor vie, čo mám na mysli. 686 00:58:03,000 --> 00:58:13,090 Keď poviem, že x [1] [2], že vie, že chcem ísť do druhej rady, takže to bude preskočiť prvé 3, 687 00:58:13,090 --> 00:58:17,460 a potom to chce druhý vec, takže to bude stáhni jeden. 688 00:58:17,460 --> 00:58:20,480 Ale je to stále len jedno-rozmerné pole. 689 00:58:20,480 --> 00:58:23,660 A tak keď som chcel priradiť ukazovateľ na danom poli, 690 00:58:23,660 --> 00:58:29,770 Povedal by som, že int * p = x; 691 00:58:29,770 --> 00:58:33,220 Typ x je len - 692 00:58:33,220 --> 00:58:38,280 Je to drsné hovoriť typ x, pretože je to len symbol, a to nie je skutočné premenné, 693 00:58:38,280 --> 00:58:40,140 ale je to len int *. 694 00:58:40,140 --> 00:58:44,840 x je len ukazovateľ na začiatok tohto. >> [Študent] Dobre. 695 00:58:44,840 --> 00:58:52,560 A tak nebudem mať prístup [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Myslím, že je zvláštne Syntax pre deklarovania ukazovatele, 697 00:58:58,370 --> 00:59:12,480 niečo smiešne ako int (* p [-. niečo úplne smiešne Ja ani neviem. 698 00:59:12,480 --> 00:59:17,090 Ale je tu Syntax pre deklarovania ukazovatele, ako so zátvorkami a vecí. 699 00:59:17,090 --> 00:59:22,960 Dokonca sa ani nemusí nechať urobiť. 700 00:59:22,960 --> 00:59:26,640 Som sa mohol pozrieť späť na niečo, čo by mi pravdu. 701 00:59:26,640 --> 00:59:34,160 Pozriem sa na to neskôr, ak je syntax pre bod. Ale nikdy nebudete vidieť. 702 00:59:34,160 --> 00:59:39,670 A dokonca aj syntax je tak archaický, že ak budete používať, budú ľudia zmätene. 703 00:59:39,670 --> 00:59:43,540 Viacrozmerné polia sú veľmi zriedkavé, ako to je. 704 00:59:43,540 --> 00:59:44,630 Ste celkom veľa - 705 00:59:44,630 --> 00:59:48,490 No, ak robíte veci, matice to nebude vzácne, 706 00:59:48,490 --> 00:59:56,730 ale v C budete len zriedka bude používať viacrozmerné polia. 707 00:59:57,630 --> 01:00:00,470 Jo. >> [Študent] Povedzme, že máte naozaj dlhú poľa. 708 01:00:00,470 --> 01:00:03,900 >> Takže vo virtuálnej pamäti, že sa zdá byť všetko po sebe idúcich, 709 01:00:03,900 --> 01:00:05,640 ako prvky priamo vedľa seba, 710 01:00:05,640 --> 01:00:08,770 ale vo fyzickom pamäti, že by bolo možné, že sa nie je možné deliť? Áno >>. 711 01:00:08,770 --> 01:00:16,860 Ako virtuálna pamäť funguje, je to len oddeľuje - 712 01:00:19,220 --> 01:00:24,860 Jednotka pridelenie je stránka, ktorá má tendenciu byť 4 KB, 713 01:00:24,860 --> 01:00:29,680 a tak keď proces hovorí, hej, ja chcem použiť túto pamäť, 714 01:00:29,680 --> 01:00:35,970 operačný systém bude pridelí mu 4 kB pre toho malého bloku pamäte. 715 01:00:35,970 --> 01:00:39,100 Dokonca aj keď si len použiť jeden malý byte v celom bloku pamäti, 716 01:00:39,100 --> 01:00:42,850 operačný systém sa bude dať mu plné 4 KB. 717 01:00:42,850 --> 01:00:49,410 Takže to, čo to znamená, je, že som mohol mať - povedzme, že to je moja stack. 718 01:00:49,410 --> 01:00:53,180 Tento zásobník môže byť oddelený. Môj stack môže byť megabajtov a megabajty. 719 01:00:53,180 --> 01:00:55,020 Môj stack môže byť obrovský. 720 01:00:55,020 --> 01:01:00,220 Ale stack sám má byť rozdelený do jednotlivých stránok, 721 01:01:00,220 --> 01:01:09,010 ktorá, ak sa pozrieme na tu povedzme, že to je naša RAM, 722 01:01:09,010 --> 01:01:16,600 keď mám 2 GB pamäte RAM, je to skutočná adresa 0 ako 0. byte môjho RAM, 723 01:01:16,600 --> 01:01:22,210 a to je 2 GB všetky tu dole. 724 01:01:22,210 --> 01:01:27,230 Takže táto stránka môže zodpovedať tomuto bloku sem. 725 01:01:27,230 --> 01:01:29,400 Táto stránka môže zodpovedať tomuto bloku sem. 726 01:01:29,400 --> 01:01:31,560 To by sa dalo odpovedať tento sem. 727 01:01:31,560 --> 01:01:35,540 Takže operačný systém je zadarmo priradiť fyzickej pamäte 728 01:01:35,540 --> 01:01:39,320 na jednotlivú stránku ľubovoľne. 729 01:01:39,320 --> 01:01:46,180 A to znamená, že ak sa táto hranica sa stane rozkročiť pole, 730 01:01:46,180 --> 01:01:50,070 poľa sa stane byť opustené to a právo tohto poradia stránky, 731 01:01:50,070 --> 01:01:54,460 potom toto pole sa bude rozdelená do fyzickej pamäte. 732 01:01:54,460 --> 01:01:59,280 A potom sa po ukončení programu, kedy proces skončí, 733 01:01:59,280 --> 01:02:05,690 Tieto mapovania sa vymažú a potom je to zadarmo využívať tieto malé bloky pre ostatné veci. 734 01:02:14,730 --> 01:02:17,410 Ďalšie otázky? 735 01:02:17,410 --> 01:02:19,960 [Študent] Ukazovateľ aritmetika. >> Ach jo. 736 01:02:19,960 --> 01:02:28,410 Reťazce bolo jednoduchšie, ale pri pohľade na niečo ako ints, 737 01:02:28,410 --> 01:02:35,000 tak späť do int x [4]; 738 01:02:35,000 --> 01:02:41,810 Či už je to pole, alebo či je to ukazovateľ na malloced pole celých čísel 4, 739 01:02:41,810 --> 01:02:47,060 to bude zaobchádzať rovnakým spôsobom. 740 01:02:50,590 --> 01:02:53,340 [Študent] Tak polia sú na halde? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Pole nie sú na halde. >> [Študent] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Tento typ poľa má tendenciu byť na zásobníku 743 01:03:08,320 --> 01:03:12,220 ak ste vyhlásil ju za - ignoruje globálne premenné. Nepoužívajte globálne premenné. 744 01:03:12,220 --> 01:03:16,280 Vnútri funkcie hovorím int x [4]; 745 01:03:16,280 --> 01:03:22,520 To bude vytvárať 4-celé číslo bloku na zásobníku pre toto pole. 746 01:03:22,520 --> 01:03:26,960 Ale to malloc (4 * sizeof (int)); sa chystá ísť na halde. 747 01:03:26,960 --> 01:03:31,870 Ale po tomto bode môžem použiť X a P v takmer rovnakým spôsobom, 748 01:03:31,870 --> 01:03:36,140 iné ako výnimiek, ktoré som povedal skôr, než o tom môžete priradiť ks. 749 01:03:36,140 --> 01:03:40,960 Technicky, ich veľkosti sú trochu odlišné, ale to je úplne irelevantné. 750 01:03:40,960 --> 01:03:43,310 Nikdy ste vlastne používajú svoje veľkosti. 751 01:03:48,020 --> 01:03:56,810 P Mohol by som povedať, p [3] = 2, alebo x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Môžete ich použiť v presne rovnakým spôsobom. 753 01:03:59,680 --> 01:04:01,570 Takže ukazovateľ aritmetika teraz - Áno. 754 01:04:01,570 --> 01:04:07,390 [Študent] Páči sa vám nemusel robiť p * ak máte držiaky? 755 01:04:07,390 --> 01:04:11,720 Konzoly sú implicitné dereferencia. Dobre >>. 756 01:04:11,720 --> 01:04:20,200 Vlastne, aj to, čo hovoríte, sa môžete dostať viacrozmerných polí 757 01:04:20,200 --> 01:05:02,650 s ukazovateľmi, čo môžete urobiť, je niečo ako, povedzme, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Ja si len napísať to všetko ako prvý. 759 01:05:37,880 --> 01:05:41,020 Nechcela som, že jeden. 760 01:05:41,020 --> 01:05:42,550 Dobre. 761 01:05:42,550 --> 01:05:48,910 Čo som urobil, je tu - To by malo byť pp [i]. 762 01:05:48,910 --> 01:05:53,680 Takže pp je ukazovateľ na ukazovateľ. 763 01:05:53,680 --> 01:06:02,420 Ste mallocing pb poukázať na pole 5 hviezdičiek int. 764 01:06:02,420 --> 01:06:10,950 Takže v pamäti máte na zásobníku pp 765 01:06:10,950 --> 01:06:20,150 Bude to poukázať na pole 5 blokov, ktoré sú všetko sami ukazovatele. 766 01:06:20,150 --> 01:06:28,210 A potom, keď som malloc tu dole, som malloc, že ​​každý z týchto jednotlivých ukazovateľov 767 01:06:28,210 --> 01:06:32,080 by mala smerovať na samostatnom bloku 4 bajtov na zhromaždení. 768 01:06:32,080 --> 01:06:35,870 Takže tento poukazuje na 4 bajty. 769 01:06:37,940 --> 01:06:40,660 A tento ukazuje na odlišný 4 bajty. 770 01:06:40,660 --> 01:06:43,200 >> A všetky z nich poukazujú na ich vlastné 4 byty. 771 01:06:43,200 --> 01:06:49,080 To mi dáva spôsob, ako robiť multidimenzionálne veci. 772 01:06:49,080 --> 01:06:58,030 Mohol by som povedať, pp [3] [4], ale teraz to nie je to isté ako multidimenzionálne pole 773 01:06:58,030 --> 01:07:05,390 pretože viacrozmerné pole je preložená [3] [4] do jedinej posun do poľa x. 774 01:07:05,390 --> 01:07:14,790 Tento dereferences p, pristupuje tretí index, potom dereferences, že 775 01:07:14,790 --> 01:07:20,790 a prístupy - 4 by neplatné - druhý index. 776 01:07:24,770 --> 01:07:31,430 Vzhľadom k tomu, kedy sme mali int x [3] [4] ako pred, tak viacrozmerné pole 777 01:07:31,430 --> 01:07:35,740 a pri poklepaní držiak je to naozaj len jeden dereferencia, 778 01:07:35,740 --> 01:07:40,490 ste po jedinej ukazovateľ a potom offset, 779 01:07:40,490 --> 01:07:42,850 je to naozaj 2D odkazy. 780 01:07:42,850 --> 01:07:45,840 Môžete sledovať 2 samostatné ukazovatele. 781 01:07:45,840 --> 01:07:50,420 Tak to aj technicky umožňuje mať multidimenzionálne poľa 782 01:07:50,420 --> 01:07:53,550 kde každý jednotlivec je pole rôzne veľkosti. 783 01:07:53,550 --> 01:07:58,000 Takže si myslím, zubaté viacrozmerných polí je to, čo sa volá 784 01:07:58,000 --> 01:08:01,870 pretože naozaj prvá vec, ktorú by mohol smerovať k niečomu, čo má 10 prvkov, 785 01:08:01,870 --> 01:08:05,540 Druhá vec by mohol smerovať k niečomu, čo má 100 prvkov. 786 01:08:05,540 --> 01:08:10,790 [Študent] Je nejaký limit na počet ukazovateľov môžete mať 787 01:08:10,790 --> 01:08:14,290 ukázal na iné ukazovatele? >> Nie 788 01:08:14,290 --> 01:08:17,010 Môžete mať int ***** v. 789 01:08:18,050 --> 01:08:23,760 Späť na ukazovateľ aritmetiky - >> [študentka] Oh. Jo >>. 790 01:08:23,760 --> 01:08:35,649 [Študent] Ak mám int *** p a potom som urobiť dereferencing a hovorím p * je rovná tejto hodnote, 791 01:08:35,649 --> 01:08:39,560 je to len bude robiť 1 úroveň dereferencing? Áno >>. 792 01:08:39,560 --> 01:08:43,340 Takže keď chcem získať prístup k veci, že posledný ukazovateľ ukazuje na - 793 01:08:43,340 --> 01:08:46,210 Potom si urobiť *** p Dobre >>. 794 01:08:46,210 --> 01:08:54,080 Tak toto je p poukazuje na 1 blok, poukazuje na iného bloku, poukazuje na iného bloku. 795 01:08:54,080 --> 01:09:02,010 Potom, ak to urobíte * p = niečo iné, potom meníte to 796 01:09:02,010 --> 01:09:13,640 Doteraz poukázať na iný blok. Dobre >>. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] A ak boli malloced, potom ste teraz unikli pamäte 798 01:09:17,649 --> 01:09:20,430 ak sa stalo, že majú rôzne odkazy na tieto 799 01:09:20,430 --> 01:09:25,270 pretože sa nemôžete dostať späť k tým tie, ktoré ste práve zahodil. 800 01:09:25,270 --> 01:09:29,550 Ukazovateľ aritmetika. 801 01:09:29,550 --> 01:09:36,310 int x [4], sa bude alokovať pole celých čísel 4 802 01:09:36,310 --> 01:09:40,670 kde x bude ukazovať na začiatku poľa. 803 01:09:40,670 --> 01:09:50,420 Takže keď som povedal niečo ako x [1], ja chcem, aby to znamená ísť do druhej celé číslo v poli, 804 01:09:50,420 --> 01:09:53,319 ktorý by bol tento. 805 01:09:53,319 --> 01:10:04,190 Ale naozaj, to je 4 bytov do poľa, pretože to číslo zaberá 4 bajty. 806 01:10:04,190 --> 01:10:08,470 Takže posun 1 naozaj znamená posun 1 807 01:10:08,470 --> 01:10:12,030 krát väčšie ako bez ohľadu na typ poľa je. 808 01:10:12,030 --> 01:10:17,170 To je pole celých čísel, takže vie, ako urobiť 1 krát veľkosť int, keď sa chce vyrovnať. 809 01:10:17,170 --> 01:10:25,260 Iné syntaxe. Pamätajte si, že to je ekvivalentná * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Keď poviem, že kurzora + 1, čo to vracia je adresa ukazovateľ je ukladanie 811 01:10:35,250 --> 01:10:40,360 plus 1 krát väčšiu typu ukazovateľ. 812 01:10:40,360 --> 01:10:59,510 Takže ak x = ox100, potom x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 A môžete zneužívajú a povie niečo ako char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 a teraz c bude rovnaká adresa ako x. 815 01:11:23,050 --> 01:11:26,040 c bude rovná ox100, 816 01:11:26,040 --> 01:11:31,490 ale c + 1 bude rovná ox101 817 01:11:31,490 --> 01:11:38,030 od ukazovateľ aritmetický závisí od typu ukazovatele, ktoré sú pridané k 818 01:11:38,030 --> 01:11:45,390 Takže c + 1, to vyzerá na c, je to char ukazovateľ, takže to bude pridať 1 krát veľkosť char, 819 01:11:45,390 --> 01:11:48,110 , Ktorá sa vždy bude 1, takže budete mať 101, 820 01:11:48,110 --> 01:11:54,890 vzhľadom k tomu, keď to urobím x, ktorá je tiež stále 100, x + 1 bude 104. 821 01:11:56,660 --> 01:12:06,340 [Študent] Môžete použiť c + +, aby sa pokročilo ukazovateľ o 1? 822 01:12:06,340 --> 01:12:09,810 Áno, môžete. 823 01:12:09,810 --> 01:12:16,180 Môžete to urobiť s x, pretože x je len symbol, je to konštanta, nemôžete zmeniť x. 824 01:12:16,180 --> 01:12:22,610 >> Ale c sa stane byť len ukazovateľ, takže c + + je dokonale platné, a to bude zvyšovať o 1. 825 01:12:22,610 --> 01:12:32,440 Ak je c bolo len int *, potom c + + by sa 104. 826 01:12:32,440 --> 01:12:41,250 + + So ukazovateľ aritmetický rovnako ako c + 1 by mal urobiť ukazovateľ aritmetiku. 827 01:12:43,000 --> 01:12:48,870 To je vlastne, ako veľa vecí, ako je druh korešpondencie - 828 01:12:49,670 --> 01:12:55,710 Namiesto vytvárania kópií vecí, môžete namiesto toho prejsť - 829 01:12:55,710 --> 01:13:02,400 Rovnako ako keď som chcel, aby túto polovicu poľa - nechajte sa vymazať niečo z toho. 830 01:13:04,770 --> 01:13:10,520 Povedzme, že som chcel, aby túto stranu poľa do funkcie. 831 01:13:10,520 --> 01:13:12,700 Čo by som prejsť na túto funkciu? 832 01:13:12,700 --> 01:13:17,050 Ak prejdem x, som absolvovaní adresu. 833 01:13:17,050 --> 01:13:23,780 Ale ja chcem, aby túto konkrétnu adresu. Tak čo by som mal prejsť? 834 01:13:23,780 --> 01:13:26,590 [Študent] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Tak x + 2. Áno. 836 01:13:29,350 --> 01:13:31,620 To ich bude táto adresa. 837 01:13:31,620 --> 01:13:42,810 Budete tiež veľmi často vidí to ako x [2], a potom adresu toho. 838 01:13:42,810 --> 01:13:47,850 Takže budete musieť vziať adresu, pretože držiak je implicitná dereferencia. 839 01:13:47,850 --> 01:13:53,250 x [2] sa vzťahuje na hodnotu, ktorá je v tomto poli, a potom sa má adresu tohto poľa, 840 01:13:53,250 --> 01:13:56,850 takže hovoríte & x [2]. 841 01:13:56,850 --> 01:14:02,880 Tak to je, ako sa niečo v druhu korešpondencie, kde chcete odovzdať polovicu zoznamu k niečomu 842 01:14:02,880 --> 01:14:08,790 naozaj len prejsť a x [2], a teraz až rekurzívne volanie sa týka, 843 01:14:08,790 --> 01:14:12,510 moje nové pole začína tam. 844 01:14:12,510 --> 01:14:15,130 Last minute otázky. 845 01:14:15,130 --> 01:14:20,050 [Študent] Ak sa nám nepodarí dať ampersand alebo - čo je to volá? >> Star? 846 01:14:20,050 --> 01:14:23,200 [Študent] Star. Technicky >>, dereferencia operátor, ale - >> [študentka] dereferencia. 847 01:14:23,200 --> 01:14:29,310 >> Ak nemáme dať hviezdu alebo ampersand, čo sa stane, keď som len povedať, y = x, a x je ukazovateľ? 848 01:14:29,310 --> 01:14:34,620 Aký je typ y? >> [Študent] Ja si len povedať, že je ukazovateľ 2. 849 01:14:34,620 --> 01:14:38,270 Takže ak ste práve povedal y = x, x a y teraz ukazujú na rovnakú vec. >> [Študent] Bod na rovnakú vec. 850 01:14:38,270 --> 01:14:45,180 A ak je x int ukazovateľ? >> To by si sťažovať, že nie je možné priradiť ukazovatele. 851 01:14:45,180 --> 01:14:46,540 [Študent] Dobre. 852 01:14:46,540 --> 01:14:51,860 Pamätajte si, že ukazovatele, aj keď sme kresliť ako šípy, 853 01:14:51,860 --> 01:15:02,010 Naozaj všetko, čo store - int * x - naozaj všetko x je ukladanie je niečo ako ox100, 854 01:15:02,010 --> 01:15:06,490 ktorý sa stane reprezentovať ako smerujúca k bloku uložené na 100. 855 01:15:06,490 --> 01:15:19,660 Takže keď hovorím int * y = x; som len kopírovanie ox100 do y, 856 01:15:19,660 --> 01:15:24,630 ktoré sme práve bude reprezentovať ako y, tiež ukázal na ox100. 857 01:15:24,630 --> 01:15:39,810 A keď poviem, int i = (int) x, potom aj sa chystá uložiť bez ohľadu na hodnotu ox100 je 858 01:15:39,810 --> 01:15:45,100 vnútri nej, ale teraz to bude vykladať ako celé číslo namiesto ukazovatele. 859 01:15:45,100 --> 01:15:49,310 Ale budete potrebovať sadru, alebo inde to bude sťažovať. 860 01:15:49,310 --> 01:15:53,300 [Študent] Tak to ste na mysli cast - 861 01:15:53,300 --> 01:16:00,290 Je to bude obsadenie int X aj liatie int na y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Čo? 863 01:16:03,700 --> 01:16:07,690 [Študent] Dobre. Po týchto zátvorkách je tam bude x, alebo ay tam? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Buď. x a y sú rovnocenné. >> [Študent] Dobre. 865 01:16:11,500 --> 01:16:14,390 Vzhľadom k tomu, že sú obaja ukazovatele. Jo >>. 866 01:16:14,390 --> 01:16:21,050 [Študent] Tak to by uložiť hexadecimálne 100 v celej číslo forme? >> [Bowden] Jo. 867 01:16:21,050 --> 01:16:23,620 Ale nie hodnota bez ohľadu na to odkazuje. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Jo. >> [Študent] Takže len adresa vo forme celého čísla. Dobre. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Ak by ste chceli z nejakého dôvodu bizarné, 870 01:16:34,720 --> 01:16:38,900 môžete zaoberať výhradne s ukazovateľmi a nikdy riešiť s celými číslami 871 01:16:38,900 --> 01:16:49,240 a proste byť ako int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Potom budete si naozaj zmätený, akonáhle ukazovateľ aritmetický začne deje. 873 01:16:53,000 --> 01:16:56,570 Takže čísla, ktoré ukladajú, sú nezmyselné. 874 01:16:56,570 --> 01:16:58,940 Je to len, ako ste skončili ich výklad. 875 01:16:58,940 --> 01:17:02,920 Takže som voľne kopírovať ox100 z int * na int, 876 01:17:02,920 --> 01:17:07,790 a ja som voľný priradiť - Si pravdepodobne bude dostať kričal na dobu odlievanie - 877 01:17:07,790 --> 01:17:18,160 Som voľná priradiť niečo ako (int *) ox1234 do tejto svojvoľné int *. 878 01:17:18,160 --> 01:17:25,480 Takže ox123 je rovnako platná adresa pamäte, ako je & y. 879 01:17:25,480 --> 01:17:32,060 A y sa stane vrátiť niečo, čo je celkom veľa ox123. 880 01:17:32,060 --> 01:17:35,430 [Študent] Bolo by to naozaj cool spôsob, ako ísť z šestnástkovej do desiatkovej podobe, 881 01:17:35,430 --> 01:17:39,230 ako keď máte ukazovateľ a obsadil ju ako int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Môžete naozaj len tlačiť pomocou ako printf. 883 01:17:44,860 --> 01:17:50,300 Povedzme, že mám int y = 100. 884 01:17:50,300 --> 01:18:02,700 Takže printf (% d \ n - ako by ste mali už viete - tlač, že ako celočíselné,% x. 885 01:18:02,700 --> 01:18:05,190 Budeme len vytlačiť ju ako hexadecimálne. 886 01:18:05,190 --> 01:18:10,760 Takže ukazovateľ nie je uložená ako hexadecimálne, 887 01:18:10,760 --> 01:18:12,960 a číslo nie je uložené ako desatinné. 888 01:18:12,960 --> 01:18:14,700 Všetko je uložené ako binárny. 889 01:18:14,700 --> 01:18:17,950 Je to len, že máme tendenciu ukázať ukazovatele ako hexadecimálne 890 01:18:17,950 --> 01:18:23,260 pretože si myslíme, že veci v týchto 4-byte blokoch, 891 01:18:23,260 --> 01:18:25,390 a pamäťové adresy majú tendenciu, aby sa zoznámili. 892 01:18:25,390 --> 01:18:28,890 My sme ako, keď začne s bf, potom sa stane, že je v zásobníku. 893 01:18:28,890 --> 01:18:35,560 Takže je to len naša interpretácia ukazovateľov ako hexadecimálne. 894 01:18:35,560 --> 01:18:39,200 Dobre. Nejaká posledné otázky? 895 01:18:39,200 --> 01:18:41,700 >> Budem tu na chvíľu po, ak máte niečo iné. 896 01:18:41,700 --> 01:18:46,070 A to je koniec, že. 897 01:18:46,070 --> 01:18:48,360 >> [Študent] Yay! [Potlesk] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]