1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Oddelek 4 - Več Udobna] 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 Imamo kviz jutri, v primeru, da vi ne veste. 5 00:00:14,810 --> 00:00:20,970 To je v bistvu za vse, kar ste lahko videli v razredu ali bi se morali videti v razredu. 6 00:00:20,970 --> 00:00:26,360 To vključuje kazalce, čeprav je to zelo opravljena temo. 7 00:00:26,360 --> 00:00:29,860 Morate razumeti, vsaj na visoko stopnjo njih. 8 00:00:29,860 --> 00:00:34,760 Vse, kar je več kot v razredu, morate razumeti, za kviz. 9 00:00:34,760 --> 00:00:37,320 Torej, če imate vprašanja o njih, jih lahko vprašam. 10 00:00:37,320 --> 00:00:43,280 Toda to se bo zelo študent pod vodstvom zasedanje, kjer fantje postavljajo vprašanja, 11 00:00:43,280 --> 00:00:45,060 zato upajmo, da imajo ljudje na vprašanja. 12 00:00:45,060 --> 00:00:48,020 Ima kdo kakšno vprašanje? 13 00:00:49,770 --> 00:00:52,090 Da. >> [Študent] Lahko greste čez kazalci še enkrat? 14 00:00:52,090 --> 00:00:54,350 Jaz bom šel čez kazalca. 15 00:00:54,350 --> 00:00:59,180 Vse vaše spremenljivk nujno živi v spominu, 16 00:00:59,180 --> 00:01:04,450 vendar običajno vam ni treba skrbeti, da in si rekel + 2 x in y + 3 17 00:01:04,450 --> 00:01:07,080 in bo prevajalnik ugotoviti, kje so stvari, ki živijo za vas. 18 00:01:07,080 --> 00:01:12,990 Ko imate opravka s kazalci, zdaj ste jasno uporabo teh pomnilniških naslovov. 19 00:01:12,990 --> 00:01:19,800 Tako bo ena spremenljivka samo kdaj živel na en naslov v danem trenutku. 20 00:01:19,800 --> 00:01:24,040 Če želimo, da razglasi kazalec, kaj je tip bo izgledal? 21 00:01:24,040 --> 00:01:26,210 >> Želim, da razglasi, da je kazalec p. Kaj tip izgleda? 22 00:01:26,210 --> 00:01:33,530 [Študent] int * p. >> Ja. Torej, int * p. 23 00:01:33,530 --> 00:01:38,030 In kako bi bilo opozoriti, da x? >> [Študent] Znak za. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Torej je znak pove dobesedno imenuje naslov izvajalca. 25 00:01:45,300 --> 00:01:50,460 Torej, ko sem rekel in x je pridobivanje pomnilniški naslov spremenljivke x. 26 00:01:50,460 --> 00:01:56,790 Torej, zdaj imam kazalec p, in nikjer v moji kodo lahko uporabite P * 27 00:01:56,790 --> 00:02:02,960 ali bi mi x in bo točno isto stvar. 28 00:02:02,960 --> 00:02:09,520 (* P). Kaj je to delaš? Kaj to pomeni, zvezda? 29 00:02:09,520 --> 00:02:13,120 [Študent] To pomeni vrednost, na tej točki. >> Ja. 30 00:02:13,120 --> 00:02:17,590 Torej, če gledamo na to, je lahko zelo koristno, če bi bile povzete diagramov 31 00:02:17,590 --> 00:02:22,230 če je to malo polje pomnilnika za x, ki se zgodi, da ima vrednost 4, 32 00:02:22,230 --> 00:02:25,980 potem imamo majhno škatlo pomnilnika za p, 33 00:02:25,980 --> 00:02:31,590 in tako p kaže na x, tako da potegnemo puščico od p do x. 34 00:02:31,590 --> 00:02:40,270 Torej, ko rečemo, * p mi praviš iti na polje, ki je str. 35 00:02:40,270 --> 00:02:46,480 Star je slediti puščico in potem kar hočeš s tem polju tam. 36 00:02:46,480 --> 00:03:01,090 Torej lahko rečem, * p = 7, in da bo šel na polje, ki je x in spremembe, ki na 7 dni. 37 00:03:01,090 --> 00:03:13,540 Ali pa bi lahko rekel, int z = * p * 2; To je zavajajoče, saj je zvezda, zvezda. 38 00:03:13,540 --> 00:03:19,230 Tista zvezda je Dereferenciranje strani, druga zvezda pomnoži z 2. 39 00:03:19,230 --> 00:03:26,780 Obvestilo Lahko bi prav tako dobro nadomesti P * s x. 40 00:03:26,780 --> 00:03:29,430 Uporabite jih lahko na enak način. 41 00:03:29,430 --> 00:03:38,000 In potem lahko kasneje Imam p kažejo na popolnoma novo stvar. 42 00:03:38,000 --> 00:03:42,190 Lahko samo rečem, p = &z; 43 00:03:42,190 --> 00:03:44,940 Torej, zdaj p nima več točk, na X, to kaže na z. 44 00:03:44,940 --> 00:03:50,510 In kadar koli sem naredil * p je to isto, kot počne z. 45 00:03:50,510 --> 00:03:56,170 Torej uporabna stvar pri tem je, ko smo začeli že v funkcijah. 46 00:03:56,170 --> 00:03:59,790 >> To je nekako nesmiselno razglasi kazalec, ki kaže na nekaj 47 00:03:59,790 --> 00:04:03,140 in potem ste pravkar Dereferenciranje 48 00:04:03,140 --> 00:04:06,060 ko bi lahko uporabili prvotno spremenljivko na začetku. 49 00:04:06,060 --> 00:04:18,190 Ampak ko prideš v funkcije - tako recimo, da so nekatere funkcije, int foo, 50 00:04:18,190 --> 00:04:32,810 da se kazalec in tako ne * p = 6; 51 00:04:32,810 --> 00:04:39,990 Kot smo videli prej z zamenjavo, ne moreš učinkovito zamenjavo in ločeno funkcijo 52 00:04:39,990 --> 00:04:45,180 z gredo samo cela, ker je vse v C je vedno mimo vrednosti. 53 00:04:45,180 --> 00:04:48,360 Tudi, ko si mimo napotke ste mimo vrednosti. 54 00:04:48,360 --> 00:04:51,940 Samo tako se zgodi, da te vrednote pomnilniških naslovov. 55 00:04:51,940 --> 00:05:00,770 Torej, ko sem rekel, foo (p); sem mimo kazalec na funkcijo foo 56 00:05:00,770 --> 00:05:03,910 in potem foo počne * p = 6; 57 00:05:03,910 --> 00:05:08,600 Tako znotraj te funkcije, * p je še vedno enaka x, 58 00:05:08,600 --> 00:05:12,720 vendar ne morem uporabljati x znotraj te funkcije, ker to ni zajeta v tej funkciji. 59 00:05:12,720 --> 00:05:19,510 Torej, * p = 6, je edini način, da lahko dostopajo do lokalnega spremenljivko druge funkcije. 60 00:05:19,510 --> 00:05:23,600 Ali pa, no, kazalci so edini način, da lahko dostopajo do lokalnega spremenljivko druge funkcije. 61 00:05:23,600 --> 00:05:31,600 [Študent] Recimo, da si je želel, da se vrnete kazalec. Kako točno si to naredil? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Nazaj na kazalec, kot nekaj takega int y = 3, vračanje in y? >> [Študent] Ja. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Ok. Nikoli ne bi smeli storiti. To je slabo. 64 00:05:48,480 --> 00:05:59,480 Mislim, da sem videl v teh predavanje diapozitivih boste začeli videti vso to shemo spomina 65 00:05:59,480 --> 00:06:02,880 če tu imaš naslov pomnilnika 0 66 00:06:02,880 --> 00:06:09,550 in tukaj imaš naslov pomnilnika 4 nastopov ali 2 k 32. 67 00:06:09,550 --> 00:06:15,120 Torej imaš nekaj stvari in nekaj stvari in potem imate kup 68 00:06:15,120 --> 00:06:21,780 in imaš svoj kup, ki ste ga pravkar začeli učenje o odraščanju. 69 00:06:21,780 --> 00:06:24,390 [Študent] Ni kup nad kup? 70 00:06:24,390 --> 00:06:27,760 >> Ja. Kup na vrhu, a ne? >> [Študent] No, je dal 0 na vrhu. 71 00:06:27,760 --> 00:06:30,320 [Študent] Oh, je dal 0 na vrhu. >> [Študent] V redu. 72 00:06:30,320 --> 00:06:36,060 Opozorilo: Kjerkoli s CS50 boste videli, da na ta način. >> [Študent] Ok. 73 00:06:36,060 --> 00:06:40,290 To je samo, da ko ste prvič videla kupe, 74 00:06:40,290 --> 00:06:45,000 kot takrat, ko misliš, da kup si misliš zlaganje stvari na vrhu med seboj. 75 00:06:45,000 --> 00:06:50,810 Tako smo nagnjeni k flip to približno tako sklad je odraščanje kot kup ponavadi 76 00:06:50,810 --> 00:06:55,940 namesto žetonov visi dol. >> [Študent] ne kupi tehnično zrastejo preveč, kajne? 77 00:06:55,940 --> 00:07:01,100 To je odvisno od tega, kaj misliš s odrasti. 78 00:07:01,100 --> 00:07:04,010 Stack in kup vedno rastejo v nasprotnih smereh. 79 00:07:04,010 --> 00:07:09,420 Sveženj je vedno odrašča v smislu, da je odraščanje 80 00:07:09,420 --> 00:07:12,940 v smeri večje pomnilniške naslove in kopičijo raste navzdol 81 00:07:12,940 --> 00:07:17,260 v tem, da raste proti nižjim naslovov pomnilnika. 82 00:07:17,260 --> 00:07:20,250 Torej, na vrhu je 0 in dno je visoko pomnilniške naslove. 83 00:07:20,250 --> 00:07:26,390 Oni so tako narašča, le v nasprotni smeri. 84 00:07:26,390 --> 00:07:29,230 [Študent] sem samo pomenilo, da zato, ker si rekel, da si dal kup na dnu 85 00:07:29,230 --> 00:07:33,640 ker se zdi bolj intuitivna, saj za sklad za začetek na vrhu kupa, 86 00:07:33,640 --> 00:07:37,520 Kup je na vrhu samo po sebi preveč, tako da that - >> Ja. 87 00:07:37,520 --> 00:07:44,960 Prav tako mislim na kup, kot odraščanje in večje, vendar stack toliko bolj. 88 00:07:44,960 --> 00:07:50,280 Torej je sklad je tisti, ki smo nekako želim pokazati odraščanja. 89 00:07:50,280 --> 00:07:55,390 Toda povsod izgledaš drugače bo pokazal naslov 0 na vrh 90 00:07:55,390 --> 00:07:59,590 in najvišji pomnilniški naslov na dnu, tako da je to vaš običajni pogled pomnilnika. 91 00:07:59,590 --> 00:08:02,100 >> Imate vprašanje? 92 00:08:02,100 --> 00:08:04,270 [Študent] Lahko poveste kaj več o tem kup? 93 00:08:04,270 --> 00:08:06,180 Ja. Jaz bom tisti, ki v sekundi. 94 00:08:06,180 --> 00:08:12,220 Prvič, gre nazaj, zakaj vrnitev & Y je slabo, 95 00:08:12,220 --> 00:08:18,470 na stack imate kup dimnika okvirjev, ki predstavljajo vse funkcije 96 00:08:18,470 --> 00:08:20,460 , ki so bili imenovani. 97 00:08:20,460 --> 00:08:27,990 Torej, brez upoštevanja prejšnje stvari, na vrhu vaših žetonov je vedno tekoč, da je glavna funkcija 98 00:08:27,990 --> 00:08:33,090 saj to je prva naloga, da se reče. 99 00:08:33,090 --> 00:08:37,130 In potem, ko pokličete drugo funkcijo, sklad se bo rast navzdol. 100 00:08:37,130 --> 00:08:41,640 Torej, če sem poklical nekatere funkcije, foo, in dobi svojo žetonov okvir, 101 00:08:41,640 --> 00:08:47,280 lahko pokličete nekatere funkcije, bar, da dobi svojo dimnika okvirja. 102 00:08:47,280 --> 00:08:49,840 In bi bilo rekurzivni bar in bi se zahtevajo, 103 00:08:49,840 --> 00:08:54,150 in da drugi razpis za baru bo dobil svoj okvir žetonov. 104 00:08:54,150 --> 00:08:58,880 In kaj se dogaja v teh odvodnikom okvirjev so vse lokalne spremenljivke 105 00:08:58,880 --> 00:09:03,450 in vse funkcije, ki argumentov - 106 00:09:03,450 --> 00:09:08,730 Vse stvari, ki so lokalno zajeta v tej funkciji gre v teh okvirih dimnika. 107 00:09:08,730 --> 00:09:21,520 Torej to pomeni, da ko sem rekel kaj takega bara, je funkcija, 108 00:09:21,520 --> 00:09:29,270 Grem prijaviti celo število in se nato vrne kazalec na tem celo število. 109 00:09:29,270 --> 00:09:33,790 Torej, če ne y živi? 110 00:09:33,790 --> 00:09:36,900 [Študent] y živi v baru. >> [Bowden] Ja. 111 00:09:36,900 --> 00:09:45,010 Nekje v tem malem trgu v spomin je kvadrat Littler, ki ima y v njem. 112 00:09:45,010 --> 00:09:53,370 Ko sem se vrnil in y, bom vrnil kazalec na tej mali blok pomnilnika. 113 00:09:53,370 --> 00:09:58,400 Toda potem, ko je funkcija vrne, dobi njegov kup okvir odbil sklada. 114 00:10:01,050 --> 00:10:03,530 In zato se imenuje sklad. 115 00:10:03,530 --> 00:10:06,570 To je kot struktura dimnika podatkov, če veste, kaj to je. 116 00:10:06,570 --> 00:10:11,580 Ali celo kot kup plošč je vedno primer, 117 00:10:11,580 --> 00:10:16,060 Glavno, da bo šel na dnu, potem je prva funkcija praviš, da bo šel na vrhu, da 118 00:10:16,060 --> 00:10:20,400 in ne moreš priti nazaj na glavno, da se vrnete iz vseh funkcij, ki so bile imenovane 119 00:10:20,400 --> 00:10:22,340 , ki so bili dani na vrhu. 120 00:10:22,340 --> 00:10:28,650 >> [Študent] Torej, če si ne vrne in y, da je ta vrednost se lahko spremenijo brez predhodnega obvestila. 121 00:10:28,650 --> 00:10:31,290 Da, it's - >> [Študent] To bi lahko bila prepisana. >> Ja. 122 00:10:31,290 --> 00:10:34,660 To je popolnoma - Če ste poskusili - 123 00:10:34,660 --> 00:10:38,040 To bi bilo tudi int bar *, saj vrača kazalec, 124 00:10:38,040 --> 00:10:41,310 zato njeno vrnitev tip int *. 125 00:10:41,310 --> 00:10:46,500 Če poskusite uporabiti vrnjeno vrednost te funkcije, je nedefiniran vedenje 126 00:10:46,500 --> 00:10:51,770 ker je ta kazalec kaže na slab spomin. >> [Študent] Ok. 127 00:10:51,770 --> 00:11:01,250 Pa kaj, če, na primer, boste prijavljeni int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 To je že bolje. Da. 129 00:11:03,740 --> 00:11:07,730 [Študent] smo se pogovarjali o tem, kako, ko smo vleči stvari na naš koš 130 00:11:07,730 --> 00:11:11,750 oni dejansko ne izbrišejo, temveč samo izgubili kazalca. 131 00:11:11,750 --> 00:11:15,550 Torej, v tem primeru bomo izbrisali dejansko vrednost ali pa je še vedno tam v spomin? 132 00:11:15,550 --> 00:11:19,130 Za večino del, to bo še vedno tam. 133 00:11:19,130 --> 00:11:24,220 Ampak recimo, da se zgodi, da pokličete kakšno drugo funkcijo, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz bo dobil svoj okvir žetonov tukaj. 135 00:11:28,990 --> 00:11:31,470 To se dogaja, da se prepiše vse te stvari, 136 00:11:31,470 --> 00:11:34,180 in potem, če poskusite pozneje in uporabite kazalec, da imaš pred 137 00:11:34,180 --> 00:11:35,570 to ne bo enako vrednost. 138 00:11:35,570 --> 00:11:38,150 To se dogaja, da so pravkar spremenila, ker ste poklicali funkcijo BAZ. 139 00:11:38,150 --> 00:11:43,080 [Študent] Ampak nismo, bi še vedno dobil 3? 140 00:11:43,080 --> 00:11:44,990 [Bowden] Po vsej verjetnosti bi. 141 00:11:44,990 --> 00:11:49,670 Ampak ti ne more sklicevati na to. C samo pravi undefined vedenje. 142 00:11:49,670 --> 00:11:51,920 >> [Študent] Oh, ne. Ok. 143 00:11:51,920 --> 00:11:58,190 Torej, če želite, da se vrnete kazalec, to je, če pride malloc v uporabi. 144 00:12:00,930 --> 00:12:15,960 Jaz sem pravzaprav pisati samo vrnitev malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Šli bomo čez knjižnične funkcije malloc bolj v drugo, vendar je zamisel o knjižnične funkcije malloc je vse vaše lokalne spremenljivke 146 00:12:24,050 --> 00:12:26,760 Vedno gredo na stack. 147 00:12:26,760 --> 00:12:31,570 Vse, kar je malloced gre na kup in bo vedno in vedno na kupu 148 00:12:31,570 --> 00:12:34,490 dokler ga izrecno sprostiti. 149 00:12:34,490 --> 00:12:42,130 Torej to pomeni, da ko malloc kaj pa se dogaja, da preživijo po Funkcija vrne. 150 00:12:42,130 --> 00:12:46,800 [Študent] Bo preživel po program ne deluje? Ne >> 151 00:12:46,800 --> 00:12:53,180 Ok, tako da bo tam do programa, je pa vse opravljeno vožnjo. >> Da. 152 00:12:53,180 --> 00:12:57,510 Lahko gremo v podrobnosti o tem, kaj se zgodi, če program ne deluje. 153 00:12:57,510 --> 00:13:02,150 Morda boste morali, da se spomnim, ampak to je stvar popolnoma ločena. 154 00:13:02,150 --> 00:13:04,190 [Študent] Torej malloc ustvari kazalec? >> Ja. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [Študent] Mislim, da malloc označuje blok pomnilnika, ki jih lahko uporabite kazalec. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Hočem, da diagram znova. >> [Študent] Torej ta funkcija deluje, čeprav? 157 00:13:19,610 --> 00:13:26,430 [Študent] Ja, malloc označuje blok pomnilnika, ki ga lahko uporabite, 158 00:13:26,430 --> 00:13:30,470 in potem se vrne naslov prvega bloka te spomin. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Ja. Torej, ko malloc, da ste oprijemalne nekaj blok pomnilnika 160 00:13:36,750 --> 00:13:38,260 , ki je trenutno v kup. 161 00:13:38,260 --> 00:13:43,040 Če kup premajhen, nato kup je le, da bo raste in raste v tej smeri. 162 00:13:43,040 --> 00:13:44,650 Torej, recimo kup premajhen. 163 00:13:44,650 --> 00:13:49,960 Potem gre naprej raste malo in vrne kazalec na tem polju, da samo rasla. 164 00:13:49,960 --> 00:13:55,130 Ko free stuff, delaš več prostora v kup, 165 00:13:55,130 --> 00:14:00,030 tako da potem kasneje poklicati knjižnične funkcije malloc lahko ponovno ta pomnilnik, ki so ga pred tem sprostila. 166 00:14:00,030 --> 00:14:09,950 Pomembna knjižnične funkcije malloc in brezplačnim je, da vam omogoča popoln nadzor 167 00:14:09,950 --> 00:14:12,700 v obdobju trajanja teh spominskih blokov. 168 00:14:12,700 --> 00:14:15,420 Globalne spremenljivke so vedno živ. 169 00:14:15,420 --> 00:14:18,500 Lokalne spremenljivke so živi v njihov obseg. 170 00:14:18,500 --> 00:14:22,140 Takoj, ko greš mimo oklepaja kodrasti, lokalne spremenljivke so mrtvi. 171 00:14:22,140 --> 00:14:28,890 Malloced spomin živ, če želite, da je živ 172 00:14:28,890 --> 00:14:33,480 in se nato sprosti, ko vam povem, da se sprostijo. 173 00:14:33,480 --> 00:14:38,420 Tisti, ki so dejansko samo 3 vrste pomnilnika, res. 174 00:14:38,420 --> 00:14:41,840 Tam je avtomatsko upravljanje s pomnilnikom, ki je kup. 175 00:14:41,840 --> 00:14:43,840 Stvari se dogajajo za vas samodejno. 176 00:14:43,840 --> 00:14:46,910 Ko rečeš int x, je dodelitev pomnilnika za int x. 177 00:14:46,910 --> 00:14:51,630 Ko gre x zunaj obsega, je spomin za predelane x. 178 00:14:51,630 --> 00:14:54,790 Potem je tu še dinamično upravljanje s pomnilnikom, ki je, kar je malloc, 179 00:14:54,790 --> 00:14:56,740 ki je, ko imaš nadzor. 180 00:14:56,740 --> 00:15:01,290 Ti dinamično odločila, kdaj naj spomin in ne bi bila dodeljena. 181 00:15:01,290 --> 00:15:05,050 In potem je statična, kar samo pomeni, da je življenje večno, 182 00:15:05,050 --> 00:15:06,610 , ki je tisto, kar globalne spremenljivke. 183 00:15:06,610 --> 00:15:10,240 Oni so samo vedno v spominu. 184 00:15:10,960 --> 00:15:12,760 >> Vprašanja? 185 00:15:14,490 --> 00:15:17,230 [Študent] lahko določite blok samo z uporabo zavitih oklepajih 186 00:15:17,230 --> 00:15:21,220 ne pa da bi imeli, če izkaz ali while izjavo ali kaj podobnega? 187 00:15:21,220 --> 00:15:29,130 Določite lahko blok kot v funkciji, ampak da ima tudi zavite oklepaje. 188 00:15:29,130 --> 00:15:32,100 [Študent] Torej ne moreš kar so kot naključni par zavitih oklepajih v kodi 189 00:15:32,100 --> 00:15:35,680 da imajo lokalne spremenljivke? >> Ja, lahko. 190 00:15:35,680 --> 00:15:45,900 Znotraj int vrstice bi lahko imeli {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 To naj bi bilo tukaj. 192 00:15:48,440 --> 00:15:52,450 Ampak to je popolnoma opredeljuje področje int y. 193 00:15:52,450 --> 00:15:57,320 Po tem drugem oklepaja kodrasti, y ni več mogoče uporabiti. 194 00:15:57,910 --> 00:16:00,630 Skoraj nikoli storil, čeprav. 195 00:16:02,940 --> 00:16:07,370 Vrnimo se na to, kar se zgodi, ko program konča, 196 00:16:07,370 --> 00:16:18,760 obstaja vrsta napačno / pol laži, da smo dali, da bi samo, da se stvari lažje. 197 00:16:18,760 --> 00:16:24,410 Povemo vam, da ko dodeliti pomnilnika 198 00:16:24,410 --> 00:16:29,860 ste dodeljevanje nekaj kos RAM-a za to spremenljivko. 199 00:16:29,860 --> 00:16:34,190 Ampak ne boš res neposredno dotikajo RAM kdaj v svojih programih. 200 00:16:34,190 --> 00:16:37,490 Če pomislim, kako sem narisal - 201 00:16:37,490 --> 00:16:44,330 In dejansko, če greš skozi v gdb boste videli isto stvar. 202 00:16:51,120 --> 00:16:57,590 Ne glede na to, kolikokrat zaženete program ali program, kaj ste tekmovanje v teku, 203 00:16:57,590 --> 00:16:59,950 Sveženj je vedno tekoč, da začnete - 204 00:16:59,950 --> 00:17:06,510 ste vedno tekoč, da vidim spremenljivk okoli naslova oxbffff nekaj. 205 00:17:06,510 --> 00:17:09,470 To je ponavadi nekje v tej regiji. 206 00:17:09,470 --> 00:17:18,760 Toda kako lahko program 2 razpolagajo napotke za isti spomin? 207 00:17:20,640 --> 00:17:27,650 [Študent] Nekaj ​​arbitrarna določitev, kjer je oxbfff naj bi na RAM 208 00:17:27,650 --> 00:17:31,320 da lahko dejansko v različnih krajih, odvisno, ko je bil imenovan funkcijo. 209 00:17:31,320 --> 00:17:35,920 Ja. Izraz je navidezni pomnilnik. 210 00:17:35,920 --> 00:17:42,250 Ideja je, da vsak postopek, vsak program, ki se izvaja v računalniku 211 00:17:42,250 --> 00:17:49,450 ima svojo - predpostavimo, 32 bitov - popolnoma neodvisna naslovnega prostora. 212 00:17:49,450 --> 00:17:51,590 To je naslovni prostor. 213 00:17:51,590 --> 00:17:56,220 To ima svoje povsem neodvisne 4 GB za uporabo. 214 00:17:56,220 --> 00:18:02,220 >> Torej, če naletite 2 programov hkrati, ta program ne vidi 4 GB sebi, 215 00:18:02,220 --> 00:18:04,870 ta program ne vidi 4 GB sebi, 216 00:18:04,870 --> 00:18:07,720 in to je nemogoče, da bo ta program ciljne datoteke kazalec 217 00:18:07,720 --> 00:18:10,920 in na koncu s spominom iz tega programa. 218 00:18:10,920 --> 00:18:18,200 In kaj je navidezni pomnilnik je preslikava iz procesov naslovnega prostora 219 00:18:18,200 --> 00:18:20,470 dejanskim stvari na RAM. 220 00:18:20,470 --> 00:18:22,940 Torej, to je odvisno od vašega operacijskega sistema vedeti, da je 221 00:18:22,940 --> 00:18:28,080 hej, ko je ta tip dereferences kazalec oxbfff, ki v resnici pomeni 222 00:18:28,080 --> 00:18:31,040 da želi RAM bajt 1000, 223 00:18:31,040 --> 00:18:38,150 ker če tega programa dereferences oxbfff, res želi RAM bajt 10000. 224 00:18:38,150 --> 00:18:41,590 Lahko se poljubno daleč narazen. 225 00:18:41,590 --> 00:18:48,730 To je tudi res, stvari v enem prostoru procesov naslov. 226 00:18:48,730 --> 00:18:54,770 Tako kot se vidi vse 4 gigabajte na sebi, ampak recimo - 227 00:18:54,770 --> 00:18:57,290 [Študent] Ali vsak proces - 228 00:18:57,290 --> 00:19:01,350 Recimo, da imate računalnik s samo 4 GB RAM-a. 229 00:19:01,350 --> 00:19:06,430 Ali vsak proces videti cele 4 gigabajte? >> Da. 230 00:19:06,430 --> 00:19:13,060 Ampak 4 gigabajte se mu zdijo, je laž. 231 00:19:13,060 --> 00:19:20,460 To je samo misli, da je vse to spomin, saj ne vem kateri koli drug postopek, ne obstaja. 232 00:19:20,460 --> 00:19:28,140 To bo le uporaba toliko pomnilnika, kot ga dejansko potrebuje. 233 00:19:28,140 --> 00:19:32,340 Operacijski sistem ne bo dal RAM za ta proces 234 00:19:32,340 --> 00:19:35,750 če je ne uporabljate pomnilnika, v vsej tej regiji. 235 00:19:35,750 --> 00:19:39,300 To se ne dogaja, da ji spomin za to regijo. 236 00:19:39,300 --> 00:19:54,780 Toda ideja je, da - Poskušam razmišljati - ne morem razmišljati o analogiji. 237 00:19:54,780 --> 00:19:56,780 Analogije je težko. 238 00:19:57,740 --> 00:20:02,700 Eno od vprašanj navideznega pomnilnika ali ena izmed stvari, ki jih je za reševanje 239 00:20:02,700 --> 00:20:06,810 je, da bi morali biti postopki v celoti zavedajo drug drugega. 240 00:20:06,810 --> 00:20:12,140 In tako lahko napisati program, da le dereferences vsak kazalec, 241 00:20:12,140 --> 00:20:19,340 želel samo napisati program, ki pravi * (ox1234) 242 00:20:19,340 --> 00:20:22,890 in to je pomnilniški naslov Dereferenciranje 1234. 243 00:20:22,890 --> 00:20:28,870 >> Ampak to je odvisno od operacijskega sistema, nato pa prevede kaj pomeni 1234. 244 00:20:28,870 --> 00:20:33,960 Torej, če se zgodi, da bo 1234 veljaven naslov spomin na ta proces, 245 00:20:33,960 --> 00:20:38,800 kot da je na stack ali kaj podobnega, potem bo ta vrne vrednost tega spomina naslov 246 00:20:38,800 --> 00:20:41,960 kolikor je proces ve. 247 00:20:41,960 --> 00:20:47,520 Ampak, če je 1234 ni veljaven naslov, kot se to zgodi v tla 248 00:20:47,520 --> 00:20:52,910 v nekaterih košček spomina here, ki presega dimnik in preko kopice 249 00:20:52,910 --> 00:20:57,200 in ste v resnici ne uporablja, potem je to, ko prideš stvari, kot sesutja 250 00:20:57,200 --> 00:21:00,260 zato, ker ste se dotika pomnilnik, ki ga ne bi smeli dotika. 251 00:21:07,180 --> 00:21:09,340 To velja tudi za - 252 00:21:09,340 --> 00:21:15,440 32-bitni sistem, 32 bitov pomeni, da imate 32 bitov za opredelitev naslov pomnilnika. 253 00:21:15,440 --> 00:21:22,970 To je, zakaj so kazalci 8 bajtov, saj 32 bitov ali 8 bitov - 4 bajtov. 254 00:21:22,970 --> 00:21:25,250 Kazalci so 4 bajte. 255 00:21:25,250 --> 00:21:33,680 Torej, ko vidite kazalec kot oxbfffff, da je - 256 00:21:33,680 --> 00:21:40,080 V vsakem programu lahko samo zgraditi koli samovoljno kazalec, 257 00:21:40,080 --> 00:21:46,330 kjerkoli ox0 za vola 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Študent] Kaj nisi rekel, da si 4 bajti? >> Ja. 259 00:21:49,180 --> 00:21:52,730 [Študent] Potem bo vsak bajt je - >> [Bowden] Šestnajstiški. 260 00:21:52,730 --> 00:21:59,360 Šestnajstiški - 5, 6, 7, 8. Torej kazalci boste vedno videli v šestnajstiško. 261 00:21:59,360 --> 00:22:01,710 To je samo, kako razvrstiti kazalca. 262 00:22:01,710 --> 00:22:05,240 Vsaki 2 številki šestnajstiško je 1 bajt. 263 00:22:05,240 --> 00:22:09,600 Torej bo v 8 šestnajstiških števk za 4 bajte. 264 00:22:09,600 --> 00:22:14,190 Torej, vsak kazalec na 32-bitnem sistemu se bo 4 bajte, 265 00:22:14,190 --> 00:22:18,550 kar pomeni, da v vašem procesu lahko zgraditi samovoljnim 4 bajte 266 00:22:18,550 --> 00:22:20,550 in da kazalec od njega, 267 00:22:20,550 --> 00:22:32,730 kar pomeni, da, kolikor je to znano, se lahko obravnava celo 2 do 32 bajtov pomnilnika. 268 00:22:32,730 --> 00:22:34,760 Kljub temu, da sploh nima dostopa do, da 269 00:22:34,760 --> 00:22:40,190 tudi če je vaš računalnik ima le 512 MB, misli, da ima toliko pomnilnika. 270 00:22:40,190 --> 00:22:44,930 In operacijski sistem je dovolj pameten, da bo le dodelila tisto, kar dejansko potrebujejo. 271 00:22:44,930 --> 00:22:49,630 Ne samo pojdi, oh, nov proces: 4 nastopov. 272 00:22:49,630 --> 00:22:51,930 >> Ja. >> [Študent] Kaj pomeni vola? Zakaj si ga napisal? 273 00:22:51,930 --> 00:22:54,980 To je samo znak za šestnajstiško. 274 00:22:54,980 --> 00:22:59,590 Ko vidite številke se začnejo z vola, zaporedna stvari šestnajstiško. 275 00:23:01,930 --> 00:23:05,760 [Študent] si razložiti, kaj se zgodi, ko program konča. >> Da. 276 00:23:05,760 --> 00:23:09,480 Kaj se zgodi, ko se program konča, je operacijski sistem 277 00:23:09,480 --> 00:23:13,600 samo izbriše preslikave, ki jih ima za te naslove, in to je to. 278 00:23:13,600 --> 00:23:17,770 Operacijski sistem lahko zdaj daj, da spomin na drug program za uporabo. 279 00:23:17,770 --> 00:23:19,490 [Študent] Ok. 280 00:23:19,490 --> 00:23:24,800 Torej, ko se namenijo nekaj na kup ali dimnika ali globalnih spremenljivk ali kaj podobnega, 281 00:23:24,800 --> 00:23:27,010 so vse samo izgine, ko program konča 282 00:23:27,010 --> 00:23:32,120 ker operacijski sistem je zdaj prost, da ta spomin na katerem koli drugem postopku. 283 00:23:32,120 --> 00:23:35,150 [Študent] Čeprav so verjetno še vedno zapisani v vrednosti? >> Ja. 284 00:23:35,150 --> 00:23:37,740 Vrednosti so verjetno še vedno tam. 285 00:23:37,740 --> 00:23:41,570 To je samo, da se bo težko priti na njih. 286 00:23:41,570 --> 00:23:45,230 To je veliko težje priti do njih, kot je, da se na datoteko izbrisanih 287 00:23:45,230 --> 00:23:51,450 ker izbrisane datoteke vrste sedi za dolgo časa in trdega diska, je veliko večja. 288 00:23:51,450 --> 00:23:54,120 Torej gre prepisati različnih delov pomnilnika 289 00:23:54,120 --> 00:23:58,640 preden se zgodi, da prepišete kos pomnilnika, da ta spis, ki se uporablja za biti. 290 00:23:58,640 --> 00:24:04,520 Toda glavni pomnilnik, RAM, da skozi cikel veliko hitreje, 291 00:24:04,520 --> 00:24:08,040 tako da se bo zelo hitro prepisana. 292 00:24:10,300 --> 00:24:13,340 Vprašanja o tem, ali kaj drugega? 293 00:24:13,340 --> 00:24:16,130 [Študent] Imam vprašanja o različnih temah. >> Redu. 294 00:24:16,130 --> 00:24:19,060 Ali ima kdo vprašanja o tem? 295 00:24:20,170 --> 00:24:23,120 >> Ok. Različne temo. >> [Študent] Ok. 296 00:24:23,120 --> 00:24:26,550 Sem šel skozi nekaj praktičnih preizkusov, 297 00:24:26,550 --> 00:24:30,480 in v eni izmed njih pa je govoril o dolľina tipa 298 00:24:30,480 --> 00:24:35,630 in vrednost, ki jo vrne ali različnih tipov spremenljivk. >> Da. 299 00:24:35,630 --> 00:24:45,060 In je rekel, da tako dolgo int in tako vračanje 4, tako da si jih obe 4 bajte. 300 00:24:45,060 --> 00:24:48,070 Ali obstaja razlika med notr in dolgoročno, ali je to isto? 301 00:24:48,070 --> 00:24:50,380 Ja, je razlika. 302 00:24:50,380 --> 00:24:52,960 Standard C - 303 00:24:52,960 --> 00:24:54,950 Jaz sem verjetno bo nered. 304 00:24:54,950 --> 00:24:58,800 C standard je ravno tako, kot je C, uradna dokumentacija C. 305 00:24:58,800 --> 00:25:00,340 To je tisto, kar piše. 306 00:25:00,340 --> 00:25:08,650 Tako standard C samo pravi, da bo znak za vedno in vedno 1 bajt. 307 00:25:10,470 --> 00:25:19,040 Vse po tem - kratko je vedno samo opredeljeni kot večji ali enak znak. 308 00:25:19,040 --> 00:25:23,010 To je lahko nujno več, vendar ne pozitivno. 309 00:25:23,010 --> 00:25:31,940 Int je samo opredeljena kot večja ali enaka kratek. 310 00:25:31,940 --> 00:25:36,210 In če že opredelili kot večji ali enak notr. 311 00:25:36,210 --> 00:25:41,600 In dolgo dolgo je večje ali enako dolgo. 312 00:25:41,600 --> 00:25:46,610 Torej, edina stvar, C standard opredeljuje relativni naročanje vsega. 313 00:25:46,610 --> 00:25:54,880 Dejanska količina pomnilnika, ki traja do stvari na splošno do izvedbe, 314 00:25:54,880 --> 00:25:57,640 Ampak to je zelo dobro opredeljena v tem trenutku. >> [Študent] Ok. 315 00:25:57,640 --> 00:26:02,490 Torej, hlače so skoraj vedno bo 2 bajta. 316 00:26:04,920 --> 00:26:09,950 Ints so skoraj vedno bo 4 bajte. 317 00:26:12,070 --> 00:26:15,340 Dolga profilni so skoraj vedno bo 8 bajtov. 318 00:26:17,990 --> 00:26:23,160 In hrepeni, je odvisno od tega, ali ga uporabljate 32-bitni ali 64-bitni sistem. 319 00:26:23,160 --> 00:26:27,450 Torej, če bo ustrezala vrsti sistema. 320 00:26:27,450 --> 00:26:31,920 Če uporabljate 32-bitni sistem, kot aparata, se bo v 4 bajte. 321 00:26:34,530 --> 00:26:42,570 Če uporabljate 64-bitni kot veliko novejših računalnikih bo v 8 bajtov. 322 00:26:42,570 --> 00:26:45,230 >> Ints so skoraj vedno 4 bajte na tej točki. 323 00:26:45,230 --> 00:26:47,140 Dolgi profilni so skoraj vedno 8 bajtov. 324 00:26:47,140 --> 00:26:50,300 V preteklosti ints uporablja za samo 2 bajta. 325 00:26:50,300 --> 00:26:56,840 Toda opazil, da je to popolnoma izpolnjuje vseh teh odnosov, ki presegajo in enaka. 326 00:26:56,840 --> 00:27:01,280 Tako je že dolgo povsem dovoljeno biti enake velikosti kot celo število, 327 00:27:01,280 --> 00:27:04,030 in je bilo dovoljeno, da se enake velikosti kot že dolgo časa. 328 00:27:04,030 --> 00:27:11,070 In prav tako se zgodi, da se da v 99,999% sistemov, da se bo enako 329 00:27:11,070 --> 00:27:15,800 bodisi int ali dolgo dolgo. Prav tako je odvisen od 32-bitno ali 64-bitno različico. >> [Študent] Ok. 330 00:27:15,800 --> 00:27:24,600 V plovci, kako je decimalno vejico določena glede bitov? 331 00:27:24,600 --> 00:27:27,160 Všeč mi je kot binarna? >> Ja. 332 00:27:27,160 --> 00:27:30,570 Ni vam treba vedeti, da je za CS50. 333 00:27:30,570 --> 00:27:32,960 Saj sploh ne učijo, da je v 61. 334 00:27:32,960 --> 00:27:37,350 Vi ne učijo, da je res v vsakem letu. 335 00:27:37,350 --> 00:27:42,740 To je samo predstavitev. 336 00:27:42,740 --> 00:27:45,440 Pozabil sem točno bit allotmentov. 337 00:27:45,440 --> 00:27:53,380 Ideja plavajočo vejico, je, da dodeli določeno število bitov za zastopanje - 338 00:27:53,380 --> 00:27:56,550 V bistvu, vse, kar je v znanstvenem zapisu. 339 00:27:56,550 --> 00:28:05,600 Torej ti dodelijo določeno število bitov, ki zastopa več kot 1,2345 sam,. 340 00:28:05,600 --> 00:28:10,200 Nikoli ne predstavljajo več z več kot 5 številkami. 341 00:28:12,200 --> 00:28:26,300 Potem si tudi dodelila določeno število bitov, tako da kaže, da je kot 342 00:28:26,300 --> 00:28:32,810 lahko samo iti do določenega števila, kot da je največji eksponent lahko imate, 343 00:28:32,810 --> 00:28:36,190 in lahko samo iti do neke eksponentom, 344 00:28:36,190 --> 00:28:38,770 kot da je to najmanjši eksponent lahko imate. 345 00:28:38,770 --> 00:28:44,410 >> Ne spomnim se natančne način bitov se dodelijo vse te vrednosti, 346 00:28:44,410 --> 00:28:47,940 vendar so nekateri bitov namenjen 1,2345, 347 00:28:47,940 --> 00:28:50,930 še določeno število bitov so namenjeni za eksponentom, 348 00:28:50,930 --> 00:28:55,670 in to je mogoče le, da predstavlja eksponent določene velikosti. 349 00:28:55,670 --> 00:29:01,100 [Študent] In dvakrat? Je to kot izredno dolgim ​​float? >> Ja. 350 00:29:01,100 --> 00:29:07,940 To je isto, kot likvidna sredstva, razen sedaj si z 8 bajte namesto 4 bajte. 351 00:29:07,940 --> 00:29:11,960 Zdaj boste lahko uporabljali številke 9 ali 10 cifer, 352 00:29:11,960 --> 00:29:16,630 in to bo lahko šel do 300 namesto 100. >> [Študent] Ok. 353 00:29:16,630 --> 00:29:21,550 In boje so 4 bajte. >> Da. 354 00:29:21,550 --> 00:29:27,520 Torej, še enkrat, je verjetno odvisno splošno o splošnem izvajanju, 355 00:29:27,520 --> 00:29:30,610 vendar boje so 4 bajte, dvojice so 8. 356 00:29:30,610 --> 00:29:33,440 Dvojice so dvojno imenuje zato, ker so dvojne velikosti plovcev. 357 00:29:33,440 --> 00:29:38,380 [Študent] Ok. In tam dvakrat dvojice? >> Ni. 358 00:29:38,380 --> 00:29:43,660 Mislim - >> [Študent] Kot dolgo hrepeni? >> Ja. Jaz ne mislim tako. Da. 359 00:29:43,660 --> 00:29:45,950 [Študent] Na testu lanskoletnem je bilo vprašanje o glavnih funkcij 360 00:29:45,950 --> 00:29:49,490 da bi morali biti del vašega programa. 361 00:29:49,490 --> 00:29:52,310 Odgovor je bil, da ni nujno, da bo del svojega programa. 362 00:29:52,310 --> 00:29:55,100 V kakšnem položaju? To je tisto, kar sem videl. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Zdi se - >> [Študent] Kakšno situacijo? 364 00:29:59,090 --> 00:30:02,880 Ali imate težave? >> [Študent] Ja, lahko zagotovo ga potegnite navzgor. 365 00:30:02,880 --> 00:30:07,910 Ni nujno, da je tehnično, ampak v bistvu to bo treba. 366 00:30:07,910 --> 00:30:10,030 [Študent] sem videl enega na drugo leto je. 367 00:30:10,030 --> 00:30:16,220 Bilo je, kot True ali False: veljavnost - >> Oh, c datoteka.? 368 00:30:16,220 --> 00:30:18,790 . [Študent], mora vsaka datoteka pa c - [tako govori naenkrat - nerazumljiv] 369 00:30:18,790 --> 00:30:21,120 Ok. Tako da je ločena. 370 00:30:21,120 --> 00:30:26,800 >> C datoteke. Samo mora vsebovati funkcije. 371 00:30:26,800 --> 00:30:32,400 Lahko pripravijo dokumentacijo v strojni kodi, binarna, ne glede, 372 00:30:32,400 --> 00:30:36,620 ne da bi bilo izvedljivo še. 373 00:30:36,620 --> 00:30:39,420 Veljavna izvedljiva, mora imeti glavno funkcijo. 374 00:30:39,420 --> 00:30:45,460 Lahko napišete 100 funkcij v 1 datoteko, vendar ne glavne 375 00:30:45,460 --> 00:30:48,800 in nato prevesti, da do binarne, 376 00:30:48,800 --> 00:30:54,460 potem pišete novo datoteko, ki ima samo glavni ampak kliče kup teh funkcij 377 00:30:54,460 --> 00:30:56,720 V tem binarne datoteke tam. 378 00:30:56,720 --> 00:31:01,240 In tako, ko delaš izvršljiv, da je kaj počne povezovalnik 379 00:31:01,240 --> 00:31:05,960 se združuje te 2 binarne datoteke izvedljivi. 380 00:31:05,960 --> 00:31:11,400 Torej c datoteka. Ni potrebno, da imajo glavno vlogo na vseh. 381 00:31:11,400 --> 00:31:19,220 In na velikih baz kode boste videli na tisoče. Datotek C in 1 glavni datoteki. 382 00:31:23,960 --> 00:31:26,110 Še vprašanja? 383 00:31:29,310 --> 00:31:31,940 [Študent] je bilo drugo vprašanje. 384 00:31:31,940 --> 00:31:36,710 To je dejal, da je prevajalnik. Drži ali ne drži? 385 00:31:36,710 --> 00:31:42,030 In odgovor je bil lažen, in sem razumel, zakaj to ni všeč Jek. 386 00:31:42,030 --> 00:31:44,770 Toda kaj pravimo, da če ni? 387 00:31:44,770 --> 00:31:49,990 Znamka je v bistvu samo - Vidim, kaj jo pokliče. 388 00:31:49,990 --> 00:31:52,410 Ampak to samo traja ukazov. 389 00:31:53,650 --> 00:31:55,650 Make. 390 00:31:58,240 --> 00:32:00,870 Lahko potegnem gor. Ja. 391 00:32:10,110 --> 00:32:13,180 Oh, ja. Poskrbite tudi ne da. 392 00:32:13,180 --> 00:32:17,170 Ta pravi, da je namen Naredite pripomoček je samodejno določi 393 00:32:17,170 --> 00:32:19,610 ki deli velikega programa je treba prevesti 394 00:32:19,610 --> 00:32:22,350 in izdal ukaze, da jih prevedem. 395 00:32:22,350 --> 00:32:27,690 Lahko naredite, da datoteke, ki so absolutno ogromno. 396 00:32:27,690 --> 00:32:33,210 Naj pogleda časovnih žigov datotek in kot smo že omenili, 397 00:32:33,210 --> 00:32:36,930 lahko pripravijo posamezne datoteke dol, in to ni, dokler ne pridemo do povezovalnik 398 00:32:36,930 --> 00:32:39,270 da oni so skupaj izvedljivi. 399 00:32:39,270 --> 00:32:43,810 Torej, če imate 10 različnih datotek in naredite spremembe v 1 izmed njih, 400 00:32:43,810 --> 00:32:47,870 potem tisto, zaradi česar se dogaja, da storiti, je le, da prevedem 1 datoteka 401 00:32:47,870 --> 00:32:50,640 in potem relink vse skupaj. 402 00:32:50,640 --> 00:32:53,020 Vendar pa je mnogo bolj neumen kot to. 403 00:32:53,020 --> 00:32:55,690 To je do vas, da popolnoma opredeliti, da je to tisto, kar bi morala delati. 404 00:32:55,690 --> 00:32:59,560 To privzeto ima sposobnost prepoznavanja te stvari časovnega žiga, 405 00:32:59,560 --> 00:33:03,220 vendar pa lahko napišete make datoteko storiti ničesar. 406 00:33:03,220 --> 00:33:09,150 Lahko napišete, da datoteke, tako da ko tipkate, da je samo CD-jev v drugo mapo. 407 00:33:09,150 --> 00:33:15,560 Jaz pridobivanje bil razočaran, ker sem prečiti vse v notranjosti mojega aparata 408 00:33:15,560 --> 00:33:21,740 in potem vidim PDF, Mac. 409 00:33:21,740 --> 00:33:30,720 >> Zato sem šel v iskalniku in ne morem Go Poveži s strežnikom, 410 00:33:30,720 --> 00:33:36,950 in strežnik sem povezati moj aparatov, potem pa sem odprl PDF 411 00:33:36,950 --> 00:33:40,190 da dobi zbrala LaTeX. 412 00:33:40,190 --> 00:33:49,320 Ampak sem bil pridobivanje uničen, ker vsako ko sem potreben za osvežitev PDF 413 00:33:49,320 --> 00:33:53,900 Moral sem jo kopirati v določeno mapo, da bi lahko dostopajo 414 00:33:53,900 --> 00:33:57,710 in to je že nadležno. 415 00:33:57,710 --> 00:34:02,650 Torej, namesto da sem napisal Naredite datoteko, ki jo morate določiti, kako se naredi stvari. 416 00:34:02,650 --> 00:34:06,130 Kako si lahko v to PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Tako kot vse druge datoteke make - ali Mislim, da niste videli, da datoteke, 418 00:34:10,090 --> 00:34:13,510 vendar imamo v napravo svetovnega Naredite datoteko, ki samo pravi, 419 00:34:13,510 --> 00:34:16,679 če se pripravi datoteko C, uporabite Jek. 420 00:34:16,679 --> 00:34:20,960 In tako sem po mojem Naredite datoteko, da sem ti rekel, 421 00:34:20,960 --> 00:34:25,020 To datoteko, ki jo boste želeli pripraviti v PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 In tako je PDF LaTeX, da to počne prevesti. 423 00:34:27,889 --> 00:34:31,880 Naj se ne pripravi. To je samo teče ukazov v zaporedju, ki sem. 424 00:34:31,880 --> 00:34:36,110 Torej teče PDF LaTeX, jo kopira v imenik, želim, da se kopira, 425 00:34:36,110 --> 00:34:38,270 je CD-jev v imenik in ne druge stvari, 426 00:34:38,270 --> 00:34:42,380 ampak vse to pa je priznati ko se spremeni datoteka, 427 00:34:42,380 --> 00:34:45,489 in če se spreminja, nato pa se bo pognal ukaze, da naj bi vse teče 428 00:34:45,489 --> 00:34:48,760 ko se spremeni datoteka. >> [Študent] Ok. 429 00:34:50,510 --> 00:34:54,420 Ne vem, če se skupni Naredite datoteke so mi, da preverim. 430 00:34:57,210 --> 00:35:04,290 Druga vprašanja? Karkoli iz preteklosti kvizov? Vse kazalec stvari? 431 00:35:06,200 --> 00:35:08,730 Obstajajo subtilne stvari, s kazalci, kot so - 432 00:35:08,730 --> 00:35:10,220 Ne grem, da bi lahko našli kviz vprašanje o tem - 433 00:35:10,220 --> 00:35:16,250 ampak tako kot te stvari. 434 00:35:19,680 --> 00:35:24,060 Poskrbite, da boste razumeli, da ko sem rekel, int * x * y - 435 00:35:24,890 --> 00:35:28,130 To ni ravno kaj tu, se mi zdi. 436 00:35:28,130 --> 00:35:32,140 Ampak kot * x * y, to so 2 spremenljivke, ki so na kupu. 437 00:35:32,140 --> 00:35:37,220 Ko rečem x = malloc (sizeof (int)), x je spremenljivka še vedno na sklad, 438 00:35:37,220 --> 00:35:41,180 malloc je nekaj čez blok na kup, in da imamo x točka na kup. 439 00:35:41,180 --> 00:35:43,900 >> Torej, kaj na stack točk na kup. 440 00:35:43,900 --> 00:35:48,100 Kadarkoli malloc ničesar, boste zagotovo shranjevanje jo globoko v kazalec. 441 00:35:48,100 --> 00:35:55,940 Tako, da kazalec na sklad, je malloced blok je na kup. 442 00:35:55,940 --> 00:36:01,240 Veliko ljudi se zmeden in pravijo, int * x = malloc, je x na kup. 443 00:36:01,240 --> 00:36:04,100 Ne, kaj x opozarja, da je na kupu. 444 00:36:04,100 --> 00:36:08,540 x sam na kup, če zaradi kakršnega koli razloga, ki ste jih x je globalna spremenljivka, 445 00:36:08,540 --> 00:36:11,960 v tem primeru se zgodi, da bo v drugi regiji pomnilnika. 446 00:36:13,450 --> 00:36:20,820 Torej sledenja te sheme box in puščice so precej pogosti v kvizu. 447 00:36:20,820 --> 00:36:25,740 Ali pa, če to ni v kvizu 0, bo na kvizu 1. 448 00:36:27,570 --> 00:36:31,940 Moral bi vedeti vse te korake v pripravi 449 00:36:31,940 --> 00:36:35,740 ker si moral odgovarjati na vprašanja o njih. Da. 450 00:36:35,740 --> 00:36:38,940 [Študent] Bi šla skozi te korake - >> Seveda. 451 00:36:48,340 --> 00:36:58,640 Pred korake in zbirajo imamo predobdelavo, 452 00:36:58,640 --> 00:37:16,750 sestavljanje, montaža in povezovanje. 453 00:37:16,750 --> 00:37:21,480 Predobdelavo. Kaj naj bi to naredil? 454 00:37:29,720 --> 00:37:32,290 To je najlažji korak - no, ne tako - 455 00:37:32,290 --> 00:37:35,770 to ne pomeni, da bi morala biti očitna, toda to je najlažji korak. 456 00:37:35,770 --> 00:37:38,410 Vi bi ga izvajajo sami. Ja. 457 00:37:38,410 --> 00:37:43,410 [Študent] Vzemi kaj imate v vaši vključuje tako in prepise, nato pa tudi opredeljuje. 458 00:37:43,410 --> 00:37:49,250 Videti za stvari, kot so, in # # define, 459 00:37:49,250 --> 00:37:53,800 in to samo kopije in paste, kaj so pravzaprav pomeni. 460 00:37:53,800 --> 00:37:59,240 Torej, ko ste rekli # include cs50.h je preprocesor kopiranje in lepljenje cs50.h 461 00:37:59,240 --> 00:38:01,030 na tej progi. 462 00:38:01,030 --> 00:38:06,640 Ko rečeš # define x za 4, preprocesor gre skozi celoten program 463 00:38:06,640 --> 00:38:10,400 in nadomešča vse primerke x 4 s. 464 00:38:10,400 --> 00:38:17,530 Torej preprocesor meni veljaven C datoteko in izhodi veljaven C datoteko 465 00:38:17,530 --> 00:38:20,300 kjer so stvari, kopirali in prilepili. 466 00:38:20,300 --> 00:38:24,230 Torej, zdaj prevesti. Kaj naj bi to naredil? 467 00:38:25,940 --> 00:38:28,210 [Študent] To gre iz C v binarno. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] Ne presega vse do binarno. 469 00:38:30,970 --> 00:38:34,220 [Študent] V strojni kodi potem? >> To ni strojno kodo. 470 00:38:34,220 --> 00:38:35,700 [Študent] zbor? >> Skupščine. 471 00:38:35,700 --> 00:38:38,890 Jasno je, da skupščina, preden gre vse do oznako C, 472 00:38:38,890 --> 00:38:45,010 in večina jezikov, nekaj takega. 473 00:38:47,740 --> 00:38:50,590 Izberite vse visoki ravni jezika, in če boš prevedel, 474 00:38:50,590 --> 00:38:52,390 je verjetno, da pripravijo v korakih. 475 00:38:52,390 --> 00:38:58,140 Najprej se bo zbiranje Python in C, nato pa se dogaja, da pripravijo C do skupščine, 476 00:38:58,140 --> 00:39:01,600 nato pa Skupščina bo dobil preveden v binarno. 477 00:39:01,600 --> 00:39:07,800 Tako se bo zbiranje, da bi ga od C do skupščine. 478 00:39:07,800 --> 00:39:12,130 Beseda sestavljanje ponavadi pomeni, da ga pripelje do višje ravni 479 00:39:12,130 --> 00:39:14,340 na nižji ravni programskega jezika. 480 00:39:14,340 --> 00:39:19,190 Torej, to je le korak v zbiranju, kjer ste začeli s visoki ravni jezika 481 00:39:19,190 --> 00:39:23,270 in končajo v nizki ravni jezika, in to je, zakaj se imenuje korak prevesti. 482 00:39:25,280 --> 00:39:33,370 [Študent] Med pripravo, recimo, da si naredil # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Bo prevajalnik prevedem cs50.h, kot so funkcije, ki so tam, 484 00:39:42,190 --> 00:39:45,280 in to pretvorijo v kodo zbor, kot tudi, 485 00:39:45,280 --> 00:39:50,830 ali bo to kopiraj in prilepi nekaj, kar je bilo pred zbor? 486 00:39:50,830 --> 00:39:56,910 cs50.h bo precej nikoli ne končajo v zboru. 487 00:39:59,740 --> 00:40:03,680 Stvari, kot funkcijskih prototipov in stvari so samo za vas, da bodite previdni. 488 00:40:03,680 --> 00:40:09,270 To zagotavlja, da lahko prevajalnik preveri stvari, kot kličeš funkcije 489 00:40:09,270 --> 00:40:12,910 s pravimi vračanja vrste in pravih argumentov in podobno. 490 00:40:12,910 --> 00:40:18,350 >> Tako bo cs50.h vnaprej obdela v datoteko, in potem, ko se je zbiranje 491 00:40:18,350 --> 00:40:22,310 to je v bistvu zavrgli, potem ko je zagotovil, da je vse, kar se pravilno imenovan. 492 00:40:22,310 --> 00:40:29,410 Toda naloge, opredeljene v CS50 knjižnice, ki so ločene od cs50.h, 493 00:40:29,410 --> 00:40:33,610 tistih, ki se ne bodo posebej pripravljeni. 494 00:40:33,610 --> 00:40:37,270 To bo dejansko prišel v povezuje koraku, tako da bomo prišli do, da v drugem. 495 00:40:37,270 --> 00:40:40,100 Ampak najprej, kaj je montaža? 496 00:40:41,850 --> 00:40:44,500 [Študent] zbor v binarno? >> Ja. 497 00:40:46,300 --> 00:40:48,190 Sestavljanje. 498 00:40:48,190 --> 00:40:54,710 Mi ne pravimo sestavljanje, ker zbor je precej čist prevod binarno. 499 00:40:54,710 --> 00:41:00,230 Obstaja zelo malo logiko bo od skupščine do binarno. 500 00:41:00,230 --> 00:41:03,180 To je tako kot je videti v tabeli, oh, imamo ta navodila; 501 00:41:03,180 --> 00:41:06,290 ki ustreza binarno 01110. 502 00:41:10,200 --> 00:41:15,230 In tako so datoteke, montaža na splošno izhodi so. O files. 503 00:41:15,230 --> 00:41:19,020 In o. Slik, kar smo rekli prej, 504 00:41:19,020 --> 00:41:21,570 kako datoteka ni treba, da imajo glavno vlogo. 505 00:41:21,570 --> 00:41:27,640 Vsaka datoteka se lahko pripravijo navzdol do datoteke. °, dokler je veljavna C datoteka. 506 00:41:27,640 --> 00:41:30,300 To je mogoče pripraviti do. ​​O. 507 00:41:30,300 --> 00:41:43,030 Zdaj, povezovanje je tisto, kar dejansko prinaša kup. O datoteke in jih pripelje do izvršljiv. 508 00:41:43,030 --> 00:41:51,110 In kaj počne, je povezovanje lahko si misliš o CS50 knjižnico kot datoteko. O. 509 00:41:51,110 --> 00:41:56,980 To je že izvedla binarna datoteka. 510 00:41:56,980 --> 00:42:03,530 In tako, ko pripravijo svojo datoteko, vaš hello.c, ki poziva GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c gets pripravljeni do hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o je zdaj v binarno. 513 00:42:08,910 --> 00:42:12,830 Uporablja GetString, zato mora iti čez cs50.o, 514 00:42:12,830 --> 00:42:16,390 in povezovalnik jih smooshes skupaj in kopira GetString v tej datoteki 515 00:42:16,390 --> 00:42:20,640 in pride ven z izvršljiv, ki ima vse funkcije, ki jih potrebuje. 516 00:42:20,640 --> 00:42:32,620 Torej cs50.o dejansko ni O datoteka, vendar je dovolj blizu, da ni bistvene razlike. 517 00:42:32,620 --> 00:42:36,880 Tako povezovanje prinaša le kup datotek, skupaj 518 00:42:36,880 --> 00:42:41,390 da ločeno vsebuje vse funkcije, moram uporabiti 519 00:42:41,390 --> 00:42:46,120 in ustvarja izvedljivo, da bodo dejansko vodijo. 520 00:42:48,420 --> 00:42:50,780 >> In tako je tudi tisto, kar so govorili pred 521 00:42:50,780 --> 00:42:55,970 kjer lahko imate 1000. c datoteke, lahko prevedete jim vse k. o datoteke, 522 00:42:55,970 --> 00:43:00,040 ki bo verjetno trajalo nekaj časa, potem pa ste spremenili 1. c datoteka. 523 00:43:00,040 --> 00:43:05,480 Morate le, da prevedem 1. C datoteko in nato relink vse ostalo, 524 00:43:05,480 --> 00:43:07,690 povezati vse skupaj nazaj. 525 00:43:09,580 --> 00:43:11,430 [Študent] Ko smo povezavo pišemo lcs50? 526 00:43:11,430 --> 00:43:20,510 Ja, tako lcs50. To zastavo signale Povezivač, da morate biti povezave v tej knjižnici. 527 00:43:26,680 --> 00:43:28,910 Vprašanja? 528 00:43:41,310 --> 00:43:46,860 Smo šli v binarno, razen, da je 5 sekund v prvi predavanja? 529 00:43:50,130 --> 00:43:53,010 Jaz ne mislim tako. 530 00:43:55,530 --> 00:43:58,820 Moral bi vedeti vse o velikem Os, da smo šli čez, 531 00:43:58,820 --> 00:44:02,670 in ti bi lahko, če bi ti dal nalogo, 532 00:44:02,670 --> 00:44:09,410 bi morali biti sposobni reči, da je velik O, grobo. Ali pa, veliki O grob. 533 00:44:09,410 --> 00:44:15,300 Torej, če vidite ugnezdene zanke za večkratno več kot v enakem številu stvari, 534 00:44:15,300 --> 00:44:22,260 kot int i, i > [Študent] n kvadrat. >> To kaže, da je n kvadrat. 535 00:44:22,260 --> 00:44:25,280 Če ste trojno vgnezditi, pa kaže, da je n kubikov. 536 00:44:25,280 --> 00:44:29,330 Torej, da bi morala biti neke vrste stvar, ki jo lahko takoj poudariti. 537 00:44:29,330 --> 00:44:33,890 Morate vedeti vstavljanja vrste in mehurček razvrščanje in zlivanjem in vse od njih. 538 00:44:33,890 --> 00:44:41,420 To je lažje razumeti, zakaj so tisti kvadrat n in n log n in vse to 539 00:44:41,420 --> 00:44:47,810 ker mislim, da je bilo na kvizu eno leto, kjer smo v bistvu ti je dal 540 00:44:47,810 --> 00:44:55,050 izvajanje vrste mehurčkov in rekel: "Kaj je čas delovanja te funkcije?" 541 00:44:55,050 --> 00:45:01,020 Torej, če jo prizna kot neke mehurčke, potem lahko takoj povedati n kvadrat. 542 00:45:01,020 --> 00:45:05,470 Ampak, če si pogledate, vam ni treba niti dojel mehurček vrste; 543 00:45:05,470 --> 00:45:08,990 lahko samo rečem to počne to in to. To je n kvadrat. 544 00:45:12,350 --> 00:45:14,710 [Študent] Ali obstajajo primeri težke lahko prišli do, 545 00:45:14,710 --> 00:45:20,370 kot podobno idejo poskušal ugotoviti? 546 00:45:20,370 --> 00:45:24,450 >> Ne verjamem, da mi bo dal vse težke primere. 547 00:45:24,450 --> 00:45:30,180 Bubble sort, kar je približno tako težko, kot bi šla, 548 00:45:30,180 --> 00:45:36,280 pa še to, če boste razumeli, da ste ponavljanjem v matriki 549 00:45:36,280 --> 00:45:41,670 Za vsak element v matriki, ki se bo nekaj, kar je n kvadrat. 550 00:45:45,370 --> 00:45:49,940 Obstaja splošna vprašanja, kot je tukaj imamo - Oh. 551 00:45:55,290 --> 00:45:58,530 Samo drugi dan, Doug je trdil: »Jaz sem izumil algoritem, ki lahko razvrstite niz 552 00:45:58,530 --> 00:46:01,780 "N od številk v O (log n) časa!" 553 00:46:01,780 --> 00:46:04,900 Torej, kako bomo vedeli da je to nemogoče? 554 00:46:04,900 --> 00:46:08,850 [Neslišno študentski odziv] >> Ja. 555 00:46:08,850 --> 00:46:13,710 Vsaj, morate dotakniti vsakega elementa v matriki, 556 00:46:13,710 --> 00:46:16,210 zato je nemogoče razvrstiti array - 557 00:46:16,210 --> 00:46:20,850 Če je vse v nesortiranih redu, potem boš se dotika vse, kar je v polju, 558 00:46:20,850 --> 00:46:25,320 zato je nemogoče, da to storite v manj kot O n. 559 00:46:27,430 --> 00:46:30,340 [Študent] Vi nam je pokazala, da je primer, da lahko to storite O n 560 00:46:30,340 --> 00:46:33,920 Če uporabljate veliko pomnilnika. >> Ja. 561 00:46:33,920 --> 00:46:37,970 In that - Pozabil sem, kaj that - Je štetje vrste? 562 00:46:47,360 --> 00:46:51,330 Hmm. To je celo sortiranje algoritem. 563 00:46:59,850 --> 00:47:05,100 Iskal sem za posebno ime za to, da se nisem mogel spomniti prejšnji teden. 564 00:47:05,100 --> 00:47:13,000 Ja. To so tipi sort, ki jih lahko dosežete na stvari v veliki O n. 565 00:47:13,000 --> 00:47:18,430 Vendar pa obstajajo omejitve, kot jih lahko uporabite samo cela do določenega števila. 566 00:47:20,870 --> 00:47:24,560 Plus, če ste poskušali rešiti nekaj, that - 567 00:47:24,560 --> 00:47:30,750 Če je vaš matrika 012, -12, 151, 4 mio EUR, 568 00:47:30,750 --> 00:47:35,120 potem en element bo popolnoma uniči celotno sortiranje. 569 00:47:42,060 --> 00:47:44,030 >> Vprašanja? 570 00:47:49,480 --> 00:47:58,870 [Študent] Če imate rekurzivno funkcijo, in to šele naredi rekurzivni klic 571 00:47:58,870 --> 00:48:02,230 v povratni izjavo, da je rep rekurzivni, 572 00:48:02,230 --> 00:48:07,360 in zato, da ne bi porabi več pomnilnika med izvajanjem, 573 00:48:07,360 --> 00:48:12,550 ali bi vsaj uporabiti primerljivo spomin kot iterativni rešitev? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Da. 575 00:48:14,530 --> 00:48:19,840 To bi verjetno nekoliko počasneje, vendar ne zares. 576 00:48:19,840 --> 00:48:23,290 Rep rekurzivna je precej dobro. 577 00:48:23,290 --> 00:48:32,640 Če pogledamo še enkrat dimnika okvirjev, recimo, da imamo glavno 578 00:48:32,640 --> 00:48:42,920 in smo int bar (int x) ali kaj podobnega. 579 00:48:42,920 --> 00:48:52,310 To ni popoln rekurzivna funkcija, ampak vrnitev bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Torej je očitno, to je napačna. Moraš osnovnih zadev in podobno. 581 00:48:57,620 --> 00:49:00,360 Toda ideja tukaj je, da je to rep rekurzivni, 582 00:49:00,360 --> 00:49:06,020 kar pomeni, da ko glavni bar klicev pa se dogaja, da bi dobili svojo dimnika okvirja. 583 00:49:09,550 --> 00:49:12,440 V tem okviru je dimnik bo še malo blok pomnilnika 584 00:49:12,440 --> 00:49:17,490 da ustreza njena trditev x. 585 00:49:17,490 --> 00:49:25,840 In tako se recimo zgodi, da pokličete glavni bar (100); 586 00:49:25,840 --> 00:49:30,050 Torej x se bo začeti kot 100. 587 00:49:30,050 --> 00:49:35,660 Če prevajalnik, da gre rep rekurzivna funkcija, 588 00:49:35,660 --> 00:49:38,540 potem ko je bar naredi svoje rekurzivni klic v bar, 589 00:49:38,540 --> 00:49:45,490 namesto da bi novo žetonov okvir, ki je, če se začne sveženj večinoma narašča, 590 00:49:45,490 --> 00:49:48,220 sčasoma bo naletel na kup in potem dobiš sesutja 591 00:49:48,220 --> 00:49:51,590 ker je pomnilnik začne trčenju. 592 00:49:51,590 --> 00:49:54,830 >> Torej, namesto da bi svojo žetonov okvir, se lahko zavedaš, 593 00:49:54,830 --> 00:49:59,080 hej, nikoli nisem zares potrebujejo, da pridejo nazaj na to dimnik okvir, 594 00:49:59,080 --> 00:50:08,040 Tako namesto da bom samo nadomestiti te trditve z 99 in nato začnite vrstico z vsem. 595 00:50:08,040 --> 00:50:11,810 In potem bo to storil še enkrat in da bo dosegla vrnitev bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 in namesto da bi novo žetonov okvir, bo to samo zamenjati svoj trenutni argument, s 98 597 00:50:17,320 --> 00:50:20,740 in potem skoči nazaj na samem začetku vrstice. 598 00:50:23,860 --> 00:50:30,430 Ti postopki, ki nadomešča to 1 vrednost na kupu in skakanje nazaj na začetek, 599 00:50:30,430 --> 00:50:32,430 so zelo učinkoviti. 600 00:50:32,430 --> 00:50:41,500 Torej ne samo, da je to ista pomnilnika kot samostojna funkcija, ki se ponavlja 601 00:50:41,500 --> 00:50:45,390 saj ste le z uporabo 1 žetonov okvir, ampak si ne trpijo slabosti 602 00:50:45,390 --> 00:50:47,240 da bi morali poklicati funkcije. 603 00:50:47,240 --> 00:50:50,240 Klicne funkcije lahko nekoliko drago, saj mora storiti vse te nastavitve 604 00:50:50,240 --> 00:50:52,470 in razstavitev in vse te stvari. 605 00:50:52,470 --> 00:50:58,160 Torej, to repa rekurzija je dobro. 606 00:50:58,160 --> 00:51:01,170 [Študent] Zakaj ne ustvarite nove korake? 607 00:51:01,170 --> 00:51:02,980 Ker se zaveda, da ni potrebno. 608 00:51:02,980 --> 00:51:07,800 Poziv k baru je le vračanje rekurzivni klic. 609 00:51:07,800 --> 00:51:12,220 Torej mu ni treba storiti ničesar, s povratno vrednost. 610 00:51:12,220 --> 00:51:15,120 To je le, da bo takoj vrnil. 611 00:51:15,120 --> 00:51:20,530 Torej, to je le, da bo nadomestil svojo trditev in začeti znova. 612 00:51:20,530 --> 00:51:25,780 In tudi, če ne boste imeli rep rekurzivno različico, 613 00:51:25,780 --> 00:51:31,460 potem so dobili vse te vrstice, kjer je ta bar, ko se vrne 614 00:51:31,460 --> 00:51:36,010 ima svojo vrednost, da se vrnete na to eno, potem se takoj vrne bar 615 00:51:36,010 --> 00:51:39,620 in vrne njegovo vrednost do tega, potem se bo kar takoj vrne 616 00:51:39,620 --> 00:51:41,350 in vrne njegovo vrednost na to. 617 00:51:41,350 --> 00:51:45,350 Torej ste za varčevanje to pokanje vse te stvari off dimnika 618 00:51:45,350 --> 00:51:48,730 ker je donosnost vrednost je le, da bo treba posredovati vso pot nazaj do anyway. 619 00:51:48,730 --> 00:51:55,400 Torej, zakaj ne samo zamenjati svoje trditve s posodobljeno utemeljitev in začeti znova? 620 00:51:57,460 --> 00:52:01,150 Če funkcija ni na rep rekurzivna, če vam kaj takega - 621 00:52:01,150 --> 00:52:07,530 [Študent], če bar (x + 1). >> Ja. 622 00:52:07,530 --> 00:52:11,770 >> Torej, če ste jo dali v stanju, potem delaš nekaj s povratno vrednost. 623 00:52:11,770 --> 00:52:16,260 Ali pa tudi če si naredil vrnitev 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Torej, zdaj bar (x - 1) mora vrniti, da bi ta lahko izračunala 2-krat, da je vrednost, 625 00:52:23,560 --> 00:52:26,140 tako da zdaj ne potrebujemo svoj lasten okvir žetonov, 626 00:52:26,140 --> 00:52:31,180 in zdaj, ne glede na to, kako težko poskusu, boste morali - 627 00:52:31,180 --> 00:52:34,410 To ni rekurzivna rep. 628 00:52:34,410 --> 00:52:37,590 [Študent] Jaz bi poskusil, da bi rekurzijo, da si prizadeva za rep rekurzije - 629 00:52:37,590 --> 00:52:41,450 [Bowden] V idealnem svetu, ampak v CS50 vam ni treba. 630 00:52:43,780 --> 00:52:49,280 Da bi dobili rep rekurzijo, na splošno pa lahko določijo dodatne navedbe 631 00:52:49,280 --> 00:52:53,550 bar, kjer bo lahko v int x y 632 00:52:53,550 --> 00:52:56,990 in y enako končnemu stvar, ki jo želite, da se vrnete. 633 00:52:56,990 --> 00:53:03,650 Torej to, da boš lahko vrnil bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Torej, to je samo na visoki ravni, kako spremeniti stvari, ki se rep rekurzivno. 635 00:53:09,810 --> 00:53:13,790 Ampak ekstra argument - 636 00:53:13,790 --> 00:53:17,410 In potem, na koncu, ko ste dosegli svoj osnovni primer, ki ste jo pravkar vrnil y 637 00:53:17,410 --> 00:53:22,740 ker si nabira ves čas, vrne vrednost, ki jo želite. 638 00:53:22,740 --> 00:53:27,280 Si nekako so to počeli iterativno, vendar z uporabo rekurzivnih klicev. 639 00:53:32,510 --> 00:53:34,900 Vprašanja? 640 00:53:34,900 --> 00:53:39,890 [Študent] Mogoče pa aritmetične kazalec, tako kot pri uporabi nizov. >> Seveda. 641 00:53:39,890 --> 00:53:43,610 Kazalec aritmetično. 642 00:53:43,610 --> 00:53:48,440 Pri uporabi nizov je preprosto zato, ker so nizi char zvezde, 643 00:53:48,440 --> 00:53:51,860 znakov za vedno in vedno en zlog, 644 00:53:51,860 --> 00:53:57,540 in tako kazalec aritmetična enakovredna redni aritmetike, ko imate opravka s strunami. 645 00:53:57,540 --> 00:54:08,790 Reciva, char * s = "zdravo". 646 00:54:08,790 --> 00:54:11,430 Torej imamo blok v pomnilniku. 647 00:54:19,490 --> 00:54:22,380 Treba 6 bajte, ker ste vedno potrebovali null terminator. 648 00:54:22,380 --> 00:54:28,620 In char * i se dogaja, da opozarjajo na začetku tega polja. 649 00:54:28,620 --> 00:54:32,830 Torej je Poudarja tam. 650 00:54:32,830 --> 00:54:36,710 No, to je v bistvu, kako vsaka matrika deluje, 651 00:54:36,710 --> 00:54:40,780 ne glede na to, ali je bil donos po knjižnične funkcije malloc ali pa je na kupu. 652 00:54:40,780 --> 00:54:47,110 Vsaka matrika je v bistvu kazalec na začetku niza, 653 00:54:47,110 --> 00:54:53,640 in potem vsako polje delovanja, vsako indeksiranje, se bo samo v tem polju določenih izravnavo. 654 00:54:53,640 --> 00:55:05,360 >> Torej, ko sem rekel kaj takega ih [3], kar se bo s in 3 štetju znakov noter 655 00:55:05,360 --> 00:55:12,490 Torej s [3], imamo 0, 1, 2, 3, tako da s [3], se dogaja, da se nanašajo na ta l. 656 00:55:12,490 --> 00:55:20,460 [Študent] In smo lahko dosegli enako vrednost s tem, S + 3, nato pa oklepaje zvezda? 657 00:55:20,460 --> 00:55:22,570 Da. 658 00:55:22,570 --> 00:55:26,010 To je enako * (S + 3); 659 00:55:26,010 --> 00:55:31,240 in da je vedno in vedno enaka ne glede na to, kaj počnete. 660 00:55:31,240 --> 00:55:34,070 Vam nikoli ni treba uporabiti nosilec sintakso. 661 00:55:34,070 --> 00:55:37,770 Vedno lahko uporabite * (i + 3) skladnje. 662 00:55:37,770 --> 00:55:40,180 Ljudje pogosto radi nosilec sintakso, čeprav. 663 00:55:40,180 --> 00:55:43,860 [Študent] Torej so vsi nizi so v resnici le kazalci. 664 00:55:43,860 --> 00:55:53,630 Obstaja rahla razlika, ko rečem, int x [4] >> [Študent] Ali da ustvarite spomin? 665 00:55:53,630 --> 00:56:03,320 [Bowden] To bo ustvarilo 4 ints na kup, tako da 16 bitov na splošno. 666 00:56:03,320 --> 00:56:05,700 To bo ustvarilo 16 bajtov na kupu. 667 00:56:05,700 --> 00:56:09,190 x se ne shrani nikamor. 668 00:56:09,190 --> 00:56:13,420 To je samo simbol, ki se nanašajo na začetku stvari. 669 00:56:13,420 --> 00:56:17,680 Ker ste prijavljeni matriko znotraj te funkcije, 670 00:56:17,680 --> 00:56:22,340 kaj se dogaja prevajalnik storiti, je le zamenjati vse primerke spremenljivke x 671 00:56:22,340 --> 00:56:26,400 s tem, kje se je to zgodilo, da izberejo, da se ti 16 bajtov. 672 00:56:26,400 --> 00:56:30,040 Ne morem storiti s char * s, ker je je dejansko kazalec. 673 00:56:30,040 --> 00:56:32,380 Je brezplačno in se potem kaže na druge stvari. 674 00:56:32,380 --> 00:56:36,140 x je konstantna. Ne moreš se kažejo na različne matrike. >> [Študent] Ok. 675 00:56:36,140 --> 00:56:43,420 Toda ta ideja, ta indeksiranje, je enaka ne glede na to, ali gre za tradicionalno niz 676 00:56:43,420 --> 00:56:48,230 ali če je kazalec na nekaj ali, če je kazalec na malloced matrike. 677 00:56:48,230 --> 00:56:59,770 In v resnici je tako, da ustreza, da je ista stvar. 678 00:56:59,770 --> 00:57:05,440 To dejansko pomeni, le kaj je v oklepaju in kaj je ostalo od oklepaju 679 00:57:05,440 --> 00:57:07,970 jih sešteje, in dereferences. 680 00:57:07,970 --> 00:57:14,710 Torej, to je prav tako veljavna * (i + 3) ali s [3]. 681 00:57:16,210 --> 00:57:22,090 [Študent] Ali ste napotke, ki kažejo na 2-dimenzionalni nizi? 682 00:57:22,090 --> 00:57:27,380 >> To je težje. Običajno ne. 683 00:57:27,380 --> 00:57:34,720 2-dimenzionalni array je le 1-dimenzionalni niz z nekaj priročno sintakso 684 00:57:34,720 --> 00:57:54,110 ker če rečem, int x [3] [3], to je res samo 1 polje z 9 vrednostmi. 685 00:57:55,500 --> 00:58:03,000 In tako, ko sem indeks, prevajalnik ve, kaj mislim. 686 00:58:03,000 --> 00:58:13,090 Če rečem, x [1] [2], da ve, rad bi šel v drugo vrstico, tako da se bo preskočiti prvo 3, 687 00:58:13,090 --> 00:58:17,460 in potem hoče drugo stvar v tem, da se dogaja, da bi dobili tole. 688 00:58:17,460 --> 00:58:20,480 Ampak to je še vedno samo ena dvodimenzionalna matrika. 689 00:58:20,480 --> 00:58:23,660 In tako, če bi hotel dodeliti kazalec na tem polju, 690 00:58:23,660 --> 00:58:29,770 Rekel bi, int * p = x; 691 00:58:29,770 --> 00:58:33,220 Vrsta x je le - 692 00:58:33,220 --> 00:58:38,280 To je grobo rekel tip x saj je samo simbol, in to ni dejansko spremenljivka, 693 00:58:38,280 --> 00:58:40,140 ampak to je samo int *. 694 00:58:40,140 --> 00:58:44,840 x je samo kazalec na začetek tega. >> [Študent] Ok. 695 00:58:44,840 --> 00:58:52,560 In da mi ne bodo mogli dostopati [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Mislim, da je posebna sintaksa za razglasitev kazalec, 697 00:58:58,370 --> 00:59:12,480 nekaj smešno, kot int (* p [-. nekaj popolnoma smešno sploh ne vem. 698 00:59:12,480 --> 00:59:17,090 Vendar pa je sintaksa za razglasitev kazalce, kot so v oklepajih in stvari. 699 00:59:17,090 --> 00:59:22,960 Zato ni nujno, da vam to. 700 00:59:22,960 --> 00:59:26,640 Lahko se ozremo na nekaj, kar bi mi povej resnico. 701 00:59:26,640 --> 00:59:34,160 Bom kasneje poiskal, če je sintaksa za točko. Ampak nikoli ne boste videli. 702 00:59:34,160 --> 00:59:39,670 In tudi sintaksa je tako zastarela, da če jo uporabljate bodo ljudje šokirani. 703 00:59:39,670 --> 00:59:43,540 Večdimenzionalna polja so precej redki, kot je. 704 00:59:43,540 --> 00:59:44,630 Si precej - 705 00:59:44,630 --> 00:59:48,490 No, če delaš stvari matrične to ne bo redki, 706 00:59:48,490 --> 00:59:56,730 ampak v C ste redko dogaja, da se z uporabo večdimenzionalnih nize. 707 00:59:57,630 --> 01:00:00,470 Ja. >> [Študent] Recimo, da imate res dolgo vrsto. 708 01:00:00,470 --> 01:00:03,900 >> Tako v navideznem pomnilniku se zdi, da so vsi izvidi 709 01:00:03,900 --> 01:00:05,640 kot elementov, tik ob drugega, 710 01:00:05,640 --> 01:00:08,770 ampak v fizični pomnilnik, bi moralo biti omogočeno, da se razideta? >> Da. 711 01:00:08,770 --> 01:00:16,860 Kako virtualni spomin deluje, je to samo ločuje - 712 01:00:19,220 --> 01:00:24,860 Enota za dodelitev je stran, ki kaže, da je 4 kilobajtov, 713 01:00:24,860 --> 01:00:29,680 in tako, ko pravi proces, hej, želim uporabiti ta spomin, 714 01:00:29,680 --> 01:00:35,970 Operacijski sistem bo ji dodeli 4 kilobajtov za to malo blok pomnilnika. 715 01:00:35,970 --> 01:00:39,100 Tudi če uporabljate samo eno malo bajt v cel blok pomnilnika, 716 01:00:39,100 --> 01:00:42,850 operacijski sistem se dogaja, da ga v celoti 4 kilobajtov. 717 01:00:42,850 --> 01:00:49,410 Torej, kaj to pomeni, sem lahko - recimo, to je moj dimnik. 718 01:00:49,410 --> 01:00:53,180 Ta sklad bi lahko ločiti. Moje sklad lahko megabajtov in megabajti. 719 01:00:53,180 --> 01:00:55,020 Moje sklad lahko ogromni. 720 01:00:55,020 --> 01:01:00,220 Ampak sklad sama razdeli na posamezne strani, 721 01:01:00,220 --> 01:01:09,010 ki, če pogledamo sem recimo to je naša RAM, 722 01:01:09,010 --> 01:01:16,600 če imam 2 GB RAM-a, to je dejanski naslov 0, kot je bajt 0. mojega RAM, 723 01:01:16,600 --> 01:01:22,210 in to je 2 gigabajta vse tako daleč. 724 01:01:22,210 --> 01:01:27,230 Torej bi ta stran ustreza tej rubriki sem. 725 01:01:27,230 --> 01:01:29,400 To stran lahko ustrezajo tej rubriki sem. 726 01:01:29,400 --> 01:01:31,560 Ta je lahko ustreza tale tam. 727 01:01:31,560 --> 01:01:35,540 Tako operacijski sistem je brezplačno dodelitev fizičnega pomnilnika 728 01:01:35,540 --> 01:01:39,320 za vsako posamezno stran samovoljno. 729 01:01:39,320 --> 01:01:46,180 In to pomeni, da če se to zgodi, da segajo čez meje niz, 730 01:01:46,180 --> 01:01:50,070 matrika se zgodi, da ostane to in prav to reda strani, 731 01:01:50,070 --> 01:01:54,460 potem je matrika se bo razdeljeno v fizičnem pomnilniku. 732 01:01:54,460 --> 01:01:59,280 In potem, ko zaprete program, ko se proces konča, 733 01:01:59,280 --> 01:02:05,690 te preslikave se izbrišejo in potem je prost za uporabo teh malo blokov za druge stvari. 734 01:02:14,730 --> 01:02:17,410 Še vprašanja? 735 01:02:17,410 --> 01:02:19,960 [Študent] Kazalec Aritmetična. >> Oh ja. 736 01:02:19,960 --> 01:02:28,410 Strune so bile lažje, vendar si ogleduje nekaj podobnega ints, 737 01:02:28,410 --> 01:02:35,000 Torej nazaj na int x [4]; 738 01:02:35,000 --> 01:02:41,810 Ali je to polje, ali je kazalec na malloced paleto 4 cela števila, 739 01:02:41,810 --> 01:02:47,060 to bo treba obravnavati na enak način. 740 01:02:50,590 --> 01:02:53,340 [Študent] Torej nizi so na kup? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Matrike niso na kup. >> [Študent] Oh. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Ta vrsta matrike kaže, da je na kupu 743 01:03:08,320 --> 01:03:12,220 razen če ga deklarira - neupoštevanje globalne spremenljivke. Ne uporabljajte globalnih spremenljivk. 744 01:03:12,220 --> 01:03:16,280 Znotraj funkcije rečem int x [4]; 745 01:03:16,280 --> 01:03:22,520 To bo ustvarilo celo število 4-blok na kup za to polje. 746 01:03:22,520 --> 01:03:26,960 Ampak to malloc (4 * sizeof (int)); je šel na kup. 747 01:03:26,960 --> 01:03:31,870 Toda po tej točki lahko uporabim x in p v precej enak način, 748 01:03:31,870 --> 01:03:36,140 razen izjem, sem rekel prej o tem si lahko dodelite p. 749 01:03:36,140 --> 01:03:40,960 Tehnično njihove velikosti so nekoliko drugačna, vendar je to povsem nepomembno. 750 01:03:40,960 --> 01:03:43,310 Nikoli ne dejansko uporabljajo svoje velikosti. 751 01:03:48,020 --> 01:03:56,810 P Lahko bi rekel, p [3] = 2 ali x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Uporabite jih lahko v popolnoma enak način. 753 01:03:59,680 --> 01:04:01,570 Torej kazalec aritmetična zdaj - Da. 754 01:04:01,570 --> 01:04:07,390 [Študent] Ali vam ni treba storiti, p *, če imate nosilce? 755 01:04:07,390 --> 01:04:11,720 Nosilci so implicitni dereference. >> Redu. 756 01:04:11,720 --> 01:04:20,200 Pravzaprav je tudi to, kar praviš, da z lahko dobite večdimenzionalne matrike 757 01:04:20,200 --> 01:05:02,650 s kazalci, kaj lahko naredite, je nekaj takega kot, recimo, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Jaz bom samo pisati vse ven prvi. 759 01:05:37,880 --> 01:05:41,020 Nisem hotel tega. 760 01:05:41,020 --> 01:05:42,550 Ok. 761 01:05:42,550 --> 01:05:48,910 Kaj sem tu - To bi moralo biti odstotne točke [i]. 762 01:05:48,910 --> 01:05:53,680 Torej, pp je kazalec na kazalec. 763 01:05:53,680 --> 01:06:02,420 Saj mallocing odstotne točke na vrsto 5 zvezdic int. 764 01:06:02,420 --> 01:06:10,950 Torej, v spomin imate na kup odstotne točke 765 01:06:10,950 --> 01:06:20,150 To se dogaja, da kažejo na paleto 5 blokov, ki so vsi kazalci sami. 766 01:06:20,150 --> 01:06:28,210 In potem, ko sem malloc dol, sem malloc, da vsaka od teh posameznih kazalcev 767 01:06:28,210 --> 01:06:32,080 Naj opozorim, da poseben sveženj 4 bajte na kup. 768 01:06:32,080 --> 01:06:35,870 Torej, to kaže na 4 bajte. 769 01:06:37,940 --> 01:06:40,660 In to kaže na drugo 4 bajte. 770 01:06:40,660 --> 01:06:43,200 >> In vse od njih opozarjajo na svoje 4 bajte. 771 01:06:43,200 --> 01:06:49,080 To mi daje način, kako večdimenzionalne stvari. 772 01:06:49,080 --> 01:06:58,030 Lahko bi rekel, pp [3] [4], zdaj pa to ni ista stvar kot večdimenzionalne matrike 773 01:06:58,030 --> 01:07:05,390 ker večdimenzionalna polja preveden [3] [4] v en odmik v polju x. 774 01:07:05,390 --> 01:07:14,790 Ta dereferences p, dostopa do 3. kazalo, nato dereferences da 775 01:07:14,790 --> 01:07:20,790 in dostopov - bi 4 neveljavna - druga indeks. 776 01:07:24,770 --> 01:07:31,430 Ker ko smo imeli int x [3] [4], preden je večdimenzionalna polja 777 01:07:31,430 --> 01:07:35,740 in ko se dvakrat držalo, da je res samo ena dereference, 778 01:07:35,740 --> 01:07:40,490 ste po en kazalec in nato izravna, 779 01:07:40,490 --> 01:07:42,850 to je res 2D reference. 780 01:07:42,850 --> 01:07:45,840 Slediš 2 ločeni kazalca. 781 01:07:45,840 --> 01:07:50,420 Torej je to tudi tehnično omogoča, da imate večdimenzionalne matrike 782 01:07:50,420 --> 01:07:53,550 kjer je vsak posameznik matrika različnih velikosti. 783 01:07:53,550 --> 01:07:58,000 Zato mislim, da nazobčane večdimenzionalna polja je, kako se imenuje 784 01:07:58,000 --> 01:08:01,870 saj res lahko prva stvar, ki kaže na nekaj, kar je 10 elementov, 785 01:08:01,870 --> 01:08:05,540 Druga stvar, ki bi lahko kazal na nekaj, kar ima 100 elementov. 786 01:08:05,540 --> 01:08:10,790 [Študent] Ali obstaja omejitev števila kazalcev, da lahko imajo 787 01:08:10,790 --> 01:08:14,290 kaže na druge kazalce? Ne >> 788 01:08:14,290 --> 01:08:17,010 Lahko imaš int ***** str. 789 01:08:18,050 --> 01:08:23,760 Nazaj na aritmetične kazalec - >> [Študent] Oh. >> Ja. 790 01:08:23,760 --> 01:08:35,649 [Študent] Če imam int p ***, potem pa sem naredil Dereferenciranje in rečem: p * je enako tej vrednosti, 791 01:08:35,649 --> 01:08:39,560 je le, da bo naredil 1 raven Dereferenciranje? >> Da. 792 01:08:39,560 --> 01:08:43,340 Torej, če želim dostopati do stvari, da je zadnja kazalec, ki kaže na - 793 01:08:43,340 --> 01:08:46,210 Potem vam *** p. >> Redu. 794 01:08:46,210 --> 01:08:54,080 Torej, to je p opozarja na bloku 1, točke do drugega bloka, kaže na drugega bloka. 795 01:08:54,080 --> 01:09:02,010 Potem, če ne * p = kaj drugega, potem ste to spremembo 796 01:09:02,010 --> 01:09:13,640 do sedaj kaže na drugačen blok. >> Redu. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] In če ti malloced, potem ste zdaj ušli spomin 798 01:09:17,649 --> 01:09:20,430 razen če se zgodi, da imajo različne sklicevanja na to 799 01:09:20,430 --> 01:09:25,270 saj ne moreš dobiti nazaj tiste tiste, ki ste jo pravkar vrgel stran. 800 01:09:25,270 --> 01:09:29,550 Kazalec aritmetično. 801 01:09:29,550 --> 01:09:36,310 int x [4], se bo dodelila niz celih 4 802 01:09:36,310 --> 01:09:40,670 kjer je x gre opozoriti na začetku niza. 803 01:09:40,670 --> 01:09:50,420 Torej, ko sem rekel kaj takega x [1], želim, da pomeni iti v drugo celo število v matriki, 804 01:09:50,420 --> 01:09:53,319 kar bi bilo to. 805 01:09:53,319 --> 01:10:04,190 Ampak res, da je 4 bajte v polju, saj je to celo zasede 4 bajte. 806 01:10:04,190 --> 01:10:08,470 Torej odmik od 1. resnici pomeni odmik od 1 807 01:10:08,470 --> 01:10:12,030 krat večje ne glede na tip matrike je. 808 01:10:12,030 --> 01:10:17,170 To je niz celih števil, tako da ve, da ne 1 krat velikost notr, če želi izravnati. 809 01:10:17,170 --> 01:10:25,260 Druga skladnja. Ne pozabite, da je to enako * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Ko rečem, da je kazalec + 1, kar da se vrača je naslov, ki je kazalec shranjevanje 811 01:10:35,250 --> 01:10:40,360 plus 1-krat velikosti tipa kazalca. 812 01:10:40,360 --> 01:10:59,510 Torej, če je x = ox100, potem x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 In lahko zlorabijo to in kaj takega, kot char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 in c se zdaj dogaja, da je isti naslov kot x. 815 01:11:23,050 --> 01:11:26,040 c se bo enako ox100, 816 01:11:26,040 --> 01:11:31,490 ampak c + 1 bo enaka ox101 817 01:11:31,490 --> 01:11:38,030 saj je kazalec aritmetična odvisna od vrste kazalca, ki ga dodajate k. 818 01:11:38,030 --> 01:11:45,390 Torej c + 1, je videti na c, to je znak kazalec, zato se dogaja, da dodate 1 krat velikosti char, 819 01:11:45,390 --> 01:11:48,110 , ki se bo vedno 1, tako da boste dobili 101, 820 01:11:48,110 --> 01:11:54,890 ker če naredim x, ki je še vedno 100, x + 1 se bo 104. 821 01:11:56,660 --> 01:12:06,340 [Študent] Ali lahko C + + za napredek kazalec za 1? 822 01:12:06,340 --> 01:12:09,810 Ja, lahko. 823 01:12:09,810 --> 01:12:16,180 Tega ne moreš storiti, da se z x x saj je samo znak, da je konstantna, ne morete spremeniti x. 824 01:12:16,180 --> 01:12:22,610 >> Ampak c zgodi, da preprosto je kazalec, da C + + je povsem pravilna in bo prirastek po 1. 825 01:12:22,610 --> 01:12:32,440 Če si samo c int *, potem pa c + + bi se 104. 826 01:12:32,440 --> 01:12:41,250 + + Kazalec ne le kot aritmetično c + 1 bi naredil aritmetično kazalca. 827 01:12:43,000 --> 01:12:48,870 To je pravzaprav, kako veliko stvari, kot so vrsta spajanja - 828 01:12:49,670 --> 01:12:55,710 Namesto ustvarjanja kopije stvari, lahko namesto mimo - 829 01:12:55,710 --> 01:13:02,400 Všeč mi je, če sem hotel prenesti ta polovico matrike - kaj je izbrisalo nekaj od tega. 830 01:13:04,770 --> 01:13:10,520 Recimo, da sem hotel prenesti to stran matrike v funkciji. 831 01:13:10,520 --> 01:13:12,700 Kaj bi rad, na to funkcijo? 832 01:13:12,700 --> 01:13:17,050 Če grem mimo x, sem mimo tega naslova. 833 01:13:17,050 --> 01:13:23,780 Ampak jaz želim uspešno prestal to poseben naslov. Torej, kaj naj grem mimo? 834 01:13:23,780 --> 01:13:26,590 [Študent] Pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Torej x + 2. Da. 836 01:13:29,350 --> 01:13:31,620 To se dogaja, da se ta naslov. 837 01:13:31,620 --> 01:13:42,810 Prav tako boste zelo pogosto vidijo kot x [2] in nato naslov za to. 838 01:13:42,810 --> 01:13:47,850 Torej boste morali vzeti naslov za to, ker je nosilec je implicitna dereference. 839 01:13:47,850 --> 01:13:53,250 x [2], se nanaša na vrednost, ki je v tem polju, in nato želite, da se naslov te škatle, 840 01:13:53,250 --> 01:13:56,850 Tako si rekel & x [2]. 841 01:13:56,850 --> 01:14:02,880 Torej, to je, kako nekaj v vrste spajanja, kjer želite prenesti polovico seznama na nekaj 842 01:14:02,880 --> 01:14:08,790 res samo mimo & x [2], in zdaj, ko se tiče rekurzivni klic, 843 01:14:08,790 --> 01:14:12,510 moja nova matrika se začne tam. 844 01:14:12,510 --> 01:14:15,130 Zadnje minute vprašanja. 845 01:14:15,130 --> 01:14:20,050 [Študent] Če ne naredi 'in' znak ali - kaj je to reče? >> Zvezdica? 846 01:14:20,050 --> 01:14:23,200 [Študent] Star. >> Tehnično dereference operater, ampak - >> [Študent] dereference. 847 01:14:23,200 --> 01:14:29,310 >> Če nam ne dajo zvezdo ali znak pove, kaj se zgodi, če rečem, y = x in x je kazalec? 848 01:14:29,310 --> 01:14:34,620 Kaj je vrsta y? >> [Študent] Jaz bom samo rekel, da je kazalec 2. 849 01:14:34,620 --> 01:14:38,270 Torej, če si rekel y = x, zdaj pa x in y točka za isto stvar. >> [Študent] Točka za isto stvar. 850 01:14:38,270 --> 01:14:45,180 In če je x int kazalec? Bilo >> pritožujejo, ker jih ni mogoče dodeliti kazalca. 851 01:14:45,180 --> 01:14:46,540 [Študent] Ok. 852 01:14:46,540 --> 01:14:51,860 Ne pozabite, da kazalci, čeprav smo jih pripravi kakor puščice, 853 01:14:51,860 --> 01:15:02,010 res vse, kar trgovina - int * x - x je res vse, kar je nekaj podobnega shranjevanje ox100, 854 01:15:02,010 --> 01:15:06,490 , ki se zgodi, da predstavljajo kot kaže na shranjeno na bloku 100. 855 01:15:06,490 --> 01:15:19,660 Torej, ko sem rekel, int * y = x, jaz sem samo kopiranje ox100 v y, 856 01:15:19,660 --> 01:15:24,630 ki smo le, da bo predstavljajo kot y, prav tako kaže na ox100. 857 01:15:24,630 --> 01:15:39,810 In če rečem int i = (int) x, nato pa sem se dogaja, da shranite ne glede na vrednost ox100 je 858 01:15:39,810 --> 01:15:45,100 znotraj nje, zdaj pa bo treba razlagati kot celo število namesto kazalca. 859 01:15:45,100 --> 01:15:49,310 Ampak morate litine, ali pa se bo pritožil. 860 01:15:49,310 --> 01:15:53,300 [Študent] Torej hočeš reči, da glasuje - 861 01:15:53,300 --> 01:16:00,290 Ali bo treba litje int int x ali vlivanja y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Kaj? 863 01:16:03,700 --> 01:16:07,690 [Študent] Ok. Po teh oklepajih se tam dogaja, da je x ali ay tam? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Bodisi. x in y sta enakovredni. >> [Študent] Ok. 865 01:16:11,500 --> 01:16:14,390 Ker oni oba kazalca. >> Ja. 866 01:16:14,390 --> 01:16:21,050 [Študent] Zato bi bilo shranjevanje šestnajstiško 100 v integer obliki? >> [Bowden] Ja. 867 01:16:21,050 --> 01:16:23,620 Ampak ne glede na vrednost kaže na. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Ja. >> [Študent] Torej, samo naslov v integer obliki. Ok. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Če hočeš nekaj bizarnega razloga, 870 01:16:34,720 --> 01:16:38,900 bi lahko izključno s kazalci in nikoli ne ukvarjajo s števil 871 01:16:38,900 --> 01:16:49,240 in samo kot int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Potem boš dobil res zmeden, ko je kazalec aritmetično začne dogajati. 873 01:16:53,000 --> 01:16:56,570 Tako so številke, ki jih shranjujejo, so brez pomena. 874 01:16:56,570 --> 01:16:58,940 To je samo, kako ste končali njihovo razlago. 875 01:16:58,940 --> 01:17:02,920 Torej sem prost kopirati ox100 od int * za notr, 876 01:17:02,920 --> 01:17:07,790 in sem prosta za dodelitev - Ti si verjetno, da bo dobil vpil, da ni litje - 877 01:17:07,790 --> 01:17:18,160 Sem brez dodeliti nekaj podobnega (int *) ox1234 v tem samovoljno * int. 878 01:17:18,160 --> 01:17:25,480 Torej ox123 je prav tako veljavna pomnilniški naslov, kot je & y. 879 01:17:25,480 --> 01:17:32,060 & Y zgodi, da se vrnete nekaj, kar je precej ox123. 880 01:17:32,060 --> 01:17:35,430 [Študent], bi bilo to res kul način, da gredo iz šestnajstiško v decimalni obliki, 881 01:17:35,430 --> 01:17:39,230 všeč, če imate kazalec in ga odda kot int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Lahko res samo tiskanje z uporabo, kot so printf. 883 01:17:44,860 --> 01:17:50,300 Recimo, da imam int y = 100. 884 01:17:50,300 --> 01:18:02,700 Torej printf (% d \ n - kot bi že veste - tiskanje, ki so cela,% x. 885 01:18:02,700 --> 01:18:05,190 Mi bomo samo tiskanje je kot šestnajstiško. 886 01:18:05,190 --> 01:18:10,760 Torej se kazalec ne shrani kot šestnajstiško, 887 01:18:10,760 --> 01:18:12,960 in celo ne shrani kot decimalko. 888 01:18:12,960 --> 01:18:14,700 Vse je shranjeno v binarni obliki. 889 01:18:14,700 --> 01:18:17,950 To je samo, da smo nagnjeni k prikaz kazalcev, kot šestnajstiško 890 01:18:17,950 --> 01:18:23,260 ker menimo, da stvari v teh 4-bajtne bloke, 891 01:18:23,260 --> 01:18:25,390 in pomnilniške naslove ponavadi pozna. 892 01:18:25,390 --> 01:18:28,890 Smo kot, če se začne z BF, potem pa se zgodi, da bo na kupu. 893 01:18:28,890 --> 01:18:35,560 Torej, to je le naša interpretacija kazalcev, kot šestnajstiško. 894 01:18:35,560 --> 01:18:39,200 Ok. Kakšne zadnje vprašanje? 895 01:18:39,200 --> 01:18:41,700 >> Tukaj bom za nekaj časa po tem, ko, če imate kaj drugega. 896 01:18:41,700 --> 01:18:46,070 In to je konec tega. 897 01:18:46,070 --> 01:18:48,360 >> [Študent] Bravo! [Aplavz] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]