1 00:00:00,000 --> 00:00:02,520 [Powered by Google Translate] [Odjeljak 4 - ugodnije] 2 00:00:02,520 --> 00:00:04,850 [Rob Bowden - Sveučilište Harvard] 3 00:00:04,850 --> 00:00:07,370 [Ovo je CS50. - CS50.TV] 4 00:00:08,920 --> 00:00:13,350 Imamo komentar sutra, u slučaju da vi ne znate. 5 00:00:14,810 --> 00:00:20,970 To je u osnovi o svemu mogli ste vidjeti u razredu ili su trebali vidjeti u razredu. 6 00:00:20,970 --> 00:00:26,360 To uključuje pokazivače, iako su oni vrlo nedavno tema. 7 00:00:26,360 --> 00:00:29,860 Trebali bi barem razumjeti visoke razine njih. 8 00:00:29,860 --> 00:00:34,760 Sve što je prešao u razredu trebali razumjeti za kviz. 9 00:00:34,760 --> 00:00:37,320 Dakle, ako imate pitanja o njima, možete ih pitati sada. 10 00:00:37,320 --> 00:00:43,280 No, to će biti vrlo student na čelu sjednica gdje vi postavljati pitanja, 11 00:00:43,280 --> 00:00:45,060 pa se nadam da ljudi imaju pitanja. 12 00:00:45,060 --> 00:00:48,020 Ima li tko pitanja? 13 00:00:49,770 --> 00:00:52,090 Da. >> [Student] Mogu li ići preko pokazivača opet? 14 00:00:52,090 --> 00:00:54,350 Ja ću ići preko pokazivača. 15 00:00:54,350 --> 00:00:59,180 Svi vaši varijabli nužno živjeti u sjećanju, 16 00:00:59,180 --> 00:01:04,450 ali obično ne brinuti o tome, a vi samo reći x + 2 y + 3 17 00:01:04,450 --> 00:01:07,080 i prevodilac će shvatiti gdje su stvari žive za vas. 18 00:01:07,080 --> 00:01:12,990 Nakon što ste se bave pokazivače, sada izričito koristite one memorijske adrese. 19 00:01:12,990 --> 00:01:19,800 Dakle, jedna varijabla samo da će ikada živjeti u jednoj adresi u bilo kojem trenutku. 20 00:01:19,800 --> 00:01:24,040 Ako želimo da se proglasi pokazivač, što je vrsta će izgledati? 21 00:01:24,040 --> 00:01:26,210 >> Želim da proglasi pokazivač str. Što tip izgleda? 22 00:01:26,210 --> 00:01:33,530 [Student] int * p. >> Da. Dakle, int * p. 23 00:01:33,530 --> 00:01:38,030 I kako sam to učiniti ukazati na x? >> [Student] Ampersand. 24 00:01:40,540 --> 00:01:45,300 [Bowden] Dakle, znak za struju doslovno se zove adresa operatora. 25 00:01:45,300 --> 00:01:50,460 Dakle, kada kažem & x to je dobivanje memorijsku adresu varijable x. 26 00:01:50,460 --> 00:01:56,790 Dakle, sada imam pokazivač p, i bilo gdje u mom kodu mogu koristiti * p 27 00:01:56,790 --> 00:02:02,960 ili sam mogao koristiti x, a to će biti točno ista stvar. 28 00:02:02,960 --> 00:02:09,520 (* P). Što se to radi? Što to znači zvijezda? 29 00:02:09,520 --> 00:02:13,120 [Student] To znači da je vrijednost u tom trenutku. >> Da. 30 00:02:13,120 --> 00:02:17,590 Dakle, ako gledamo na to, to može biti vrlo korisno izvući dijagrame 31 00:02:17,590 --> 00:02:22,230 gdje je to kutijica memorije za x, što će se dogoditi da imaju vrijednost 4, 32 00:02:22,230 --> 00:02:25,980 onda imamo malo okvir memorije za p, 33 00:02:25,980 --> 00:02:31,590 i tako p ukazuje na x, tako da smo nacrtali strelicu iz p na X. 34 00:02:31,590 --> 00:02:40,270 Dakle, kada kažemo * p Mi tvrdimo ići na kutiji da je str. 35 00:02:40,270 --> 00:02:46,480 Star je slijediti strelicu, a zatim učinite što god želite s tom okviru tamo. 36 00:02:46,480 --> 00:03:01,090 Dakle, ja mogu reći * p = 7, te da će ići na kutiji da je x i promjena koje bi sedam. 37 00:03:01,090 --> 00:03:13,540 Ili bih mogao reći int z = * p * 2; To je zbunjujuće jer je zvijezda, zvijezda. 38 00:03:13,540 --> 00:03:19,230 Onaj zvijezda dereferencing p, druga zvijezda pomnoži sa dva. 39 00:03:19,230 --> 00:03:26,780 Obavijest bih mogao imati jednako dobro zamijenio * p sa x. 40 00:03:26,780 --> 00:03:29,430 Možete ih koristiti na isti način. 41 00:03:29,430 --> 00:03:38,000 A onda kasnije mogu imati p točku na potpuno novu stvar. 42 00:03:38,000 --> 00:03:42,190 Ja samo mogu reći p = &z; 43 00:03:42,190 --> 00:03:44,940 Dakle, sada p se više ne bodove na X, to ukazuje na z. 44 00:03:44,940 --> 00:03:50,510 I svaki put sam napraviti * p je isti kao i radi z. 45 00:03:50,510 --> 00:03:56,170 Tako je korisna stvar o tome je jednom počnemo uzimajući u funkcijama. 46 00:03:56,170 --> 00:03:59,790 >> To je vrsta beskorisno proglasiti pokazivač koji pokazuje na nešto 47 00:03:59,790 --> 00:04:03,140 i onda ste samo ga dereferencing 48 00:04:03,140 --> 00:04:06,060 kad ste mogli koristiti izvornu varijablu za početak. 49 00:04:06,060 --> 00:04:18,190 No, kada ste dobili u funkcijama - pa recimo imamo neku funkciju, int foo, 50 00:04:18,190 --> 00:04:32,810 koji uzima pokazivač i samo se * p = 6; 51 00:04:32,810 --> 00:04:39,990 Kao što smo vidjeli prije s swapa, ne možete učiniti djelotvorno swap i zasebnu funkciju 52 00:04:39,990 --> 00:04:45,180 a upravo prolazi cijela broja jer je sve u C uvijek prolazi vrijednosti. 53 00:04:45,180 --> 00:04:48,360 Čak i kada ste prolazi upućuje ste u prolazu vrijednosti. 54 00:04:48,360 --> 00:04:51,940 To samo tako dogodi da te vrijednosti su memorijske adrese. 55 00:04:51,940 --> 00:05:00,770 Dakle, kada kažem foo (p); sam prolazeći pokazivač na funkciju foo 56 00:05:00,770 --> 00:05:03,910 a zatim foo radi * p = 6; 57 00:05:03,910 --> 00:05:08,600 Dakle, unutar te funkcije, * p je uvijek jednak x, 58 00:05:08,600 --> 00:05:12,720 ali ja ne mogu koristiti x unutar te funkcije jer to nije opfateno roku tu funkciju. 59 00:05:12,720 --> 00:05:19,510 Dakle, * p = 6 je jedini način ja mogu pristupiti lokalnu varijablu iz druge funkcije. 60 00:05:19,510 --> 00:05:23,600 Ili, dobro, pokazivači su jedini način ja mogu pristupiti lokalnu varijablu iz druge funkcije. 61 00:05:23,600 --> 00:05:31,600 [Student] Recimo da ste htjeli vratiti pokazivač. Kako točno to učiniti? 62 00:05:31,600 --> 00:05:44,270 [Bowden] Povratak pokazivač kao nešto poput int y = 3; povratak & y? >> [Student] Aha. 63 00:05:44,270 --> 00:05:48,480 [Bowden] Ok. Vi nikada ne bi trebao to učiniti. To je loše. 64 00:05:48,480 --> 00:05:59,480 Mislim da sam vidjela u ovih predavanja slajdovima ste počeli vidjeti cijeli ovaj dijagram memorije 65 00:05:59,480 --> 00:06:02,880 gdje ovdje imaš memorijsku adresu 0 66 00:06:02,880 --> 00:06:09,550 i ovdje dolje imate memorijske adrese četiri nastupa ili dva na 32. 67 00:06:09,550 --> 00:06:15,120 Pa onda imaš neke stvari i neke stvari i onda imate svoj stack 68 00:06:15,120 --> 00:06:21,780 i ti imaš svoju hrpu, koju upravo počeo učiti o tome, odrastanju. 69 00:06:21,780 --> 00:06:24,390 [Student] Zar nije hrpa iznad stog? 70 00:06:24,390 --> 00:06:27,760 >> Da. Gomila je na vrhu, zar ne? >> [Student] Pa, on je stavio 0 na vrhu. 71 00:06:27,760 --> 00:06:30,320 [Student] Oh, on stavi 0 na vrhu. >> [Student] Oh, u redu. 72 00:06:30,320 --> 00:06:36,060 Odricanje od odgovornosti: Bilo gdje sa CS50 ćeš vidjeti da na ovaj način. >> [Student] Ok. 73 00:06:36,060 --> 00:06:40,290 To je samo da kad ste prvi put vidite hrpe, 74 00:06:40,290 --> 00:06:45,000 sviđa kada mislite hrpom mislite slaganje stvari na vrhu jedan drugoga. 75 00:06:45,000 --> 00:06:50,810 Dakle, mi imaju tendenciju da okretanje ovo okolo tako stog raste kao stog inače 76 00:06:50,810 --> 00:06:55,940 umjesto hrpe visi. >> [Student] Ne hrpe tehnički odrasti previše, iako? 77 00:06:55,940 --> 00:07:01,100 To ovisi o tome što znači odrasti. 78 00:07:01,100 --> 00:07:04,010 Stog i hrpa uvijek raste u suprotnim smjerovima. 79 00:07:04,010 --> 00:07:09,420 Stog uvijek raste u smislu da je odrastao 80 00:07:09,420 --> 00:07:12,940 prema višim memorijske adrese, i nagomilati raste prema dolje 81 00:07:12,940 --> 00:07:17,260 u da raste prema nižim memorijskim adresama. 82 00:07:17,260 --> 00:07:20,250 Dakle, na vrhu je 0, a dno je visoke memorijske adrese. 83 00:07:20,250 --> 00:07:26,390 Oni oboje raste, samo u suprotnim smjerovima. 84 00:07:26,390 --> 00:07:29,230 [Student] Ja samo značilo da zato što je rekao da stavi snop na dnu 85 00:07:29,230 --> 00:07:33,640 jer mi se čini više intuitivno, jer za hrpu početi na vrhu hrpe, 86 00:07:33,640 --> 00:07:37,520 gomila je na vrhu sebe previše, pa that's - >> Da. 87 00:07:37,520 --> 00:07:44,960 Također mislim na hrpi kao odrastanja i veći, ali stog više. 88 00:07:44,960 --> 00:07:50,280 Dakle, stog je onaj koji smo vrsta žele pokazati odrastanja. 89 00:07:50,280 --> 00:07:55,390 Ali kud god da pogledamo inače će pokazati adresu 0 na vrh 90 00:07:55,390 --> 00:07:59,590 i najviši memorijska adresa na dnu, tako da je ovo vaš uobičajeni pogled memorije. 91 00:07:59,590 --> 00:08:02,100 >> Imate li pitanje? 92 00:08:02,100 --> 00:08:04,270 [Student] Možete li nam reći nešto više o hrpi? 93 00:08:04,270 --> 00:08:06,180 Da. Ja ću dobiti da u drugi. 94 00:08:06,180 --> 00:08:12,220 Prvo, ide natrag zašto povratka & Y je loša stvar, 95 00:08:12,220 --> 00:08:18,470 na stog imate hrpu stog okvira koji predstavljaju sve funkcije 96 00:08:18,470 --> 00:08:20,460 koji su bili pozvani. 97 00:08:20,460 --> 00:08:27,990 Dakle ignoriranje prethodnih stvari, na vrhu vašeg stacka uvijek će biti glavna funkcija 98 00:08:27,990 --> 00:08:33,090 budući da je prvi funkcija koja se zove. 99 00:08:33,090 --> 00:08:37,130 I onda kad zoveš drugu funkciju, stog će rasti prema dolje. 100 00:08:37,130 --> 00:08:41,640 Dakle, ako sam nazvati neku funkciju, Foo, i to dobiva svoj vlastiti stog okvir, 101 00:08:41,640 --> 00:08:47,280 to može nazvati neke funkcije, bar, ona dobiva svoj vlastiti stog okvir. 102 00:08:47,280 --> 00:08:49,840 A bar mogao biti rekurzivna i to bi mogao se zvati, 103 00:08:49,840 --> 00:08:54,150 i tako da drugi poziv na traci će dobiti svoj vlastiti stog okvir. 104 00:08:54,150 --> 00:08:58,880 I tako ono što ide u tim okvirima stog su sve lokalne varijable 105 00:08:58,880 --> 00:09:03,450 i sve funkcije argumenata da - 106 00:09:03,450 --> 00:09:08,730 Bilo stvari koje su lokalno opfateno na ovoj funkciji ići u tim okvirima stog. 107 00:09:08,730 --> 00:09:21,520 Dakle, to znači da kad sam rekao nešto slično bar je funkcija, 108 00:09:21,520 --> 00:09:29,270 Samo ću objaviti cijeli broj, a zatim se vratiti pokazivač na taj cijeli. 109 00:09:29,270 --> 00:09:33,790 Dakle, gdje se god živjeti? 110 00:09:33,790 --> 00:09:36,900 [Student] y živi u baru. >> [Bowden] Aha. 111 00:09:36,900 --> 00:09:45,010 Negdje u tom malom trgu memorije je littler trg koji ima y u njemu. 112 00:09:45,010 --> 00:09:53,370 Kad sam se vratiti i y, ja sam se vraćaju pokazivač na ovom malom bloku memorije. 113 00:09:53,370 --> 00:09:58,400 Ali onda kada funkciju vraća, njegova stog okvir dobiva popped off snop. 114 00:10:01,050 --> 00:10:03,530 I to je razlog zašto se zove stog. 115 00:10:03,530 --> 00:10:06,570 To je kao strukture stog podataka, ako znate što je to. 116 00:10:06,570 --> 00:10:11,580 Ili čak kao hrpu ladica je uvijek primjer, 117 00:10:11,580 --> 00:10:16,060 Glavni će ići na dnu, zatim prvi funkcija nazovete će ići na vrhu da, 118 00:10:16,060 --> 00:10:20,400 i ne može se vratiti na glavni dok se ne vratite iz svih funkcija koje su pod nazivom 119 00:10:20,400 --> 00:10:22,340 koji su smješteni na vrhu. 120 00:10:22,340 --> 00:10:28,650 >> [Student] Dakle, ako vam je to vratiti i y, koja vrijednost je podložan promjenama bez prethodne najave. 121 00:10:28,650 --> 00:10:31,290 Da, it's - >> [student] To bi mogao biti prepisan. >> Da. 122 00:10:31,290 --> 00:10:34,660 To je u potpunosti - Ako ste probati i - 123 00:10:34,660 --> 00:10:38,040 To bi također biti int bar * jer je vraća pokazivač, 124 00:10:38,040 --> 00:10:41,310 tako da je njegova povratni tip je int *. 125 00:10:41,310 --> 00:10:46,500 Ako pokušate koristiti povratnu vrijednost ove funkcije, to je nedefinirano ponašanje 126 00:10:46,500 --> 00:10:51,770 jer da pokazivač pokazuje na lošem sjećanju. >> [Student] Ok. 127 00:10:51,770 --> 00:11:01,250 Pa što ako, na primjer, proglasio int * y = malloc (sizeof (int))? 128 00:11:01,250 --> 00:11:03,740 To je bolje. Da. 129 00:11:03,740 --> 00:11:07,730 [Student] Razgovarali smo o tome kako, kada smo povucite stvari na naš koš za smeće 130 00:11:07,730 --> 00:11:11,750 oni ne zapravo izbrisani, a mi se samo izgubiti svoje naputke. 131 00:11:11,750 --> 00:11:15,550 Dakle, u ovom slučaju mi ​​zapravo izbriše vrijednost ili je to još uvijek postoji u sjećanju? 132 00:11:15,550 --> 00:11:19,130 Za veći dio, to će još uvijek biti tamo. 133 00:11:19,130 --> 00:11:24,220 No, recimo da mi se dogoditi nazvati neku drugu funkciju, Baz. 134 00:11:24,220 --> 00:11:28,990 Baz će dobiti svoj stack frame ovdje. 135 00:11:28,990 --> 00:11:31,470 To će biti prepisivanja sve ove stvari, 136 00:11:31,470 --> 00:11:34,180 i onda ako kasnije probati i koristiti pokazivač da li je dobio prije, 137 00:11:34,180 --> 00:11:35,570 to neće biti ista vrijednost. 138 00:11:35,570 --> 00:11:38,150 To se događa da su se promijenile samo zato što se zove funkcije Baz. 139 00:11:38,150 --> 00:11:43,080 [Student] Ali nije mi ne bismo dobili još tri? 140 00:11:43,080 --> 00:11:44,990 [Bowden] U svim vjerojatnost, što bi. 141 00:11:44,990 --> 00:11:49,670 No, ne možete se osloniti na to. C samo kaže nedefinirano ponašanje. 142 00:11:49,670 --> 00:11:51,920 >> [Student] Oh, to ne. Ok. 143 00:11:51,920 --> 00:11:58,190 Dakle, ako želite da se vrati pokazivač, ovo je mjesto gdje malloc dolazi u uporabi. 144 00:12:00,930 --> 00:12:15,960 Pišem zapravo samo vratili malloc (3 * sizeof (int)). 145 00:12:17,360 --> 00:12:24,050 Mi ćemo ići preko malloc više u drugi, ali ideja malloc je sve svoje lokalne varijable 146 00:12:24,050 --> 00:12:26,760 uvijek ići na stog. 147 00:12:26,760 --> 00:12:31,570 Sve što je malloced ide na hrpu, i to će zauvijek i uvijek biti na hrpi 148 00:12:31,570 --> 00:12:34,490 dok je izričito ga osloboditi. 149 00:12:34,490 --> 00:12:42,130 Dakle, to znači da kada malloc nešto, to će preživjeti nakon funkcijskih vraća. 150 00:12:42,130 --> 00:12:46,800 [Student] Hoće li preživjeti nakon Program zaustavi? >> Ne 151 00:12:46,800 --> 00:12:53,180 Ok, tako da će biti tamo dok program je sve način učinio trčanje. >> Da. 152 00:12:53,180 --> 00:12:57,510 Možemo ići preko pojedinosti o tome što se događa kada se program zaustavi. 153 00:12:57,510 --> 00:13:02,150 Možda ćete morati da me podsjeti, ali to je zasebna stvar u cijelosti. 154 00:13:02,150 --> 00:13:04,190 [Student] Pa malloc stvara pokazivač? >> Da. 155 00:13:04,190 --> 00:13:13,030 Malloc - >> [student] Mislim malloc označava blok memorije koja pokazivač može koristiti. 156 00:13:15,400 --> 00:13:19,610 [Bowden] Želim da dijagram opet. >> [Student] Dakle, ova funkcija radi, iako? 157 00:13:19,610 --> 00:13:26,430 [Student] Da, malloc označava blok memorije koju možete koristiti, 158 00:13:26,430 --> 00:13:30,470 a zatim ga vraća adresu prvog bloka te memorije. 159 00:13:30,470 --> 00:13:36,750 >> [Bowden] Aha. Dakle, kada ste malloc, ti si grabbing neki blok memorije 160 00:13:36,750 --> 00:13:38,260 koja je trenutno u hrpi. 161 00:13:38,260 --> 00:13:43,040 Ako gomila je premala, onda hrpa samo će rasti, a raste u tom smjeru. 162 00:13:43,040 --> 00:13:44,650 Pa recimo hrpa je premala. 163 00:13:44,650 --> 00:13:49,960 Tada je riječ o rastu malo i vratiti pokazivač na ovom bloku koji samo rasla. 164 00:13:49,960 --> 00:13:55,130 Kada besplatne stvari, radite više prostora u gomili, 165 00:13:55,130 --> 00:14:00,030 pa onda kasnije nazvati za malloc može ponovno tu memoriju koju je prethodno oslobodio. 166 00:14:00,030 --> 00:14:09,950 Važna stvar o malloc i free je da vam daje potpunu kontrolu 167 00:14:09,950 --> 00:14:12,700 tijekom trajanja tih memorijskih blokova. 168 00:14:12,700 --> 00:14:15,420 Globalne varijable su uvijek živ. 169 00:14:15,420 --> 00:14:18,500 Lokalne varijable su živi unutar svog djelokruga. 170 00:14:18,500 --> 00:14:22,140 Čim idete prošlosti kovrčave vitice, lokalne varijable su mrtvi. 171 00:14:22,140 --> 00:14:28,890 Malloced memorija je živ kada želite da bude živ 172 00:14:28,890 --> 00:14:33,480 , a zatim je pušten kada ga reći da će biti objavljen. 173 00:14:33,480 --> 00:14:38,420 Oni su zapravo samo tri vrste memorije, stvarno. 174 00:14:38,420 --> 00:14:41,840 Tu je automatsko upravljanje memorijom, što je stog. 175 00:14:41,840 --> 00:14:43,840 Stvari se dogoditi za vas automatski. 176 00:14:43,840 --> 00:14:46,910 Kada kažem int x, memorija se dodjeljuje za int x. 177 00:14:46,910 --> 00:14:51,630 Kada x odlazi iz djelokruga, memorija je obuzela za x. 178 00:14:51,630 --> 00:14:54,790 Zatim tu je dinamičan upravljanje memorijom, što je ono što malloc je, 179 00:14:54,790 --> 00:14:56,740 koji je kada imate kontrolu. 180 00:14:56,740 --> 00:15:01,290 Vi dinamički odlučiti kada memorije treba i ne treba biti dodijeljeno. 181 00:15:01,290 --> 00:15:05,050 A onda tu je statična, što samo znači da je to živi vječno, 182 00:15:05,050 --> 00:15:06,610 što je ono što su globalne varijable su. 183 00:15:06,610 --> 00:15:10,240 Oni su samo uvijek u sjećanju. 184 00:15:10,960 --> 00:15:12,760 >> Pitanja? 185 00:15:14,490 --> 00:15:17,230 [Student] Može li definirati blok samo pomoću vitičastih zagrada 186 00:15:17,230 --> 00:15:21,220 ali ne moraju imati, ako izjavi ili while ili nešto slično? 187 00:15:21,220 --> 00:15:29,130 Možete definirati blok kao u funkciji, ali da ima vitičastim zagradama previše. 188 00:15:29,130 --> 00:15:32,100 [Student] Pa ne možete samo imati kao slučajni para vitičastih zagrada u kodu 189 00:15:32,100 --> 00:15:35,680 koje imaju lokalne varijable? >> Da, možete. 190 00:15:35,680 --> 00:15:45,900 Unutar int bar smo mogli imati {int y = 3;}. 191 00:15:45,900 --> 00:15:48,440 To je trebao biti ovdje. 192 00:15:48,440 --> 00:15:52,450 No, da u potpunosti definira opseg int y. 193 00:15:52,450 --> 00:15:57,320 Nakon toga drugi kovrčave vitice, y ne mogu koristiti više. 194 00:15:57,910 --> 00:16:00,630 Gotovo nikada učiniti, iako. 195 00:16:02,940 --> 00:16:07,370 Vratimo se na ono što se događa kada program završi, 196 00:16:07,370 --> 00:16:18,760 postoji vrsta zabluda / pola laži koje dajemo kako bi samo napraviti stvari lakše. 197 00:16:18,760 --> 00:16:24,410 Mi vam reći da kada se alocirati memoriju 198 00:16:24,410 --> 00:16:29,860 ti si neki dodjele komad RAM-a za tu varijablu. 199 00:16:29,860 --> 00:16:34,190 Ali niste stvarno izravno dira RAM ikada u svojim programima. 200 00:16:34,190 --> 00:16:37,490 Ako mislite o tome, kako sam nacrtao - 201 00:16:37,490 --> 00:16:44,330 A zapravo, ako idete kroz u GDB vidjet ćete istu stvar. 202 00:16:51,120 --> 00:16:57,590 Bez obzira koliko puta ste pokrenuti program ili što program radite, 203 00:16:57,590 --> 00:16:59,950 stog uvijek će početi - 204 00:16:59,950 --> 00:17:06,510 uvijek ćeš vidjeti varijable oko adresa oxbffff nešto. 205 00:17:06,510 --> 00:17:09,470 To je obično negdje u toj regiji. 206 00:17:09,470 --> 00:17:18,760 Ali kako mogu dva programi možda imaju upućuje na isto memorije? 207 00:17:20,640 --> 00:17:27,650 [Student] Ima neka proizvoljna oznaka gdje oxbfff je trebao biti na RAM 208 00:17:27,650 --> 00:17:31,320 koji zapravo mogu biti u različitim mjestima, ovisno o tome kada je funkcija zove. 209 00:17:31,320 --> 00:17:35,920 Da. Pojam je virtualna memorija. 210 00:17:35,920 --> 00:17:42,250 Ideja je da svaki proces, svaki program koji se izvodi na računalu 211 00:17:42,250 --> 00:17:49,450 ima vlastitu - pretpostavimo 32 bita - potpuno neovisan adresnog prostora. 212 00:17:49,450 --> 00:17:51,590 Ovo je adresni prostor. 213 00:17:51,590 --> 00:17:56,220 To ima svoje potpuno neovisne četiri gigabajta za korištenje. 214 00:17:56,220 --> 00:18:02,220 >> Dakle, ako vam ponestane dva programa istovremeno, ovaj program vidi četiri gigabajta sebi, 215 00:18:02,220 --> 00:18:04,870 ovaj program vidi četiri gigabajta sebi, 216 00:18:04,870 --> 00:18:07,720 a to je nemoguće za ovaj program dereference pokazivač 217 00:18:07,720 --> 00:18:10,920 , a završiti s memorijom iz ovog programa. 218 00:18:10,920 --> 00:18:18,200 I ono što je virtualna memorija je mapiranje iz prostora procesa adresa 219 00:18:18,200 --> 00:18:20,470 stvarnim stvari na RAM. 220 00:18:20,470 --> 00:18:22,940 Dakle, to je do svog operativnog sustava je znati da, 221 00:18:22,940 --> 00:18:28,080 hej, kad je ovaj pokazivač čovjek dereferences oxbfff, to zapravo znači 222 00:18:28,080 --> 00:18:31,040 da želi RAM bajt 1000, 223 00:18:31,040 --> 00:18:38,150 a ako se to oxbfff Program dereferences, on stvarno želi RAM bajt 10000. 224 00:18:38,150 --> 00:18:41,590 Oni mogu biti proizvoljno udaljeni. 225 00:18:41,590 --> 00:18:48,730 To je čak i istina stvari unutar jednog procesa adresnog prostora. 226 00:18:48,730 --> 00:18:54,770 Dakle, kao što se vidi sve četiri gigabajta sebi, ali recimo - 227 00:18:54,770 --> 00:18:57,290 [Student] Da li svaki pojedini proces - 228 00:18:57,290 --> 00:19:01,350 Recimo imate računalo sa samo četiri gigabajta RAM-a. 229 00:19:01,350 --> 00:19:06,430 Da li svaki proces vidjeti cijeli 4 gigabajta? >> Da. 230 00:19:06,430 --> 00:19:13,060 Ali četiri gigabajta to vidi je laž. 231 00:19:13,060 --> 00:19:20,460 To je samo ona misli da ima sve ovo sjećanje, jer ne znam bilo koji drugi proces postoji. 232 00:19:20,460 --> 00:19:28,140 To će koristiti samo kao puno memorije jer zapravo treba. 233 00:19:28,140 --> 00:19:32,340 Operativni sustav neće dati RAM ovom procesu 234 00:19:32,340 --> 00:19:35,750 ako to ne koristeći bilo memoriju u ovoj cijeloj regiji. 235 00:19:35,750 --> 00:19:39,300 To se neće dati memorije za tu regiju. 236 00:19:39,300 --> 00:19:54,780 No, ideja je da se - Pokušavam se sjetiti - ja ne mogu misliti na analogiji. 237 00:19:54,780 --> 00:19:56,780 Analogije su teško. 238 00:19:57,740 --> 00:20:02,700 Jedan od problema virtualne memorije ili jedna od stvari to je rješavanje 239 00:20:02,700 --> 00:20:06,810 je da procesi trebaju biti potpuno svjesni jedan drugoga. 240 00:20:06,810 --> 00:20:12,140 I tako možete pisati bilo koji program koji samo dereferences bilo pokazivač, 241 00:20:12,140 --> 00:20:19,340 sviđa samo napisati program koji kaže * (ox1234), 242 00:20:19,340 --> 00:20:22,890 i da je dereferencing memorijska adresa 1234. 243 00:20:22,890 --> 00:20:28,870 >> No, to je do operativnog sustava kako bi onda prevesti što znači 1234. 244 00:20:28,870 --> 00:20:33,960 Dakle, ako se dogodi da se 1234 vrijedi memorijska adresa za ovaj proces, 245 00:20:33,960 --> 00:20:38,800 kao da je na dimnjaku ili tako nešto, onda će to vratiti vrijednost tog memorijsku adresu 246 00:20:38,800 --> 00:20:41,960 koliko proces zna. 247 00:20:41,960 --> 00:20:47,520 Ali ako 1234 nije valjana adresa, kao što se to događa na zemlji 248 00:20:47,520 --> 00:20:52,910 u nekom malom komadu memorije ovdje da je izvan dimnjaka i izvan hrpi 249 00:20:52,910 --> 00:20:57,200 a niste stvarno koristi, onda je to kad se stvari poput segfaults 250 00:20:57,200 --> 00:21:00,260 jer ste dira memorije koju ne treba dira. 251 00:21:07,180 --> 00:21:09,340 To je također istina - 252 00:21:09,340 --> 00:21:15,440 32-bitni sustav, 32 bita znači da imate 32 bita definiraju memorijsku adresu. 253 00:21:15,440 --> 00:21:22,970 To je razlog zašto pointeri su 8 bajtova jer 32 bita su 8 bytes - ili 4 bajta. 254 00:21:22,970 --> 00:21:25,250 Pokazivači su četiri bajta. 255 00:21:25,250 --> 00:21:33,680 Dakle, kada vidite pokazivač poput oxbfffff, koji je - 256 00:21:33,680 --> 00:21:40,080 Unutar svakom programu možete jednostavno konstruirati bilo proizvoljnog pokazivač, 257 00:21:40,080 --> 00:21:46,330 nigdje iz ox0 da volovskih 8 f's - ffffffff. 258 00:21:46,330 --> 00:21:49,180 [Student] Zar vam reći da su četiri bajta? >> Da. 259 00:21:49,180 --> 00:21:52,730 [Student] Onda svaki bajt će imati - >> [Bowden] Heksadecimalni. 260 00:21:52,730 --> 00:21:59,360 Heksadecimalni - 5, 6, 7, 8. Dakle, upućuje da ćeš uvijek vidjeti u heksadecimalnom. 261 00:21:59,360 --> 00:22:01,710 To je samo kako ćemo klasificirati naputke. 262 00:22:01,710 --> 00:22:05,240 Svake dvije znamenke heksadecimalnom je jedan bajt. 263 00:22:05,240 --> 00:22:09,600 Tako će biti osam heksadecimalnih znamenki za 4 bajta. 264 00:22:09,600 --> 00:22:14,190 Dakle, svaki pokazivač na 32-bitni sustav će biti 4 bajta, 265 00:22:14,190 --> 00:22:18,550 što znači da je u procesu možete konstruirati bilo proizvoljnih 4 bajta 266 00:22:18,550 --> 00:22:20,550 i napraviti pokazivač izvan nje, 267 00:22:20,550 --> 00:22:32,730 što znači da što se tiče da je svjestan, to može riješiti cijeli 2 do 32 bajtova memorije. 268 00:22:32,730 --> 00:22:34,760 Iako se to zapravo ne imati pristup koji, 269 00:22:34,760 --> 00:22:40,190 čak i ako vaše računalo ima samo 512 megabajta, ona misli da ima toliko memorije. 270 00:22:40,190 --> 00:22:44,930 A operativni sustav je dovoljno pametan da je to samo će izdvojiti ono što vam je zapravo potrebno. 271 00:22:44,930 --> 00:22:49,630 To ne samo ići, oh, novi proces: 4 nastupa. 272 00:22:49,630 --> 00:22:51,930 >> Da. >> [Student] Što vol znači? Zašto ste ga pisati? 273 00:22:51,930 --> 00:22:54,980 To je samo simbol za heksadecimalnom. 274 00:22:54,980 --> 00:22:59,590 Kada vidite broj start s vola, uzastopna stvari su heksadecimalni. 275 00:23:01,930 --> 00:23:05,760 [Student] Ti si objasniti o tome što se događa kada program završi. >> Da. 276 00:23:05,760 --> 00:23:09,480 Što se događa kad program završi je operativni sustav 277 00:23:09,480 --> 00:23:13,600 samo briše preslikavanja koje ona ima za tim adresama, i to je to. 278 00:23:13,600 --> 00:23:17,770 Operativni sustav sada može samo dati tu memoriju na drugom programu za korištenje. 279 00:23:17,770 --> 00:23:19,490 [Student] Ok. 280 00:23:19,490 --> 00:23:24,800 Dakle, kada ste izdvojiti nešto na hrpi ili stog ili globalne varijable ili bilo što, 281 00:23:24,800 --> 00:23:27,010 svi oni samo nestati čim Program završava 282 00:23:27,010 --> 00:23:32,120 jer operativni sustav je sada slobodan dati da sjećanje na bilo koji drugi proces. 283 00:23:32,120 --> 00:23:35,150 [Student] Iako postoje vjerojatno još uvijek vrijednosti napisane u? >> Da. 284 00:23:35,150 --> 00:23:37,740 Vrijednosti su vjerojatno još uvijek tamo. 285 00:23:37,740 --> 00:23:41,570 To je samo da će to biti teško dobiti na njih. 286 00:23:41,570 --> 00:23:45,230 To je puno teže dobiti na njih nego ga je dobiti na izbrisane datoteke 287 00:23:45,230 --> 00:23:51,450 jer briše datoteku vrsta tamo sjedi za dugo vremena, a hard disk je puno veća. 288 00:23:51,450 --> 00:23:54,120 Dakle, to će prebrisati različite dijelove memorije 289 00:23:54,120 --> 00:23:58,640 prije nego se dogodi da prebrisati komad memorije da je datoteka se koristi za biti. 290 00:23:58,640 --> 00:24:04,520 No, glavna memorija, RAM, vozite bicikl kroz puno brže, 291 00:24:04,520 --> 00:24:08,040 tako da će vrlo brzo biti prepisane. 292 00:24:10,300 --> 00:24:13,340 Pitanja na ovaj ili nešto drugo? 293 00:24:13,340 --> 00:24:16,130 [Student] Imam pitanja o različitim temama. >> Ok. 294 00:24:16,130 --> 00:24:19,060 Ima li netko pitanja o ovome? 295 00:24:20,170 --> 00:24:23,120 >> Ok. Različite temu. >> [Student] Ok. 296 00:24:23,120 --> 00:24:26,550 Bio sam prolazio kroz neke od praksi testovi, 297 00:24:26,550 --> 00:24:30,480 a jedan od njih je riječ o sizeof 298 00:24:30,480 --> 00:24:35,630 i vrijednost koja se vraća ili različite varijabilne vrste. >> Da. 299 00:24:35,630 --> 00:24:45,060 I to je rekao da su obje int i dugo i povratak četiri, pa oni su oba 4 bajta dugo. 300 00:24:45,060 --> 00:24:48,070 Je li postoji razlika između int i dugo, ili je to ista stvar? 301 00:24:48,070 --> 00:24:50,380 Da, postoji razlika. 302 00:24:50,380 --> 00:24:52,960 C standard - 303 00:24:52,960 --> 00:24:54,950 Vjerojatno ću zabrljati. 304 00:24:54,950 --> 00:24:58,800 C Standardna baš kao što je C, službena dokumentacija C. 305 00:24:58,800 --> 00:25:00,340 To je ono što on kaže. 306 00:25:00,340 --> 00:25:08,650 Dakle C standardno samo kaže da je char će zauvijek i uvijek će biti jedan bajt. 307 00:25:10,470 --> 00:25:19,040 Sve nakon toga - kratko je uvijek samo definira kao veći ili jednak char. 308 00:25:19,040 --> 00:25:23,010 To bi moglo biti strogo veći od, ali ne pozitivno. 309 00:25:23,010 --> 00:25:31,940 Int samo je definirana kao veća od ili jednaka do kratko. 310 00:25:31,940 --> 00:25:36,210 I dug samo je definirana kao veća od ili jednaka do int. 311 00:25:36,210 --> 00:25:41,600 I dugo dugo je veći ili jednak dugo. 312 00:25:41,600 --> 00:25:46,610 Dakle, jedina stvar C standard definira je relativna poredak od svega. 313 00:25:46,610 --> 00:25:54,880 Stvarna količina memorije da stvari uzme je općenito do provedbe, 314 00:25:54,880 --> 00:25:57,640 ali to je prilično dobro definirana u ovom trenutku. >> [Student] Ok. 315 00:25:57,640 --> 00:26:02,490 Dakle, gaćice su gotovo uvijek će biti dva bajta. 316 00:26:04,920 --> 00:26:09,950 Ints su gotovo uvijek će biti 4 bajta. 317 00:26:12,070 --> 00:26:15,340 Duge čezne su gotovo uvijek će biti 8 bajtova. 318 00:26:17,990 --> 00:26:23,160 I čezne, to ovisi o tome hoće li koristite 32-bitni ili 64-bitni sustav. 319 00:26:23,160 --> 00:26:27,450 Tako dugo će odgovarati vrsti sustava. 320 00:26:27,450 --> 00:26:31,920 Ako koristite 32-bitni sustav kao Appliance, to će biti 4 bajta. 321 00:26:34,530 --> 00:26:42,570 Ako koristite 64-bitnu kao puno posljednjih računala, to će biti 8 bajtova. 322 00:26:42,570 --> 00:26:45,230 >> Ints su gotovo uvijek 4 bajta u ovom trenutku. 323 00:26:45,230 --> 00:26:47,140 Duge čezne su gotovo uvijek 8 bajtova. 324 00:26:47,140 --> 00:26:50,300 U prošlosti, Ints koristiti samo biti dva bajta. 325 00:26:50,300 --> 00:26:56,840 Ali primijetite da je ovo u potpunosti zadovoljava sve ove odnosa veća nego i jednaka. 326 00:26:56,840 --> 00:27:01,280 Tako dugo savršeno je dozvoljeno da bude iste veličine kao cijeli broj, 327 00:27:01,280 --> 00:27:04,030 i to je također dozvoljeno da bude iste veličine kao i dugo dugo. 328 00:27:04,030 --> 00:27:11,070 I to samo tako dogodi da se da se u 99,999% sustava, to će biti jednaka 329 00:27:11,070 --> 00:27:15,800 ili int ili dugo dugo. To samo ovisi o 32-bitni ili 64-bitni. >> [Student] Ok. 330 00:27:15,800 --> 00:27:24,600 U plovaka, kako je decimalna točka određen u smislu bita? 331 00:27:24,600 --> 00:27:27,160 Sviđa mi se kao binarno? >> Da. 332 00:27:27,160 --> 00:27:30,570 Ne morate znati da za CS50. 333 00:27:30,570 --> 00:27:32,960 Vi čak ne bi saznali da je u 61. 334 00:27:32,960 --> 00:27:37,350 Vi ne uče da stvarno u svakom naravno. 335 00:27:37,350 --> 00:27:42,740 To je samo reprezentacija. 336 00:27:42,740 --> 00:27:45,440 Zaboravio sam točno bitne allotments. 337 00:27:45,440 --> 00:27:53,380 Ideja plutajuće točke je da vam dodijeliti određeni broj bitova za zastupanje - 338 00:27:53,380 --> 00:27:56,550 Uglavnom, sve je u znanstvenom zapisu. 339 00:27:56,550 --> 00:28:05,600 Dakle, dodijeliti određeni broj bitova za zastupanje broj sama, kao što 1,2345. 340 00:28:05,600 --> 00:28:10,200 Ja nikada ne može predstavljati broj s više znamenki nego pet. 341 00:28:12,200 --> 00:28:26,300 Zatim možete također dodijeliti određeni broj bitova, tako da je sklon biti poput 342 00:28:26,300 --> 00:28:32,810 možete samo ići do određenog broja, kao i da je najveći eksponent možete imati, 343 00:28:32,810 --> 00:28:36,190 a ti samo može ići dolje do određenog eksponenta, 344 00:28:36,190 --> 00:28:38,770 kao da je najmanji eksponent možete imati. 345 00:28:38,770 --> 00:28:44,410 >> Ne sjećam se točno način na koji su dijelovi dodijeljen svih tih vrijednosti, 346 00:28:44,410 --> 00:28:47,940 ali određeni broj bitova su posvećeni 1,2345, 347 00:28:47,940 --> 00:28:50,930 još određeni broj bitova su posvećena eksponenta, 348 00:28:50,930 --> 00:28:55,670 i to je jedino moguće da predstavlja eksponent određene veličine. 349 00:28:55,670 --> 00:29:01,100 [Student] A dvostruko? Je li to kao dodatni dugo float? >> Da. 350 00:29:01,100 --> 00:29:07,940 To je ista stvar kao float, osim sada ste koristeći 8 bajtova umjesto 4 bajta. 351 00:29:07,940 --> 00:29:11,960 Sada ćete biti u mogućnosti koristiti devet znamenki ili 10 znamenki, 352 00:29:11,960 --> 00:29:16,630 a to će biti u mogućnosti otići do 300 umjesto 100. >> [Student] Ok. 353 00:29:16,630 --> 00:29:21,550 I plovci su također četiri bajta. >> Da. 354 00:29:21,550 --> 00:29:27,520 Pa, opet, to vjerojatno ovisi sveukupno na opću provedbu, 355 00:29:27,520 --> 00:29:30,610 ali plovci su 4 bajta, parovi su osam. 356 00:29:30,610 --> 00:29:33,440 Parovi su pozvani dvostruko jer su dvostruko veličine plovaka. 357 00:29:33,440 --> 00:29:38,380 [Student] Ok. A tu su bračni parovi? >> Ne postoje. 358 00:29:38,380 --> 00:29:43,660 Mislim - >> [student] Kao duga čezne? >> Da. Ne mislim tako. Da. 359 00:29:43,660 --> 00:29:45,950 [Student] Na prošlogodišnjem testu je bilo pitanje o glavnoj funkciji 360 00:29:45,950 --> 00:29:49,490 ima da bude dio vašeg programa. 361 00:29:49,490 --> 00:29:52,310 Odgovor je bio da to ne mora biti dio vašeg programa. 362 00:29:52,310 --> 00:29:55,100 U kojoj situaciji? To je ono što sam vidio. 363 00:29:55,100 --> 00:29:59,090 [Bowden] Čini se - >> [student] Što situacija? 364 00:29:59,090 --> 00:30:02,880 Imate li problem? >> [Student] Da, ja definitivno mogu ga podići. 365 00:30:02,880 --> 00:30:07,910 To ne mora biti, tehnički, ali u osnovi to će biti. 366 00:30:07,910 --> 00:30:10,030 [Student] Vidio sam jednom na drugačiji ovogodišnjeg. 367 00:30:10,030 --> 00:30:16,220 Bilo je to kao True ili False: vrijedi - >> Oh, c datoteka.? 368 00:30:16,220 --> 00:30:18,790 . [Student] Bilo c datoteka mora imati - [kako govori odjednom - nerazumljivo] 369 00:30:18,790 --> 00:30:21,120 Ok. Dakle, to je odvojeni. 370 00:30:21,120 --> 00:30:26,800 >> C. File samo treba da sadrži funkcije. 371 00:30:26,800 --> 00:30:32,400 Možete sastaviti datoteke u strojnom kodu, binarni, što god, 372 00:30:32,400 --> 00:30:36,620 bez da se izvršna gostiju. 373 00:30:36,620 --> 00:30:39,420 Vrijedi izvršna mora imati glavnu funkciju. 374 00:30:39,420 --> 00:30:45,460 Možete pisati sto funkcije u jednoj datoteci, ali ne glavne 375 00:30:45,460 --> 00:30:48,800 , a zatim sastaviti da dolje u binarni, 376 00:30:48,800 --> 00:30:54,460 onda napisati drugu datoteku koja ima samo glavni, ali to naziva hrpa tih funkcija 377 00:30:54,460 --> 00:30:56,720 u ovom binarnu datoteku ovamo. 378 00:30:56,720 --> 00:31:01,240 I tako kada radite izvršnu, to je ono što čini linker 379 00:31:01,240 --> 00:31:05,960 se kombinira ove dvije binarne datoteke u izvršnu. 380 00:31:05,960 --> 00:31:11,400 Dakle, c. Datoteka ne trebate imati glavnu funkciju. 381 00:31:11,400 --> 00:31:19,220 I na velikim koda baze vidjet ćete tisuće. C datoteka i jedan glavni datoteku. 382 00:31:23,960 --> 00:31:26,110 Više pitanja? 383 00:31:29,310 --> 00:31:31,940 [Student] Bilo je drugo pitanje. 384 00:31:31,940 --> 00:31:36,710 On je rekao da je prevodilac. Točno ili netočno? 385 00:31:36,710 --> 00:31:42,030 A odgovor je bio lažan, a ja sam shvatio zašto to nije kao jeka. 386 00:31:42,030 --> 00:31:44,770 No, ono što mi zovemo napraviti ako to nije? 387 00:31:44,770 --> 00:31:49,990 Provjerite je u osnovi samo - Ja mogu vidjeti točno ono što on naziva. 388 00:31:49,990 --> 00:31:52,410 No, to je samo radi naredbe. 389 00:31:53,650 --> 00:31:55,650 Napravite. 390 00:31:58,240 --> 00:32:00,870 Ja mogu izvući ovo gore. Da. 391 00:32:10,110 --> 00:32:13,180 Oh, da. Provjerite također da li to. 392 00:32:13,180 --> 00:32:17,170 To govori svrha marku korisnosti je odrediti automatski 393 00:32:17,170 --> 00:32:19,610 koji komadi velikog programa treba recompiled 394 00:32:19,610 --> 00:32:22,350 i izdavati naredbe da ih rekompiliranje. 395 00:32:22,350 --> 00:32:27,690 Možete napraviti napraviti datoteke koje su apsolutno ogroman. 396 00:32:27,690 --> 00:32:33,210 Napravite izgleda na vrijeme markica datoteka i, kao što smo već rekli, 397 00:32:33,210 --> 00:32:36,930 možete sastaviti pojedinačne datoteke dolje, i to ne dok ne dođete do linker 398 00:32:36,930 --> 00:32:39,270 da oni sastavili u izvršnu. 399 00:32:39,270 --> 00:32:43,810 Dakle, ako imate 10 različitih datoteka i napraviti promjenu na jednom od njih, 400 00:32:43,810 --> 00:32:47,870 što onda učiniti je učiniti je samo rekompiliranje da jedna datoteka 401 00:32:47,870 --> 00:32:50,640 a zatim RELINK sve zajedno. 402 00:32:50,640 --> 00:32:53,020 No, to je mnogo gluplji od toga. 403 00:32:53,020 --> 00:32:55,690 To je do vas da se u potpunosti definirati da je to ono što treba raditi. 404 00:32:55,690 --> 00:32:59,560 To po defaultu ima sposobnost da se prepoznaju ove stvari vremenski pečat, 405 00:32:59,560 --> 00:33:03,220 , ali možete napisati datoteku marku ništa učiniti. 406 00:33:03,220 --> 00:33:09,150 Možete pisati napraviti datoteku, tako da kada upišete bi to samo cd-a na drugi direktorij. 407 00:33:09,150 --> 00:33:15,560 Sam bio uzimajući frustriran jer sam tack sve unutar mog Appliance 408 00:33:15,560 --> 00:33:21,740 i onda sam pogledati PDF od Mac. 409 00:33:21,740 --> 00:33:30,720 >> Tako sam ići na Finder i ja mogu učiniti Idi, Connect na poslužitelj, 410 00:33:30,720 --> 00:33:36,950 i poslužitelj sam spojiti moj aparati, a onda sam otvoriti PDF 411 00:33:36,950 --> 00:33:40,190 koji se sastavljaju LaTeX. 412 00:33:40,190 --> 00:33:49,320 Ali ja sam bio uzimajući frustriran jer svaki put mi je trebalo osvježiti PDF, 413 00:33:49,320 --> 00:33:53,900 Morao sam ga kopirati u određeni direktorij da bi to moglo pristupiti 414 00:33:53,900 --> 00:33:57,710 i to je bio uzimajući neugodno. 415 00:33:57,710 --> 00:34:02,650 Dakle, umjesto da sam napisao marku datoteku koja morate definirati kako to čini stvari. 416 00:34:02,650 --> 00:34:06,130 Kako napraviti u to PDF LaTeX. 417 00:34:06,130 --> 00:34:10,090 Baš kao i bilo koji drugi marku datoteku - ili Pretpostavljam da niste vidjeli make datoteke, 418 00:34:10,090 --> 00:34:13,510 ali imamo u Appliance globalnu marku datoteku koja samo kaže, 419 00:34:13,510 --> 00:34:16,679 ako sastavljanje C datoteku, koristite zveka. 420 00:34:16,679 --> 00:34:20,960 I tako ovdje u mom marku datoteku da ću ja reći, 421 00:34:20,960 --> 00:34:25,020 ovu sliku idete da želite sastaviti s PDF LaTeX. 422 00:34:25,020 --> 00:34:27,889 I tako je PDF LaTeX da se radi sastavljanja. 423 00:34:27,889 --> 00:34:31,880 Provjerite nije sastavljanja. To je samo radi ove naredbe u nizu sam navedenom. 424 00:34:31,880 --> 00:34:36,110 Tako to radi PDF lateksa, to kopira u direktorij želim da se kopirati, 425 00:34:36,110 --> 00:34:38,270 to cd-u direktorij i obavlja i druge stvari, 426 00:34:38,270 --> 00:34:42,380 ali sve to ipak je prepoznati kada je datoteka promjena, 427 00:34:42,380 --> 00:34:45,489 a ako se ne promijeni, onda će pokrenuti naredbe koje je trebalo pokrenuti 428 00:34:45,489 --> 00:34:48,760 Kada je datoteka mijenja. >> [Student] Ok. 429 00:34:50,510 --> 00:34:54,420 Ne znam gdje su globalna napraviti datoteke su za mene to provjeriti. 430 00:34:57,210 --> 00:35:04,290 Ostala pitanja? Sve iz prošlosti kvizova? Bilo pokazivač stvari? 431 00:35:06,200 --> 00:35:08,730 Postoje suptilne stvari s pokazivačima poput - 432 00:35:08,730 --> 00:35:10,220 Neću biti u mogućnosti pronaći kviz pitanje na njemu - 433 00:35:10,220 --> 00:35:16,250 ali baš kao i ovu vrstu stvar. 434 00:35:19,680 --> 00:35:24,060 Pobrinite se da razumijete da kad kažem int * x * y - 435 00:35:24,890 --> 00:35:28,130 To nije točno ništa ovdje, pretpostavljam. 436 00:35:28,130 --> 00:35:32,140 No, kao što je * x * y, one su dvije varijable koje su na stog. 437 00:35:32,140 --> 00:35:37,220 Kad kažem x = malloc (sizeof (int)), x je još uvijek varijabla na stog, 438 00:35:37,220 --> 00:35:41,180 malloc je neki blok više u gomili, i imamo x točku na hrpi. 439 00:35:41,180 --> 00:35:43,900 >> Tako nešto na stog ukazuje na hrpi. 440 00:35:43,900 --> 00:35:48,100 Kad god malloc ništa, neizbježno ste spremanje ga unutar jednog pokazivača. 441 00:35:48,100 --> 00:35:55,940 Tako da je pokazivač na stog, malloced blok je na hrpi. 442 00:35:55,940 --> 00:36:01,240 Puno ljudi se zbune i reći int * x = malloc, x je na hrpi. 443 00:36:01,240 --> 00:36:04,100 Broj Što x ukazuje je na hrpi. 444 00:36:04,100 --> 00:36:08,540 x sama je na stogu, ako iz bilo kojeg razloga ste x biti globalna varijabla, 445 00:36:08,540 --> 00:36:11,960 u kojem slučaju se dogodi da se u drugoj regiji memorije. 446 00:36:13,450 --> 00:36:20,820 Dakle, praćenje, ove kutije i strijela dijagrami su prilično uobičajene za kviz. 447 00:36:20,820 --> 00:36:25,740 Ili, ako to nije na kvizu 0, to će biti na kvizu 1. 448 00:36:27,570 --> 00:36:31,940 Ti bi trebao znati sve to, korake u sastavljanju 449 00:36:31,940 --> 00:36:35,740 budući da je morao odgovarati na pitanja o onima. Da. 450 00:36:35,740 --> 00:36:38,940 [Student] Možemo ići preko tih koraka - >> Naravno. 451 00:36:48,340 --> 00:36:58,640 Prije koraka i sastavljanje imamo predobradba, 452 00:36:58,640 --> 00:37:16,750 izradu, montažu i povezivanje. 453 00:37:16,750 --> 00:37:21,480 Predobradba. Što to učiniti? 454 00:37:29,720 --> 00:37:32,290 To je najlakši korak u - dobro, a ne kao - 455 00:37:32,290 --> 00:37:35,770 to ne znači da bi trebalo biti očito, ali to je najlakši korak. 456 00:37:35,770 --> 00:37:38,410 Vi mogli provesti ga sami. Da. 457 00:37:38,410 --> 00:37:43,410 [Student] Uzmi ono što imate u svom uključuje ovako i kopira, a zatim i definira. 458 00:37:43,410 --> 00:37:49,250 To izgleda za stvari kao što su # include i # define, 459 00:37:49,250 --> 00:37:53,800 i to samo kopija i paste što one zapravo znače. 460 00:37:53,800 --> 00:37:59,240 Dakle, kada kažeš # include cs50.h, preprocesor je kopiranje i lijepljenje cs50.h 461 00:37:59,240 --> 00:38:01,030 u toj liniji. 462 00:38:01,030 --> 00:38:06,640 Kada kažeš # define x da bude 4, preprocesor ide kroz cijeli program 463 00:38:06,640 --> 00:38:10,400 i zamjenjuje sve instance x sa četiri. 464 00:38:10,400 --> 00:38:17,530 Dakle preprocesor traje valjanu C datoteku i izlazi valjanu C datoteku 465 00:38:17,530 --> 00:38:20,300 gdje stvari su kopirati i zalijepiti. 466 00:38:20,300 --> 00:38:24,230 Tako sada sastavljanja. Što to učiniti? 467 00:38:25,940 --> 00:38:28,210 [Student] To ide iz C u binarni. 468 00:38:28,210 --> 00:38:30,970 >> [Bowden] To ne ide sve na putu u binarni. 469 00:38:30,970 --> 00:38:34,220 [Student] Da strojnom kodu onda? >> To nije stroj kod. 470 00:38:34,220 --> 00:38:35,700 [Student] Skupština? >> Skupština. 471 00:38:35,700 --> 00:38:38,890 To ide na skupštini prije nego što ide skroz do C koda, 472 00:38:38,890 --> 00:38:45,010 i većina jezici učiniti nešto ovako. 473 00:38:47,740 --> 00:38:50,590 Pick bilo jezik visoke razine, a ako idete da ga sastaviti, 474 00:38:50,590 --> 00:38:52,390 to je vjerojatno da će sastaviti u koracima. 475 00:38:52,390 --> 00:38:58,140 Prvo to će sastaviti Python i C, onda će sastaviti C do skupštine, 476 00:38:58,140 --> 00:39:01,600 a zatim Skupština će se prevesti u binarni. 477 00:39:01,600 --> 00:39:07,800 Dakle sastavljanju će ga dovesti iz C do skupštine. 478 00:39:07,800 --> 00:39:12,130 Riječ sastavljanje obično znači da ga stavi na višu razinu 479 00:39:12,130 --> 00:39:14,340 na nižoj razini programskog jezika. 480 00:39:14,340 --> 00:39:19,190 Dakle, ovo je samo korak u obračunu gdje možete početi s visoke razine jeziku 481 00:39:19,190 --> 00:39:23,270 i završiti u low-level jeziku, i to je razlog zašto se zove korak sastavljanja. 482 00:39:25,280 --> 00:39:33,370 [Student] Tijekom sastavljanja, recimo da ste učinili # include cs50.h. 483 00:39:33,370 --> 00:39:42,190 Hoće prevodilac rekompiliranje cs50.h, kao i funkcije koje su u njemu, 484 00:39:42,190 --> 00:39:45,280 i prevesti u Skupštini koda kao dobro, 485 00:39:45,280 --> 00:39:50,830 ili će to kopirati i zalijepiti nešto što je bilo prije skupštine? 486 00:39:50,830 --> 00:39:56,910 cs50.h prilično će puno nikad završiti u Skupštini. 487 00:39:59,740 --> 00:40:03,680 Stvari poput funkcijskih prototipova i stvari su samo za vas biti oprezni. 488 00:40:03,680 --> 00:40:09,270 To jamči da prevodilac može provjeriti stvari kao što zovete funkcije 489 00:40:09,270 --> 00:40:12,910 s pravom povratka vrstama i pravim argumentima i slično. 490 00:40:12,910 --> 00:40:18,350 >> Dakle cs50.h će preprocessed u datoteku, a zatim kad je sastavljanje 491 00:40:18,350 --> 00:40:22,310 to u osnovi je odbačen nakon što čini sigurni da je sve što se zove točno. 492 00:40:22,310 --> 00:40:29,410 Ali funkcije definirane u CS50 knjižnici, koji su odvojeni od cs50.h, 493 00:40:29,410 --> 00:40:33,610 one neće biti zasebno sastavio. 494 00:40:33,610 --> 00:40:37,270 To će zapravo sići u povezivanju koraku, pa ćemo doći do da u drugi. 495 00:40:37,270 --> 00:40:40,100 Ali prvo, što je okupljanje? 496 00:40:41,850 --> 00:40:44,500 [Student] Skupština u binarni? >> Da. 497 00:40:46,300 --> 00:40:48,190 Sastavljanje. 498 00:40:48,190 --> 00:40:54,710 Mi ne zovu sastavljanje jer Skupština je prilično čista prijevod binarni. 499 00:40:54,710 --> 00:41:00,230 Tu je vrlo malo logike u idući od Skupštine u binarni. 500 00:41:00,230 --> 00:41:03,180 To je kao u potrazi gore u tablici, oh, imamo ovu pouku; 501 00:41:03,180 --> 00:41:06,290 koji odgovara binarnom 01110. 502 00:41:10,200 --> 00:41:15,230 I tako su datoteke koje sastavljanje općenito izlazi. O datotekama. 503 00:41:15,230 --> 00:41:19,020 A o datotekama. Smo ono što su govorili prije, 504 00:41:19,020 --> 00:41:21,570 kako sliku ne treba imati glavnu funkciju. 505 00:41:21,570 --> 00:41:27,640 Svaka datoteka može se sastaviti dolje do. O datoteci dok je valjana C datoteka. 506 00:41:27,640 --> 00:41:30,300 To se može sastaviti dolje. O.. 507 00:41:30,300 --> 00:41:43,030 Sada, povezujući je ono što zapravo donosi hrpu. O datoteka i dovodi ih do izvršne datoteke. 508 00:41:43,030 --> 00:41:51,110 I tako ono povezivanje ipak možete misliti na CS50 knjižnici kao o datoteci.. 509 00:41:51,110 --> 00:41:56,980 To je već sastavio binarna datoteka. 510 00:41:56,980 --> 00:42:03,530 I tako kada sastaviti datoteku, vaš hello.c, koja poziva GetString, 511 00:42:03,530 --> 00:42:06,360 hello.c dobiva sastavio dolje hello.o, 512 00:42:06,360 --> 00:42:08,910 hello.o je sada u binarnom. 513 00:42:08,910 --> 00:42:12,830 Ona koristi GetString, tako da treba ići preko cs50.o, 514 00:42:12,830 --> 00:42:16,390 i linker ih smooshes zajedno i kopira GetString u ovoj datoteci 515 00:42:16,390 --> 00:42:20,640 i izlazi s izvršnu koji ima sve funkcije treba. 516 00:42:20,640 --> 00:42:32,620 Dakle cs50.o nije zapravo O datoteku, ali to je dovoljno blizu da ne postoji temeljna razlika. 517 00:42:32,620 --> 00:42:36,880 Dakle povezuje samo donosi hrpa datoteka zajedno 518 00:42:36,880 --> 00:42:41,390 da odvojeno sadrže sve funkcije moram koristiti 519 00:42:41,390 --> 00:42:46,120 i stvara izvršnu da će zapravo pokrenuti. 520 00:42:48,420 --> 00:42:50,780 >> I tako je to također ono što smo pričali prije 521 00:42:50,780 --> 00:42:55,970 gdje možete imati 1000. c datoteka, sastaviti ih sve. o datotekama, 522 00:42:55,970 --> 00:43:00,040 koji će vjerojatno potrajati, a zatim promijenite jedan. c datoteka. 523 00:43:00,040 --> 00:43:05,480 Vi samo morate rekompiliranje taj jedan. C datoteku, a zatim RELINK sve ostalo, 524 00:43:05,480 --> 00:43:07,690 povezati sve vratiti zajedno. 525 00:43:09,580 --> 00:43:11,430 [Student] Kad smo povezuje pišemo lcs50? 526 00:43:11,430 --> 00:43:20,510 Da, tako lcs50. To zastava signalizira linker koji bi trebali biti povezivanje u toj knjižnici. 527 00:43:26,680 --> 00:43:28,910 Pitanja? 528 00:43:41,310 --> 00:43:46,860 Jesmo li otišli preko binarnog osim toga pet sekundi u prvom predavanju? 529 00:43:50,130 --> 00:43:53,010 Ne mislim tako. 530 00:43:55,530 --> 00:43:58,820 Ti bi trebao znati sve o velikom OS koji smo otišli preko, 531 00:43:58,820 --> 00:44:02,670 i trebali biste biti u mogućnosti da, ako mi ti dao funkciju, 532 00:44:02,670 --> 00:44:09,410 trebali biti u mogućnosti reći da je veliki O, otprilike. Ili dobro, velika je O gruba. 533 00:44:09,410 --> 00:44:15,300 Dakle, ako vidite ugniježđena za petlje loop nad istim brojem stvari, 534 00:44:15,300 --> 00:44:22,260 kao int i, ja > [student] n kvadratna. >> Sklon je biti n kvadratna. 535 00:44:22,260 --> 00:44:25,280 Ako ste trostruki su ugniježđena, sklon je biti n kubu. 536 00:44:25,280 --> 00:44:29,330 Tako da vrsta stvar koju bi trebao biti u mogućnosti istaknuti odmah. 537 00:44:29,330 --> 00:44:33,890 Morate znati unosa vrsta i bubble sortiranje i spajanje vrsta i sve one. 538 00:44:33,890 --> 00:44:41,420 Lakše je razumjeti zašto su oni n kvadratna i n log n i sve to 539 00:44:41,420 --> 00:44:47,810 jer mislim da je bio na kvizu jedna godina u kojoj smo zapravo ti dao 540 00:44:47,810 --> 00:44:55,050 provedba bubble vrste i reče: "Što je trajanje ove funkcije?" 541 00:44:55,050 --> 00:45:01,020 Dakle, ako ste ga prepoznali kao bubble sort, onda možete odmah reći n kvadratna. 542 00:45:01,020 --> 00:45:05,470 Ali ako samo gledati na to, ne treba ni da shvate da je mjehur vrsta; 543 00:45:05,470 --> 00:45:08,990 možete samo reći ovo radi to i to. To je n kvadratna. 544 00:45:12,350 --> 00:45:14,710 [Student] Ima li kakvih teške primjera možete doći do, 545 00:45:14,710 --> 00:45:20,370 kao sličnom idejom figuring out? 546 00:45:20,370 --> 00:45:24,450 >> Ja ne mislim da bi vam bilo teške primjere. 547 00:45:24,450 --> 00:45:30,180 Stvar balon vrsta je o kao tvrd kao što će ići, 548 00:45:30,180 --> 00:45:36,280 pa čak i da, koliko god shvatite da ste Ponavljanje preko niza 549 00:45:36,280 --> 00:45:41,670 za svaki element u polju, koji će biti nešto što je n kvadratna. 550 00:45:45,370 --> 00:45:49,940 Postoji opća pitanja, kao što ovdje imamo - Oh. 551 00:45:55,290 --> 00:45:58,530 Samo drugi dan, Doug je tvrdio: "Ja sam izumio algoritam koji može sortirati niz 552 00:45:58,530 --> 00:46:01,780 "Od n brojeva u O (log n) vrijeme!" 553 00:46:01,780 --> 00:46:04,900 Dakle, kako znamo da je to nemoguće? 554 00:46:04,900 --> 00:46:08,850 [Nečujno učenik odgovor] >> Da. 555 00:46:08,850 --> 00:46:13,710 Na samom kraju, imate na dodir svaki element u polju, 556 00:46:13,710 --> 00:46:16,210 tako da je nemoguće riješiti niz - 557 00:46:16,210 --> 00:46:20,850 Ako je sve u nerazvrstani bi, onda ćete biti dodirivanje sve što je u polju, 558 00:46:20,850 --> 00:46:25,320 tako da je nemoguće to učiniti u manje od O iz n. 559 00:46:27,430 --> 00:46:30,340 [Student] Ti nam je pokazao taj primjer biti u mogućnosti to učiniti u O iz n 560 00:46:30,340 --> 00:46:33,920 ako koristite puno memorije. >> Da. 561 00:46:33,920 --> 00:46:37,970 I that's - ja zaboraviti ono što that's - Je li to računajući vrsta? 562 00:46:47,360 --> 00:46:51,330 Hmm. To je cijeli sortiranje algoritam. 563 00:46:59,850 --> 00:47:05,100 Bio sam u potrazi za poseban naziv za to da se nisam mogao sjetiti prošlog tjedna. 564 00:47:05,100 --> 00:47:13,000 Da. To su vrste sorti koje se mogu ostvariti stvari u velikom O iz n. 565 00:47:13,000 --> 00:47:18,430 No, tu su i ograničenja, kao što možete koristiti samo prirodni brojevi do određenog broja. 566 00:47:20,870 --> 00:47:24,560 Plus, ako ste pokušavate izdvojiti nešto that's - 567 00:47:24,560 --> 00:47:30,750 Ako je vaš polje je 012, -12, 151, 4 milijuna kuna, 568 00:47:30,750 --> 00:47:35,120 zatim da jedan element će u potpunosti uništiti cijelu sortiranja. 569 00:47:42,060 --> 00:47:44,030 >> Pitanja? 570 00:47:49,480 --> 00:47:58,870 [Student] Ako imate rekurzivna funkcija i to samo čini rekurzivnih poziva 571 00:47:58,870 --> 00:48:02,230 unutar povratka izjavi, da je rep rekurzivna, 572 00:48:02,230 --> 00:48:07,360 pa da ne bi koristiti više memorije tijekom izvođenja 573 00:48:07,360 --> 00:48:12,550 ili bi barem koristiti usporedivu memoriju kao rješenje iterativnog? 574 00:48:12,550 --> 00:48:14,530 [Bowden] Da. 575 00:48:14,530 --> 00:48:19,840 To će vjerojatno biti nešto sporiji, ali ne i stvarno. 576 00:48:19,840 --> 00:48:23,290 Rep rekurzivna je prilično dobra. 577 00:48:23,290 --> 00:48:32,640 Gledajući opet na stog okvire, recimo imamo glavni 578 00:48:32,640 --> 00:48:42,920 i imamo int bar (int x) ili nešto. 579 00:48:42,920 --> 00:48:52,310 Ovo nije savršen rekurzivna funkcija, ali povratak bar (x - 1). 580 00:48:52,310 --> 00:48:57,620 Dakle, očito, ovo je manjkav. Trebate bazu slučajeve i stvari. 581 00:48:57,620 --> 00:49:00,360 No, ideja je da je to rep rekurzivna, 582 00:49:00,360 --> 00:49:06,020 što znači kada glavni pozivi bar to ide da biste dobili svoj stack okvir. 583 00:49:09,550 --> 00:49:12,440 U tom okviru postoji stack će biti malo blok memorije 584 00:49:12,440 --> 00:49:17,490 koji odgovara njegovu argumenta x.. 585 00:49:17,490 --> 00:49:25,840 I tako recimo glavni dogodi nazvati bar (100); 586 00:49:25,840 --> 00:49:30,050 Dakle, x će početi kao sto. 587 00:49:30,050 --> 00:49:35,660 Ako prevodilac priznaje da je to rep rekurzivna funkcija, 588 00:49:35,660 --> 00:49:38,540 onda kada bar čini njegov rekurzivni poziv na zabranu, 589 00:49:38,540 --> 00:49:45,490 umjesto da novi stog okvir, što je gdje stog počinje raste uglavnom, 590 00:49:45,490 --> 00:49:48,220 na kraju će se izvoditi u gomili i onda ćete dobiti segfaults 591 00:49:48,220 --> 00:49:51,590 jer memorija počinje sudara. 592 00:49:51,590 --> 00:49:54,830 >> Dakle, umjesto da svoj stack frame, to može shvatiti, 593 00:49:54,830 --> 00:49:59,080 hej, ja nikada stvarno morati vratiti na ovaj stack okvira, 594 00:49:59,080 --> 00:50:08,040 pa umjesto samo ću zamijeniti ovaj argument s 99 i onda početi bar sve više. 595 00:50:08,040 --> 00:50:11,810 I onda će to učiniti opet i to će doći do povratka bar (x - 1), 596 00:50:11,810 --> 00:50:17,320 i umjesto da novi stog okvir, samo će zamijeniti svoj trenutni argument s 98 597 00:50:17,320 --> 00:50:20,740 i onda skočiti natrag na samom početku traci. 598 00:50:23,860 --> 00:50:30,430 Ti poslovi, zamijenivši taj jedan vrijednost na stog i skakanje natrag na početak, 599 00:50:30,430 --> 00:50:32,430 su prilično učinkovit. 600 00:50:32,430 --> 00:50:41,500 Dakle, ne samo da je to isto memorije kao zasebna funkcija koja je iterativni 601 00:50:41,500 --> 00:50:45,390 jer ste samo pomoću jedne stog okvir, ali ne trpi downsides 602 00:50:45,390 --> 00:50:47,240 vlasništvo na poziv funkcije. 603 00:50:47,240 --> 00:50:50,240 Pozivanje funkcije može biti nešto skuplji, jer ona mora učiniti sve ove postavke 604 00:50:50,240 --> 00:50:52,470 i teardown i sve ove stvari. 605 00:50:52,470 --> 00:50:58,160 Dakle, ovo rep rekurzije je dobro. 606 00:50:58,160 --> 00:51:01,170 [Student] Zašto ne stvoriti nove korake? 607 00:51:01,170 --> 00:51:02,980 Budući da shvati da ne treba. 608 00:51:02,980 --> 00:51:07,800 Poziv na traci samo vraćanjem rekurzivni poziv. 609 00:51:07,800 --> 00:51:12,220 Tako da ne treba ništa učiniti s povratnom vrijednosti. 610 00:51:12,220 --> 00:51:15,120 Upravo će se odmah vratiti. 611 00:51:15,120 --> 00:51:20,530 Dakle, to je samo će zamijeniti svoj argument i početi ispočetka. 612 00:51:20,530 --> 00:51:25,780 I također, ako nemaju rep rekurzivna verzija, 613 00:51:25,780 --> 00:51:31,460 onda ste dobili sve ove barova gdje kada se to bar vraća 614 00:51:31,460 --> 00:51:36,010 to mora vratiti njegovu vrijednost na ovom jednom, a zatim da bar odmah vraća 615 00:51:36,010 --> 00:51:39,620 i vraća svoju vrijednost na ovom jednom, onda je to samo ide odmah vratiti 616 00:51:39,620 --> 00:51:41,350 i vratiti svoju vrijednost na ovom jednom. 617 00:51:41,350 --> 00:51:45,350 Dakle, uštedjet ćete to iskakanje sve ove stvari izvan dimnjaka 618 00:51:45,350 --> 00:51:48,730 jer povratna vrijednost samo će biti donesen sve na putu natrag do svejedno. 619 00:51:48,730 --> 00:51:55,400 Pa zašto ne samo zamijeniti naše argumente s ažuriranim argument i početi ispočetka? 620 00:51:57,460 --> 00:52:01,150 Ako funkcija nije rep rekurzivna, ako to ne učinite nešto slično - 621 00:52:01,150 --> 00:52:07,530 [Student] ako bar (x + 1). >> Da. 622 00:52:07,530 --> 00:52:11,770 >> Dakle, ako ste ga stavili u stanju, onda radite nešto s povratnom vrijednosti. 623 00:52:11,770 --> 00:52:16,260 Ili čak i ako samo ne vraćaju 2 * bar (x - 1). 624 00:52:16,260 --> 00:52:23,560 Dakle, sada bar (x - 1) treba vratiti kako bi za to da izračunati dva puta da vrijednosti, 625 00:52:23,560 --> 00:52:26,140 pa sad to ne treba svoj zasebni okvir stog, 626 00:52:26,140 --> 00:52:31,180 i sada, bez obzira koliko se trudili, ti si idući u morati - 627 00:52:31,180 --> 00:52:34,410 To nije rep rekurzivna. 628 00:52:34,410 --> 00:52:37,590 [Student] Želite li pokušati donijeti rekurzija za cilj za rep rekurzije - 629 00:52:37,590 --> 00:52:41,450 [Bowden] U idealnom svijetu, ali u CS50 ne moraju. 630 00:52:43,780 --> 00:52:49,280 Da bi dobili rep rekurzija, općenito, postavite dodatne argumente 631 00:52:49,280 --> 00:52:53,550 gdje bar će se int x u y 632 00:52:53,550 --> 00:52:56,990 i y odgovara ultimate stvar koju želite vratiti. 633 00:52:56,990 --> 00:53:03,650 Dakle, onda je to da ćeš se vratiti bar (x - 1), 2 * y. 634 00:53:03,650 --> 00:53:09,810 Dakle, to je samo na visokoj razini kako transformirati stvari biti rep rekurzivna. 635 00:53:09,810 --> 00:53:13,790 No, dodatni argument - 636 00:53:13,790 --> 00:53:17,410 I onda na kraju kada dođete do svoje baze slučaj, samo vratiti y 637 00:53:17,410 --> 00:53:22,740 jer ste bili gomilaju cijelo vrijeme povratnu vrijednost koju želite. 638 00:53:22,740 --> 00:53:27,280 Vi vrsta su to iterativno, ali pomoću rekurzivnih poziva. 639 00:53:32,510 --> 00:53:34,900 Pitanja? 640 00:53:34,900 --> 00:53:39,890 [Student] Možda o ciljnikom aritmetike, kao kada koristite nizove. >> Naravno. 641 00:53:39,890 --> 00:53:43,610 Pointer aritmetika. 642 00:53:43,610 --> 00:53:48,440 Kada koristite konce je lako jer su nizovi char zvijezde, 643 00:53:48,440 --> 00:53:51,860 znakovi su zauvijek i uvijek jedan byte, 644 00:53:51,860 --> 00:53:57,540 i tako pokazivač aritmetika je ekvivalentno redovitom aritmetike kada ste se bave žice. 645 00:53:57,540 --> 00:54:08,790 Ajmo reći char * s = "halo". 646 00:54:08,790 --> 00:54:11,430 Dakle, imamo blok u memoriji. 647 00:54:19,490 --> 00:54:22,380 To treba 6 bajtova jer ćete uvijek trebati null terminator. 648 00:54:22,380 --> 00:54:28,620 I char * s će ukazati na početku ovog niza. 649 00:54:28,620 --> 00:54:32,830 Tako je ukazuje tamo. 650 00:54:32,830 --> 00:54:36,710 Sada, to je u osnovi kako je bilo niz djela, 651 00:54:36,710 --> 00:54:40,780 bez obzira da li je to bio povratak strane malloc ili da li je na stogu. 652 00:54:40,780 --> 00:54:47,110 Svaki niz je u osnovi pokazivač na početak niza, 653 00:54:47,110 --> 00:54:53,640 i onda bilo niz operacija, bilo indeksiranje, samo se ide u tom polju određeni pomak. 654 00:54:53,640 --> 00:55:05,360 >> Dakle, kada kažem nešto poput s. [3], a to će ih i računajući tri slova u. 655 00:55:05,360 --> 00:55:12,490 Tako i [3], imamo 0, 1, 2, 3, pa i [3] će da se odnosi na ovaj l. 656 00:55:12,490 --> 00:55:20,460 [Student] A mogli smo doći do iste vrijednosti koje rade s + 3, a zatim zagrade zvijezda? 657 00:55:20,460 --> 00:55:22,570 Da. 658 00:55:22,570 --> 00:55:26,010 Ovo je ekvivalent * (s + 3); 659 00:55:26,010 --> 00:55:31,240 i da je zauvijek i uvijek jednaka bez obzira na ono što radite. 660 00:55:31,240 --> 00:55:34,070 Vi nikada ne morate koristiti nosača sintaksu. 661 00:55:34,070 --> 00:55:37,770 Uvijek možete koristiti * (s + 3) sintaksa. 662 00:55:37,770 --> 00:55:40,180 Ljudi imaju tendenciju da vole nosača sintaksu, iako. 663 00:55:40,180 --> 00:55:43,860 [Student] Dakle, svi nizovi su zapravo samo upućuje. 664 00:55:43,860 --> 00:55:53,630 Tu je blagi razlika kad kažem int x [4]; >> [student] Znači li to da stvoriti pamćenje? 665 00:55:53,630 --> 00:56:03,320 [Bowden] To će stvoriti četiri Ints na stog, tako da 16 bajtova u ukupnom poretku. 666 00:56:03,320 --> 00:56:05,700 To će stvoriti 16 bajtova na stog. 667 00:56:05,700 --> 00:56:09,190 x nije pohranjena bilo gdje. 668 00:56:09,190 --> 00:56:13,420 To je samo simbol koji se odnosi na početku stvar. 669 00:56:13,420 --> 00:56:17,680 Zato što je proglasio niz unutar ove funkcije, 670 00:56:17,680 --> 00:56:22,340 ono prevodilac će učiniti samo zamijeniti sve instance varijable x 671 00:56:22,340 --> 00:56:26,400 s kojima se to dogodilo da se odlučite za staviti ove 16 bajtova. 672 00:56:26,400 --> 00:56:30,040 To ne može učiniti da se s char * s, jer je je stvarni pokazivač. 673 00:56:30,040 --> 00:56:32,380 To je besplatno onda ukazati na druge stvari. 674 00:56:32,380 --> 00:56:36,140 x je konstanta. Vi ne možete imati točku na nekom drugom polju. >> [Student] Ok. 675 00:56:36,140 --> 00:56:43,420 No, ta ideja, to indeksiranje, je ista, bez obzira da li je tradicionalna niz 676 00:56:43,420 --> 00:56:48,230 ili ako je pokazivač na nešto ili ako je pokazivač na niz malloced. 677 00:56:48,230 --> 00:56:59,770 A u stvari, to je tako odgovara da je to također ista stvar. 678 00:56:59,770 --> 00:57:05,440 To je zapravo samo prevodi ono što je unutar zagrada i što je ostalo od zagradama, 679 00:57:05,440 --> 00:57:07,970 ih dodaje zajedno, i dereferences. 680 00:57:07,970 --> 00:57:14,710 Dakle, ovo je samo kao ispravna * (s + 3) ili s [3]. 681 00:57:16,210 --> 00:57:22,090 [Student] Može li pokazivače koji upućuju na 2-dimenzionalnim nizovima? 682 00:57:22,090 --> 00:57:27,380 >> To je teže. Tradicionalno, br. 683 00:57:27,380 --> 00:57:34,720 2-dimenzionalni niz je samo 1-dimenzionalni niz s nekim praktičnim sintakse 684 00:57:34,720 --> 00:57:54,110 jer kad kažem int x [3] [3], to je zapravo samo jedan niz s devet vrijednostima. 685 00:57:55,500 --> 00:58:03,000 I tako, kada sam indeks, prevodilac zna što mislim. 686 00:58:03,000 --> 00:58:13,090 Ako kažem x [1] [2], on zna da ja želim ići u drugom redu, tako da će preskočiti prvi 3, 687 00:58:13,090 --> 00:58:17,460 i onda želi drugi stvar u tome, pa se događa da se ovaj jedan. 688 00:58:17,460 --> 00:58:20,480 Ali, to je još uvijek samo jednodimenzionalnu polje. 689 00:58:20,480 --> 00:58:23,660 I tako, ako sam htio dodijeliti pokazivač na tom polju, 690 00:58:23,660 --> 00:58:29,770 Rekao bih int * p = x; 691 00:58:29,770 --> 00:58:33,220 Tip x je samo - 692 00:58:33,220 --> 00:58:38,280 To je grubo govoreći tip x, budući da je samo simbol i to nije stvarna varijabla, 693 00:58:38,280 --> 00:58:40,140 ali to je samo int *. 694 00:58:40,140 --> 00:58:44,840 x je samo pokazivač na početak ove. >> [Student] Ok. 695 00:58:44,840 --> 00:58:52,560 I tako sam neće moći pristupiti [1] [2]. 696 00:58:52,560 --> 00:58:58,370 Mislim da je posebna sintaksa za proglašenje pokazivač, 697 00:58:58,370 --> 00:59:12,480 nešto smiješno kao int (* p [-. nešto apsolutno smiješno Ja čak ne znam. 698 00:59:12,480 --> 00:59:17,090 No, tu je sintaksa za proglašenje upućuje kao sa zagradama i stvari. 699 00:59:17,090 --> 00:59:22,960 To ne može čak ti to dopustiti. 700 00:59:22,960 --> 00:59:26,640 Mogao bih se osvrnuti na nešto što bi mi reći istinu. 701 00:59:26,640 --> 00:59:34,160 Ja ću gledati za to kasnije, ako je sintaksa za točku. No, nikada nećete vidjeti. 702 00:59:34,160 --> 00:59:39,670 A čak i sintaksa je tako arhaično da ako ga koristite, ljudi će biti zbunjeni. 703 00:59:39,670 --> 00:59:43,540 Višedimenzionalna polja su prilično rijetke, kao što je to. 704 00:59:43,540 --> 00:59:44,630 Možete prilično mnogo - 705 00:59:44,630 --> 00:59:48,490 Pa, ako radite matrica stvari to neće biti rijetka, 706 00:59:48,490 --> 00:59:56,730 ali u C rijetko ćeš se koriste višedimenzionalni nizovi. 707 00:59:57,630 --> 01:00:00,470 Da. >> [Student] Recimo da ste stvarno dugo niz. 708 01:00:00,470 --> 01:00:03,900 >> Tako je u virtualne memorije to bi izgledalo da se sve redom, 709 01:00:03,900 --> 01:00:05,640 poput elemenata tik jedna do druge, 710 01:00:05,640 --> 01:00:08,770 ali u fizičke memorije, to će biti moguće da se razišli? >> Da. 711 01:00:08,770 --> 01:00:16,860 Kako virtualna memorija radi je to samo razdvaja - 712 01:00:19,220 --> 01:00:24,860 Jedinica raspodjele je stranica, koja teži da bude 4 kilobajta, 713 01:00:24,860 --> 01:00:29,680 pa kad proces, kaže, hej, želim koristiti ovu memoriju, 714 01:00:29,680 --> 01:00:35,970 operativni sustav će se dodijeliti ga 4 kilobajta za tom malom bloku memorije. 715 01:00:35,970 --> 01:00:39,100 Čak i ako koristite samo jednu malu bajt u cijelom bloku memorije, 716 01:00:39,100 --> 01:00:42,850 operativni sustav će dati punu 4 kilobajta. 717 01:00:42,850 --> 01:00:49,410 Dakle, što to znači da je sam mogao imati - ajmo reći da je ovo moj stog. 718 01:00:49,410 --> 01:00:53,180 Ovaj stog može odvojiti. Moj stog mogao biti megabajta i megabajta. 719 01:00:53,180 --> 01:00:55,020 Moj stog mogao biti ogroman. 720 01:00:55,020 --> 01:01:00,220 No, stog sama mora biti podijeljena na pojedine stranice, 721 01:01:00,220 --> 01:01:09,010 koji, ako ćemo gledati na ovamo ajmo reći da je ovo naša RAM-a, 722 01:01:09,010 --> 01:01:16,600 ako imam dva gigabajta RAM-a, to je stvarna adresa 0 kao 0. bajtu moje RAM-a, 723 01:01:16,600 --> 01:01:22,210 a to je dva gigabajta sve putu ovamo. 724 01:01:22,210 --> 01:01:27,230 Dakle, ovo bi moglo stranica odgovara ovom bloku ovamo. 725 01:01:27,230 --> 01:01:29,400 Ova stranica može odgovarati ovom bloku ovamo. 726 01:01:29,400 --> 01:01:31,560 To bi se moglo odgovarati ovaj jedan ovamo. 727 01:01:31,560 --> 01:01:35,540 Dakle, operativni sustav je besplatan za dodjeljivanje fizičke memorije 728 01:01:35,540 --> 01:01:39,320 bilo pojedinačne stranice samovoljno. 729 01:01:39,320 --> 01:01:46,180 A to znači da ako se to dogodi na granici zahvatila niz, 730 01:01:46,180 --> 01:01:50,070 Niz se događa da se ostavi toga i desno od ovog reda stranice, 731 01:01:50,070 --> 01:01:54,460 Tada polje će biti podijeljen u fizičke memorije. 732 01:01:54,460 --> 01:01:59,280 I onda kada prestati program, kada je proces završi, 733 01:01:59,280 --> 01:02:05,690 ove preslikavanja dobiti izbrisani, a zatim je besplatan za korištenje ove male blokove za druge stvari. 734 01:02:14,730 --> 01:02:17,410 Više pitanja? 735 01:02:17,410 --> 01:02:19,960 [Student] pokazivač aritmetika. >> Oh yeah. 736 01:02:19,960 --> 01:02:28,410 Strings bilo lakše, ali gleda na nešto poput Ints, 737 01:02:28,410 --> 01:02:35,000 tako natrag na int x [4]; 738 01:02:35,000 --> 01:02:41,810 Bilo je to polje ili da li je pokazivač na malloced niz brojeva 4, 739 01:02:41,810 --> 01:02:47,060 to će biti tretirani na isti način. 740 01:02:50,590 --> 01:02:53,340 [Student] Dakle, polja su na hrpi? 741 01:03:01,400 --> 01:03:05,270 [Bowden] Nizovi nisu na hrpi. >> [Student] Aha. 742 01:03:05,270 --> 01:03:08,320 >> [Bowden] Ova vrsta niza teži da bude na stog 743 01:03:08,320 --> 01:03:12,220 osim ako ga prijaviti na - ignoriranje globalne varijable. Nemojte koristiti globalne varijable. 744 01:03:12,220 --> 01:03:16,280 Unutar funkcije kažem int x [4]; 745 01:03:16,280 --> 01:03:22,520 To će stvoriti 4-cijeli blok na stog za ovaj niz. 746 01:03:22,520 --> 01:03:26,960 Ali to malloc (4 * sizeof (int)); će ići na hrpi. 747 01:03:26,960 --> 01:03:31,870 Ali nakon ove točke mogu koristiti X i P u podjednakim načine, 748 01:03:31,870 --> 01:03:36,140 osim iznimaka sam prije rekao da si mogu prenamijeniti str. 749 01:03:36,140 --> 01:03:40,960 Tehnički, njihove veličine su nešto drugačiji, ali to je potpuno nebitno. 750 01:03:40,960 --> 01:03:43,310 Vi zapravo nikada koristiti svoje veličine. 751 01:03:48,020 --> 01:03:56,810 P ja mogao reći p [3] = 2; ili x [3] = 2; 752 01:03:56,810 --> 01:03:59,680 Možete ih koristiti na isti način. 753 01:03:59,680 --> 01:04:01,570 Dakle pokazivač aritmetika sada - Da. 754 01:04:01,570 --> 01:04:07,390 [Student] Zar ne morate učiniti p * ako imate nosače? 755 01:04:07,390 --> 01:04:11,720 U zagradama su implicitno dereference. >> Ok. 756 01:04:11,720 --> 01:04:20,200 Zapravo, i što govoriš s možete dobiti višedimenzionalni nizovi 757 01:04:20,200 --> 01:05:02,650 s pokazivačima, što možete učiniti je nešto kao, recimo, int ** pp = malloc (sizeof (int *) * 5); 758 01:05:02,650 --> 01:05:06,900 Samo ću napisati sve to na prvom mjestu. 759 01:05:37,880 --> 01:05:41,020 Nisam željela da se jedan. 760 01:05:41,020 --> 01:05:42,550 Ok. 761 01:05:42,550 --> 01:05:48,910 Ono što sam učinio ovdje je - To bi trebalo biti pp [i]. 762 01:05:48,910 --> 01:05:53,680 Dakle pp je pokazivač na pokazivač. 763 01:05:53,680 --> 01:06:02,420 Vi ste mallocing pp ukazati na niz pet int zvijezda. 764 01:06:02,420 --> 01:06:10,950 Dakle, u spomen imate na stog str 765 01:06:10,950 --> 01:06:20,150 To će ukazati na niz pet blokova koji su sve sami pokazivače. 766 01:06:20,150 --> 01:06:28,210 I onda kad sam malloc ovdje dolje, ja malloc da svaki od tih pojedinačnih pokazivače 767 01:06:28,210 --> 01:06:32,080 treba ukazati na zasebnom bloku 4 bajta na hrpi. 768 01:06:32,080 --> 01:06:35,870 Dakle, ovo ukazuje na 4 bajta. 769 01:06:37,940 --> 01:06:40,660 I to jedan ukazuje na različitim 4 bajta. 770 01:06:40,660 --> 01:06:43,200 >> I svi oni ukazuju na vlastitim četiri bajta. 771 01:06:43,200 --> 01:06:49,080 To mi daje način obavljanja višedimenzionalni stvari. 772 01:06:49,080 --> 01:06:58,030 Mogao bih reći pp [3] [4], ali sada to nije ista stvar kao višedimenzionalni nizovi 773 01:06:58,030 --> 01:07:05,390 jer višedimenzionalna polja je preveo [3] [4] u jednom pomak u x niz. 774 01:07:05,390 --> 01:07:14,790 Ovo dereferences p, pristupa treći indeks, onda dereferences da 775 01:07:14,790 --> 01:07:20,790 i pristupi - 4 će biti nevažeći - drugi indeks. 776 01:07:24,770 --> 01:07:31,430 Dok kada smo imali int x [3] [4] prije kao višedimenzionalni niz 777 01:07:31,430 --> 01:07:35,740 i kada dvaput konzolu to je stvarno samo jedan dereference, 778 01:07:35,740 --> 01:07:40,490 ti si nakon jednog pokazivač, a zatim offset, 779 01:07:40,490 --> 01:07:42,850 ovo je stvarno 2D reference. 780 01:07:42,850 --> 01:07:45,840 Možete pratiti dva odvojena naputke. 781 01:07:45,840 --> 01:07:50,420 Dakle, ovo je također tehnički vam omogućuje da imaju višedimenzionalni nizovi 782 01:07:50,420 --> 01:07:53,550 gdje svaki pojedinačni polje je različite veličine. 783 01:07:53,550 --> 01:07:58,000 Dakle, mislim nazubljeni višedimenzionalna polja je ono što se zove 784 01:07:58,000 --> 01:08:01,870 jer stvarno je prva stvar mogla ukazati na nešto što ima 10 elemenata, 785 01:08:01,870 --> 01:08:05,540 Druga stvar mogla ukazati na nešto što ima 100 elemenata. 786 01:08:05,540 --> 01:08:10,790 [Student] Ima li ograničenje broja pokazivače možete imati 787 01:08:10,790 --> 01:08:14,290 ukazujući na druge pokazivače? >> Ne 788 01:08:14,290 --> 01:08:17,010 Možete imati int ***** str. 789 01:08:18,050 --> 01:08:23,760 Povratak na ciljnikom aritmetike - >> [student] Aha. >> Da. 790 01:08:23,760 --> 01:08:35,649 [Student] Ako imam int *** p i onda radim dereferencing i kažem p * je jednaka toj vrijednosti, 791 01:08:35,649 --> 01:08:39,560 je to samo će učiniti jedan stupanj dereferencing? >> Da. 792 01:08:39,560 --> 01:08:43,340 Dakle, ako želim pristupiti stvar da je posljednji pokazivač pokazuje na - 793 01:08:43,340 --> 01:08:46,210 Onda ti *** str. >> Ok. 794 01:08:46,210 --> 01:08:54,080 Dakle, ovo je p ukazuje na jedan blok, ukazuje na drugom bloku, ukazuje na drugom bloku. 795 01:08:54,080 --> 01:09:02,010 Zatim, ako to učinite * p = nešto drugo, onda se mijenjaju ovo 796 01:09:02,010 --> 01:09:13,640 do sada ukazuju na drugom bloku. >> Ok. 797 01:09:13,640 --> 01:09:17,649 >> [Bowden] A ako su oni bili malloced, onda ste sada procurila memoriju 798 01:09:17,649 --> 01:09:20,430 osim ako vam se dogoditi da imaju različite reference to 799 01:09:20,430 --> 01:09:25,270 budući da ne možete dobiti natrag na one one koje ste upravo bacio. 800 01:09:25,270 --> 01:09:29,550 Pointer aritmetika. 801 01:09:29,550 --> 01:09:36,310 int x [4]; će dodijeliti niz četiriju brojeva 802 01:09:36,310 --> 01:09:40,670 gdje x ide ukazati na početku niza. 803 01:09:40,670 --> 01:09:50,420 Dakle, kada kažem nešto poput x [1]; želim to znači ići u drugi cijeli broj u polju, 804 01:09:50,420 --> 01:09:53,319 što će biti ovaj jedan. 805 01:09:53,319 --> 01:10:04,190 Ali stvarno, to je 4 bajta u nizu jer cijeli zauzima 4 byte. 806 01:10:04,190 --> 01:10:08,470 Dakle odmakom od jednog stvarno znači pomak od 1 807 01:10:08,470 --> 01:10:12,030 puta veći od bez obzira na vrstu polja je. 808 01:10:12,030 --> 01:10:17,170 To je niz brojeva, tako da ne zna napraviti jedan puta veličine int kada se želi nadoknaditi. 809 01:10:17,170 --> 01:10:25,260 Druga sintaksa. Sjetite se da je to ekvivalent * (x + 1); 810 01:10:25,260 --> 01:10:35,250 Kad kažem pokazivač + 1, što da se vraća je adresa koja se pokazivač pohranu 811 01:10:35,250 --> 01:10:40,360 plus jedan puta veće od tipa pokazivača. 812 01:10:40,360 --> 01:10:59,510 Dakle, ako je x = ox100, tada x + 1 = ox104. 813 01:10:59,510 --> 01:11:19,750 A možete zlostavljati to i reći nešto poput char * c = (char *) x; 814 01:11:19,750 --> 01:11:23,050 a sada c će biti na istoj adresi kao x. 815 01:11:23,050 --> 01:11:26,040 c će biti jednak ox100, 816 01:11:26,040 --> 01:11:31,490 ali c + 1 će biti jednaka ox101 817 01:11:31,490 --> 01:11:38,030 budući pokazivač aritmetika ovisi o vrsti pokazivač da ste dodajući da. 818 01:11:38,030 --> 01:11:45,390 Dakle, c + 1, to izgleda na c, to je char pokazivač, tako da će se dodati 1 puta veličinu char, 819 01:11:45,390 --> 01:11:48,110 koji uvijek će biti jedan, tako da ćete dobiti 101, 820 01:11:48,110 --> 01:11:54,890 a ako mi je činiti X, koji je također još uvijek 100, x + 1 će biti 104. 821 01:11:56,660 --> 01:12:06,340 [Student] Mogu li koristiti C + +, kako bi se unaprijed pokazivač po jedan? 822 01:12:06,340 --> 01:12:09,810 Da, možete. 823 01:12:09,810 --> 01:12:16,180 Ne možete to učiniti s x jer je x samo simbol, ona je konstantna, ne možete promijeniti x.. 824 01:12:16,180 --> 01:12:22,610 >> No, c dogodi da samo biti pokazivač, tako da c + + je savršeno vrijedi i to će povećavati po jedan. 825 01:12:22,610 --> 01:12:32,440 Ako c je samo int *, a zatim C + + će biti 104. 826 01:12:32,440 --> 01:12:41,250 + + Ne pokazivač aritmetika baš kao c + 1 bi učinio pokazivača aritmetiku. 827 01:12:43,000 --> 01:12:48,870 To je zapravo kako puno stvari poput spajanja vrste - 828 01:12:49,670 --> 01:12:55,710 Umjesto stvaranja kopije stvari, umjesto toga možete proći - 829 01:12:55,710 --> 01:13:02,400 Sviđa mi se, ako sam htio da prođe ovaj polovicu polja - neka se izbriše nešto od toga. 830 01:13:04,770 --> 01:13:10,520 Ajmo reći da sam željela da prođe ovu stranu polja u funkciji. 831 01:13:10,520 --> 01:13:12,700 Što bih prijeći na tu funkciju? 832 01:13:12,700 --> 01:13:17,050 Ako sam proći x, ja sam prolazeći ovu adresu. 833 01:13:17,050 --> 01:13:23,780 Ali želim da prođe ovaj adresu. Pa što bih trebao proći? 834 01:13:23,780 --> 01:13:26,590 [Student] pointer + 2? 835 01:13:26,590 --> 01:13:29,350 [Bowden] Dakle, x + 2. Da. 836 01:13:29,350 --> 01:13:31,620 To će biti ta adresa. 837 01:13:31,620 --> 01:13:42,810 Također ćete vrlo često ga vide kao x [2], a zatim adresa koje. 838 01:13:42,810 --> 01:13:47,850 Dakle, morate uzeti adresu njega jer je nosač je implicitno dereference. 839 01:13:47,850 --> 01:13:53,250 x [2] se odnosi na vrijednost koja je u tom okviru, a zatim želite adresu tog okvira, 840 01:13:53,250 --> 01:13:56,850 tako da kažem & x [2]. 841 01:13:56,850 --> 01:14:02,880 Dakle, to je kako se nešto u spajanja sortiraj gdje želite da prođe pola popis na nešto 842 01:14:02,880 --> 01:14:08,790 vi stvarno samo prolaze & x [2], a sada koliko rekurzivna poziva tiče, 843 01:14:08,790 --> 01:14:12,510 moj novi niz počinje tamo. 844 01:14:12,510 --> 01:14:15,130 Last minute pitanja. 845 01:14:15,130 --> 01:14:20,050 [Student] Ako mi ne stavi ampersand ili - što je to zove? >> Zvijezda? 846 01:14:20,050 --> 01:14:23,200 [Student] zvjezdice. >> Tehnički, dereference operater, ali - >> [student] Dereference. 847 01:14:23,200 --> 01:14:29,310 >> Ako mi ne stavi zvijezdu ili ampersand, što se događa ako sam samo reći y = x i x je pokazivač? 848 01:14:29,310 --> 01:14:34,620 Koja je vrsta y? >> [Student] ja ću samo reći da je pokazivač dva. 849 01:14:34,620 --> 01:14:38,270 Dakle, ako ste samo reći y = x, sada xiy ukazuju na istu stvar. >> [Student] rose na istu stvar. 850 01:14:38,270 --> 01:14:45,180 A ako je x int pointer? >> To će se žaliti jer ne možete dodijeliti naputke. 851 01:14:45,180 --> 01:14:46,540 [Student] Ok. 852 01:14:46,540 --> 01:14:51,860 Zapamtite da naputke, iako smo ih privući što strijela, 853 01:14:51,860 --> 01:15:02,010 stvarno sve što su trgovina - int * x - stvarno sve x je spremanje je nešto poput ox100, 854 01:15:02,010 --> 01:15:06,490 koji mi se dogoditi da predstavljaju ukazujući na blok pohranjene na 100. 855 01:15:06,490 --> 01:15:19,660 Dakle, kada kažem int * y = x; ja sam samo kopirate ox100 u y, 856 01:15:19,660 --> 01:15:24,630 koje smo upravo ide predstavljati kao y, također ukazuje na ox100. 857 01:15:24,630 --> 01:15:39,810 A ako kažem int i = (int) x; onda ja će pohraniti bez obzira na vrijednost ox100 je 858 01:15:39,810 --> 01:15:45,100 unutar njega, ali sada će to tumačiti kao integer umjesto pokazivača. 859 01:15:45,100 --> 01:15:49,310 Ali, morate cast inače će se žaliti. 860 01:15:49,310 --> 01:15:53,300 [Student] Dakle, misliš da se baci - 861 01:15:53,300 --> 01:16:00,290 Je li će biti lijevanje int od x ili lijevanje int y? 862 01:16:00,290 --> 01:16:03,700 [Bowden] Što? 863 01:16:03,700 --> 01:16:07,690 [Student] Ok. Nakon tih zagradama tamo će biti x ili ay tamo? 864 01:16:07,690 --> 01:16:11,500 >> [Bowden] Ili. x i y su ekvivalent. >> [Student] Ok. 865 01:16:11,500 --> 01:16:14,390 Jer oni su oba pointeri. >> Da. 866 01:16:14,390 --> 01:16:21,050 [Student] Dakle, to bi pohraniti heksadecimalni 100 u integer obliku? >> [Bowden] Aha. 867 01:16:21,050 --> 01:16:23,620 Ali nije vrijednost bez obzira na to ukazuje. 868 01:16:23,620 --> 01:16:29,940 [Bowden] Aha. >> [Student] Dakle, samo je adresa u integer obliku. Ok. 869 01:16:29,940 --> 01:16:34,720 [Bowden] Ako si htio da se za neke bizarne razloga, 870 01:16:34,720 --> 01:16:38,900 ti isključivo mogao nositi s pokazivačima i nikad se bave brojeva 871 01:16:38,900 --> 01:16:49,240 i samo biti poput int * x = 0. 872 01:16:49,240 --> 01:16:53,000 Tada ćete stvarno dobiti zbunjeni kada pokazivač aritmetika počinje događa. 873 01:16:53,000 --> 01:16:56,570 Tako su brojevi koji su pohraniti su besmislene. 874 01:16:56,570 --> 01:16:58,940 To je samo kako ćete završiti ih interpretirajući. 875 01:16:58,940 --> 01:17:02,920 Dakle, ja sam slobodan kopirati ox100 od int * kao int, 876 01:17:02,920 --> 01:17:07,790 i ja sam slobodna dodijeliti - Ti si vjerojatno će dobiti vikao na za ne bacaju - 877 01:17:07,790 --> 01:17:18,160 Ja sam slobodan dodijeliti nešto poput (int *) ox1234 u ovom samovoljnom int *. 878 01:17:18,160 --> 01:17:25,480 Dakle ox123 je jednako vrijedi memorijska adresa kao što je i y. 879 01:17:25,480 --> 01:17:32,060 & Y dogodi da se vrati nešto što je prilično puno ox123. 880 01:17:32,060 --> 01:17:35,430 [Student] Bi li to stvarno cool način da ide iz heksadecimalnom na decimalnom obliku, 881 01:17:35,430 --> 01:17:39,230 sviđa ako imate pokazivač, a vi ga baci kao int? 882 01:17:39,230 --> 01:17:44,860 [Bowden] Vi stvarno može samo ispisati kao printf. 883 01:17:44,860 --> 01:17:50,300 Recimo imam int y = 100. 884 01:17:50,300 --> 01:18:02,700 Dakle printf (% d \ n - kao što je već trebao znati - ispisati da su cjelobrojne,% x. 885 01:18:02,700 --> 01:18:05,190 Samo ćemo ispisati ga kao heksadecimalni. 886 01:18:05,190 --> 01:18:10,760 Dakle, pokazivač ne pohranjuju kao heksadecimalni, 887 01:18:10,760 --> 01:18:12,960 i cijeli ne pohranjuje kao decimalni. 888 01:18:12,960 --> 01:18:14,700 Sve je pohranjen kao binarno. 889 01:18:14,700 --> 01:18:17,950 To je samo da smo skloni pokazati pokazivače kao heksadecimalni 890 01:18:17,950 --> 01:18:23,260 jer mislimo stvari u ovih 4-byte blokova, 891 01:18:23,260 --> 01:18:25,390 i memorijske adrese imaju tendenciju da se upoznate. 892 01:18:25,390 --> 01:18:28,890 Mi smo kao, ako se počinje s BF, onda se dogodi da se na hrpu. 893 01:18:28,890 --> 01:18:35,560 Dakle, to je samo naša interpretacija upućuje kao heksadecimalni. 894 01:18:35,560 --> 01:18:39,200 Ok. Bilo zadnjih pitanja? 895 01:18:39,200 --> 01:18:41,700 >> Ja ću biti ovdje za malo nakon ako imate bilo što drugo. 896 01:18:41,700 --> 01:18:46,070 I to je kraj. 897 01:18:46,070 --> 01:18:48,360 >> [Student] Jupi! [Pljesak] 898 01:18:51,440 --> 01:18:53,000 >> [CS50.TV]