1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Ajmo pričati o nizovima. 2 00:00:09,360 --> 00:00:12,780 Pa zašto bi mi ikada želite koristiti polja? 3 00:00:12,780 --> 00:00:17,210 Pa recimo da imate program koji treba pohraniti 5 studentske iskaznice. 4 00:00:17,210 --> 00:00:21,270 To se može činiti razumnim imati pet odvojenih varijabli. 5 00:00:21,270 --> 00:00:24,240 Iz razloga što ćete vidjeti u malo, mi ćemo početi računajući od 0. 6 00:00:24,240 --> 00:00:30,700 Varijable ćemo imati će biti int id0, int id1, i tako dalje. 7 00:00:30,700 --> 00:00:34,870 Svaka logika želimo izvesti na studentski ID trebat će kopirati i zalijepiti 8 00:00:34,870 --> 00:00:36,870 za svaku od ove studentske ID. 9 00:00:36,870 --> 00:00:39,710 Ako želimo provjeriti koje studenti se dogoditi da se u CS50, 10 00:00:39,710 --> 00:00:43,910 prvo trebate provjeriti ako id0 predstavlja studenta u tijeku. 11 00:00:43,910 --> 00:00:48,070 Zatim učiniti isto za sljedeći student, mi ćemo morati kopirati i zalijepiti kôd za id0 12 00:00:48,070 --> 00:00:54,430 i zamijeniti sve pojave id0 s id1 i tako dalje za ID2, 3 i 4. 13 00:00:54,430 --> 00:00:57,560 >> Čim čuješ da trebamo kopirati i zalijepiti, 14 00:00:57,560 --> 00:01:00,440 trebali početi razmišljati da postoji bolje rješenje. 15 00:01:00,440 --> 00:01:05,360 Sad, što ako ste shvatili da ne trebate 5 studentske iskaznice već sedam? 16 00:01:05,360 --> 00:01:09,570 Morate se vratiti u svoj izvorni kod i dodati u id5, jedan id6, 17 00:01:09,570 --> 00:01:14,260 i kopirati i zalijepiti logiku za provjeru ako iskaznice pripadaju klasi za ove dvije nove osobne iskaznice. 18 00:01:14,260 --> 00:01:19,600 Nema ništa povezuje sve ove iskaznice zajedno, i tako ne postoji način postavljanja 19 00:01:19,600 --> 00:01:22,040 Program za to za ID 0 do 6. 20 00:01:22,040 --> 00:01:26,120 Pa sada ste shvatili da imate 100 studentske iskaznice. 21 00:01:26,120 --> 00:01:30,770 To se počinje činiti manje nego idealno da treba odvojeno objaviti svaki od tih iskaznica, 22 00:01:30,770 --> 00:01:33,760 i kopirati i zalijepiti bilo logiku za one nove osobne iskaznice. 23 00:01:33,760 --> 00:01:38,380 Ali možda odlučni smo i mi to učiniti za sve 100 studenata. 24 00:01:38,380 --> 00:01:42,240 Ali što ako ne znate koliko studenti tamo zapravo? 25 00:01:42,240 --> 00:01:47,320 Postoje samo neki n studenti i vaš program mora pitati korisnika što da je n. 26 00:01:47,320 --> 00:01:50,250 Uh. To se ne događa da rade jako dobro. 27 00:01:50,250 --> 00:01:53,820 Vaš program radi samo za neke stalne broj studenata. 28 00:01:53,820 --> 00:01:57,520 >> Rješavanje svih tih problema je ljepota polja. 29 00:01:57,520 --> 00:01:59,930 Dakle, ono što je niz? 30 00:01:59,930 --> 00:02:04,480 U nekim programskim jezicima putovanja niz može biti u mogućnosti to učiniti nešto više, 31 00:02:04,480 --> 00:02:09,960 ali ovdje ćemo se usredotočiti na temeljne polja strukture podataka kao što ćete vidjeti u C. 32 00:02:09,960 --> 00:02:14,030 Niz je samo veliki blok memorije. To je to. 33 00:02:14,030 --> 00:02:17,770 Kada kažemo imamo niz od 10 brojeva, to samo znači da imaju neki blok 34 00:02:17,770 --> 00:02:20,740 memorije koji je dovoljno velik da držite 10 odvojenih prirodna broja. 35 00:02:29,930 --> 00:02:33,410 Uz pretpostavku da broj je 4 bajta, to znači da je niz od 10 brojeva 36 00:02:33,410 --> 00:02:37,180 je kontinuirani blok od 40 bajtova u memoriji. 37 00:02:42,660 --> 00:02:46,280 Čak i kada koristite višedimenzionalni nizovi, koji mi neće ići u ovdje, 38 00:02:46,280 --> 00:02:49,200 to je još uvijek samo veliki blok memorije. 39 00:02:49,200 --> 00:02:51,840 Multidimenzionalni zapis je samo praktičnost. 40 00:02:51,840 --> 00:02:55,640 Ako imate 3 od 3 multidimenzionalnog niza brojeva, 41 00:02:55,640 --> 00:03:00,650 onda vaš program će stvarno samo liječiti to kao veliki blok od 36 bajtova. 42 00:03:00,650 --> 00:03:05,460 Ukupan broj brojeva je tri puta tri, a svaki cijeli broj zauzima 4 byte. 43 00:03:05,460 --> 00:03:07,750 >> Idemo pogledati osnovni primjer. 44 00:03:07,750 --> 00:03:10,660 Možemo vidjeti ovdje dvije različite načine progla polja. 45 00:03:15,660 --> 00:03:18,580 Morat ćemo komentirati jedan od njih se za program kompajlirati 46 00:03:18,580 --> 00:03:20,900 jer smo proglasiti x puta. 47 00:03:20,900 --> 00:03:25,140 Mi ćemo pogledati neke od razlika između tih dviju vrsta deklaracija u malo. 48 00:03:25,140 --> 00:03:28,560 Obje od tih redaka proglasiti niz veličine N, 49 00:03:28,560 --> 00:03:30,740 gdje smo # define N su kao 10. 50 00:03:30,740 --> 00:03:34,460 Mi samo mogao tako lako su upitani korisnika za pozitivni cijeli 51 00:03:34,460 --> 00:03:37,250 i koristiti taj cijeli kao broj elemenata u našem polju. 52 00:03:37,250 --> 00:03:41,960 Kao naš primjer studentske ID prije, to je vrsta kao što su progla 10 potpuno odvojene 53 00:03:41,960 --> 00:03:49,000 imaginarni varijable; x0, x1, x2, i tako dalje do xn-1. 54 00:03:57,270 --> 00:04:00,840 Ignoriranje linije gdje smo proglasiti niz, primijetit uglatim zagradama netaknut 55 00:04:00,840 --> 00:04:02,090 unutar za petlje. 56 00:04:02,090 --> 00:04:09,660 Kada smo napisati nešto poput x [3], koji ću samo čitati kao x nosač 3, 57 00:04:09,660 --> 00:04:13,090 možete misliti o tome kao molba za imaginarnog X3. 58 00:04:13,090 --> 00:04:17,519 Obavijest nego s nizom veličine N, to znači da je broj unutar zagrada, 59 00:04:17,519 --> 00:04:22,630 koje ćemo nazvati indeks, može biti sve, od 0 do N-1, 60 00:04:22,630 --> 00:04:25,660 što je ukupno N indeksa. 61 00:04:25,660 --> 00:04:28,260 >> Da biste razmišljati o tome kako to zapravo radi 62 00:04:28,260 --> 00:04:31,260 sjetite se da je niz veliki blok memorije. 63 00:04:31,260 --> 00:04:37,460 Uz pretpostavku da broj je 4 bajta, cijeli niz x 40 bajt blok memorije. 64 00:04:37,460 --> 00:04:41,360 Dakle x0 odnosi na prvih 4 bajta u blok. 65 00:04:45,810 --> 00:04:49,230 X [1] se odnosi na sljedeća 4 bajta i tako dalje. 66 00:04:49,230 --> 00:04:53,760 To znači da je početak x je sve program ikad treba pratiti. 67 00:04:55,660 --> 00:04:59,840 Ako želite koristiti x [400], onda program ne zna da je to ekvivalent 68 00:04:59,840 --> 00:05:03,460 za samo 1.600 bajtova nakon početka x.. 69 00:05:03,460 --> 00:05:08,780 Gdje smo dobili 1.600 bajtova iz? To je samo 400 puta 4 bajta po cijeli. 70 00:05:08,780 --> 00:05:13,170 >> Prije prelaska na, to je vrlo važno da shvate da u C 71 00:05:13,170 --> 00:05:17,080 ne postoji ovrha indeksa koje koristimo u polju. 72 00:05:17,080 --> 00:05:23,180 Naš veliki blok je samo 10 integeri dugo, ali ništa se neće vikati na nas, ako pišemo x [20] 73 00:05:23,180 --> 00:05:26,060 ili čak x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeks uopće ne mora biti broj. 75 00:05:28,240 --> 00:05:30,630 To može biti bilo koja proizvoljna izraz. 76 00:05:30,630 --> 00:05:34,800 U programu smo koristiti varijablu ja iz for petlje do indeksa u polju. 77 00:05:34,800 --> 00:05:40,340 To je vrlo čest uzorak, petlje od i = 0 do duljine niza, 78 00:05:40,340 --> 00:05:43,350 a onda sam koristi kao indeks za polje. 79 00:05:43,350 --> 00:05:46,160 Na taj način možete učinkovito petlje preko cijelog niza, 80 00:05:46,160 --> 00:05:50,600 i možete ili dodijeliti svakom mjestu u polju ili ga koristiti za neke kalkulacije. 81 00:05:50,600 --> 00:05:53,920 >> U prvoj for petlji, ja počinje na 0, 82 00:05:53,920 --> 00:05:58,680 i tako će dodijeliti 0 mjesto u polju, vrijednost 0 puta dva. 83 00:05:58,680 --> 00:06:04,370 Tada sam koracima, a mi dodijelili prvo mjesto u nizu vrijednost 1 puta dva. 84 00:06:04,370 --> 00:06:10,170 Onda sam opet koracima i tako na do ćemo dodijeliti u položaj N-1 u polju 85 00:06:10,170 --> 00:06:13,370 vrijednost N-1 puta 2. 86 00:06:13,370 --> 00:06:17,810 Tako smo stvorili niz s prvih deset čak brojeva. 87 00:06:17,810 --> 00:06:21,970 Možda izjednačava bi bio malo bolji naziv za varijablu od x, 88 00:06:21,970 --> 00:06:24,760 ali da bi dali stvari daleko. 89 00:06:24,760 --> 00:06:30,210 Drugi for petlji onda samo ispisuje vrijednosti koje smo već pohranjene unutar niza. 90 00:06:30,210 --> 00:06:33,600 >> Pokušajmo pokretanja programa s obje vrste deklaracijama polja 91 00:06:33,600 --> 00:06:36,330 i pogledajte na izlazu programa. 92 00:06:51,450 --> 00:06:57,020 Što se tiče možemo vidjeti, program se ponaša na isti način za obje vrste deklaracija. 93 00:06:57,020 --> 00:07:02,230 Ajmo također uzeti pogledati što se događa, ako smo promijenili prvi petlju da ne zaustavi na N 94 00:07:02,230 --> 00:07:05,040 nego recimo 10000. 95 00:07:05,040 --> 00:07:07,430 Način izvan kraja niza. 96 00:07:14,700 --> 00:07:17,210 Ups. Možda ste vidjeli ovo prije. 97 00:07:17,210 --> 00:07:20,440 Segmentacija kriv znači da je vaš program je srušio. 98 00:07:20,440 --> 00:07:24,430 Možete početi dobivati ​​tih kada dodirnete područja memorije koju ne treba dodirivanje. 99 00:07:24,430 --> 00:07:27,870 Ovdje smo dira 10.000 mjesta izvan početku x, 100 00:07:27,870 --> 00:07:31,920 koja očito je mjesto u memoriji mi ne treba dira. 101 00:07:31,920 --> 00:07:37,690 Dakle, većina nas vjerojatno nije slučajno stavili 10.000 umjesto N, 102 00:07:37,690 --> 00:07:42,930 ali što ako mi nešto suptilniji kao što kažu zapisivanja manji ili jednak N 103 00:07:42,930 --> 00:07:46,830 u za petlje uvjet za razliku od manje od N. 104 00:07:46,830 --> 00:07:50,100 Zapamtite da niz ima samo indeksa od 0 do n-1, 105 00:07:50,100 --> 00:07:54,510 što znači da je indeks N je izvan kraja niza. 106 00:07:54,510 --> 00:07:58,050 Program ne može srušiti u ovom slučaju, ali to je još uvijek pogreška. 107 00:07:58,050 --> 00:08:01,950 U stvari, ova pogreška je tako čest da ima svoj naziv, 108 00:08:01,950 --> 00:08:03,970 isključiti jedna pogreška. 109 00:08:03,970 --> 00:08:05,970 >> To je to za osnove. 110 00:08:05,970 --> 00:08:09,960 Dakle, ono što su glavne razlike između dvije vrste deklaracijama polja? 111 00:08:09,960 --> 00:08:13,960 Jedna od razlika je gdje veliki blok memorije ide. 112 00:08:13,960 --> 00:08:17,660 U prvoj izjavi, koju ću nazvati nosač-array tip, 113 00:08:17,660 --> 00:08:20,300 iako to nipošto nije uobičajeni naziv, 114 00:08:20,300 --> 00:08:22,480 to će ići na stog. 115 00:08:22,480 --> 00:08:27,450 Dok se u drugi, što ću nazvati pokazivač-array tip, to će ići na hrpi. 116 00:08:27,450 --> 00:08:32,480 To znači da kada funkcija vraća, nosač polje će automatski biti deallocated, 117 00:08:32,480 --> 00:08:36,419 dok god IskljuÄŤivo mora zvati besplatno na pokazivač niz 118 00:08:36,419 --> 00:08:38,010 inače imate memorijsku curenja. 119 00:08:38,010 --> 00:08:42,750 Osim toga, nosač polje nije zapravo varijabla. 120 00:08:42,750 --> 00:08:45,490 To je važno. To je samo simbol. 121 00:08:45,490 --> 00:08:49,160 Možete misliti o njemu kao konstanta koja prevodilac bira za vas. 122 00:08:49,160 --> 00:08:52,970 To znači da ne možemo učiniti nešto slično x + + s nosača tipa, 123 00:08:52,970 --> 00:08:56,240 iako je to savršeno valjana s ciljnikom tipa. 124 00:08:56,240 --> 00:08:58,270 >> Pokazivač tip je varijabla. 125 00:08:58,270 --> 00:09:01,510 Za tipa pokazivača, imamo dvije odvojene blokove memorije. 126 00:09:01,510 --> 00:09:06,060 Varijabla x sama je pohranjena u stog, a samo jedan pokazivač, 127 00:09:06,060 --> 00:09:08,620 ali veliki blok memorije pohranjen je na hrpi. 128 00:09:08,620 --> 00:09:11,010 Varijabla x na stog samo pohranjuje adresu 129 00:09:11,010 --> 00:09:14,010 od velikog bloka memorije na hrpi. 130 00:09:14,010 --> 00:09:17,370 Jedna implikacija ovo je s veličinom operatora. 131 00:09:17,370 --> 00:09:22,480 Ako pitate za veličinu nosača niz, to će vam dati veličinu velikog bloka memorije, 132 00:09:22,480 --> 00:09:24,620 nešto poput 40 bajtova, 133 00:09:24,620 --> 00:09:26,920 ali ako pitate za veličinu pokazivača tipa niza, 134 00:09:26,920 --> 00:09:32,740 to će vam dati veličinu varijable x sama, što na aparatu je vjerojatno samo 4 bajta. 135 00:09:32,740 --> 00:09:36,530 Koristeći pointer-array tipa, nemoguće je izravno pitati za 136 00:09:36,530 --> 00:09:38,530 veličina velikog bloka memorije. 137 00:09:38,530 --> 00:09:42,530 To je obično nije mnogo ograničenja jer smo vrlo rijetko žele veličinu 138 00:09:42,530 --> 00:09:46,980 od veliki blok memorije, a obično možemo ga izračunati ako je to potrebno. 139 00:09:46,980 --> 00:09:51,490 >> Konačno, nosač niz dogodi da nam kažete prečac za inicijalizaciju niz. 140 00:09:51,490 --> 00:09:56,130 Idemo vidjeti kako bismo mogli napisati prvih 10 čak cijelih brojeva pomoću prečaca initilization. 141 00:10:11,220 --> 00:10:14,470 Uz pokazivač niz, ne postoji način da to učinite prečicu kao što je ovaj. 142 00:10:14,470 --> 00:10:18,120 Ovo je samo uvod u ono što možete učiniti s polja. 143 00:10:18,120 --> 00:10:20,990 Oni se pojavljuju u gotovo svakom programu možete pisati. 144 00:10:20,990 --> 00:10:24,390 Nadam se da sada možete vidjeti bolji način obavljanja primjer studentske iskaznice 145 00:10:24,390 --> 00:10:26,710 od početka videa. 146 00:10:26,710 --> 00:10:29,960 >> Moje ime je Rob Bowden, a ovo je CS50.