[Powered by Google Translate] Ajmo pričati o nizovima.
Pa zašto bi mi ikada želite koristiti polja?
Pa recimo da imate program koji treba pohraniti 5 studentske iskaznice.
To se može činiti razumnim imati pet odvojenih varijabli.
Iz razloga što ćete vidjeti u malo, mi ćemo početi računajući od 0.
Varijable ćemo imati će biti int id0, int id1, i tako dalje.
Svaka logika želimo izvesti na studentski ID trebat će kopirati i zalijepiti
za svaku od ove studentske ID.
Ako želimo provjeriti koje studenti se dogoditi da se u CS50,
prvo trebate provjeriti ako id0 predstavlja studenta u tijeku.
Zatim učiniti isto za sljedeći student, mi ćemo morati kopirati i zalijepiti kôd za id0
i zamijeniti sve pojave id0 s id1 i tako dalje za ID2, 3 i 4.
>> Čim čuješ da trebamo kopirati i zalijepiti,
trebali početi razmišljati da postoji bolje rješenje.
Sad, što ako ste shvatili da ne trebate 5 studentske iskaznice već sedam?
Morate se vratiti u svoj izvorni kod i dodati u id5, jedan id6,
i kopirati i zalijepiti logiku za provjeru ako iskaznice pripadaju klasi za ove dvije nove osobne iskaznice.
Nema ništa povezuje sve ove iskaznice zajedno, i tako ne postoji način postavljanja
Program za to za ID 0 do 6.
Pa sada ste shvatili da imate 100 studentske iskaznice.
To se počinje činiti manje nego idealno da treba odvojeno objaviti svaki od tih iskaznica,
i kopirati i zalijepiti bilo logiku za one nove osobne iskaznice.
Ali možda odlučni smo i mi to učiniti za sve 100 studenata.
Ali što ako ne znate koliko studenti tamo zapravo?
Postoje samo neki n studenti i vaš program mora pitati korisnika što da je n.
Uh. To se ne događa da rade jako dobro.
Vaš program radi samo za neke stalne broj studenata.
>> Rješavanje svih tih problema je ljepota polja.
Dakle, ono što je niz?
U nekim programskim jezicima putovanja niz može biti u mogućnosti to učiniti nešto više,
ali ovdje ćemo se usredotočiti na temeljne polja strukture podataka kao što ćete vidjeti u C.
Niz je samo veliki blok memorije. To je to.
Kada kažemo imamo niz od 10 brojeva, to samo znači da imaju neki blok
memorije koji je dovoljno velik da držite 10 odvojenih prirodna broja.
Uz pretpostavku da broj je 4 bajta, to znači da je niz od 10 brojeva
je kontinuirani blok od 40 bajtova u memoriji.
Čak i kada koristite višedimenzionalni nizovi, koji mi neće ići u ovdje,
to je još uvijek samo veliki blok memorije.
Multidimenzionalni zapis je samo praktičnost.
Ako imate 3 od 3 multidimenzionalnog niza brojeva,
onda vaš program će stvarno samo liječiti to kao veliki blok od 36 bajtova.
Ukupan broj brojeva je tri puta tri, a svaki cijeli broj zauzima 4 byte.
>> Idemo pogledati osnovni primjer.
Možemo vidjeti ovdje dvije različite načine progla polja.
Morat ćemo komentirati jedan od njih se za program kompajlirati
jer smo proglasiti x puta.
Mi ćemo pogledati neke od razlika između tih dviju vrsta deklaracija u malo.
Obje od tih redaka proglasiti niz veličine N,
gdje smo # define N su kao 10.
Mi samo mogao tako lako su upitani korisnika za pozitivni cijeli
i koristiti taj cijeli kao broj elemenata u našem polju.
Kao naš primjer studentske ID prije, to je vrsta kao što su progla 10 potpuno odvojene
imaginarni varijable; x0, x1, x2, i tako dalje do xn-1.
Ignoriranje linije gdje smo proglasiti niz, primijetit uglatim zagradama netaknut
unutar za petlje.
Kada smo napisati nešto poput x [3], koji ću samo čitati kao x nosač 3,
možete misliti o tome kao molba za imaginarnog X3.
Obavijest nego s nizom veličine N, to znači da je broj unutar zagrada,
koje ćemo nazvati indeks, može biti sve, od 0 do N-1,
što je ukupno N indeksa.
>> Da biste razmišljati o tome kako to zapravo radi
sjetite se da je niz veliki blok memorije.
Uz pretpostavku da broj je 4 bajta, cijeli niz x 40 bajt blok memorije.
Dakle x0 odnosi na prvih 4 bajta u blok.
X [1] se odnosi na sljedeća 4 bajta i tako dalje.
To znači da je početak x je sve program ikad treba pratiti.
Ako želite koristiti x [400], onda program ne zna da je to ekvivalent
za samo 1.600 bajtova nakon početka x..
Gdje smo dobili 1.600 bajtova iz? To je samo 400 puta 4 bajta po cijeli.
>> Prije prelaska na, to je vrlo važno da shvate da u C
ne postoji ovrha indeksa koje koristimo u polju.
Naš veliki blok je samo 10 integeri dugo, ali ništa se neće vikati na nas, ako pišemo x [20]
ili čak x [-5].
Indeks uopće ne mora biti broj.
To može biti bilo koja proizvoljna izraz.
U programu smo koristiti varijablu ja iz for petlje do indeksa u polju.
To je vrlo čest uzorak, petlje od i = 0 do duljine niza,
a onda sam koristi kao indeks za polje.
Na taj način možete učinkovito petlje preko cijelog niza,
i možete ili dodijeliti svakom mjestu u polju ili ga koristiti za neke kalkulacije.
>> U prvoj for petlji, ja počinje na 0,
i tako će dodijeliti 0 mjesto u polju, vrijednost 0 puta dva.
Tada sam koracima, a mi dodijelili prvo mjesto u nizu vrijednost 1 puta dva.
Onda sam opet koracima i tako na do ćemo dodijeliti u položaj N-1 u polju
vrijednost N-1 puta 2.
Tako smo stvorili niz s prvih deset čak brojeva.
Možda izjednačava bi bio malo bolji naziv za varijablu od x,
ali da bi dali stvari daleko.
Drugi for petlji onda samo ispisuje vrijednosti koje smo već pohranjene unutar niza.
>> Pokušajmo pokretanja programa s obje vrste deklaracijama polja
i pogledajte na izlazu programa.
Što se tiče možemo vidjeti, program se ponaša na isti način za obje vrste deklaracija.
Ajmo također uzeti pogledati što se događa, ako smo promijenili prvi petlju da ne zaustavi na N
nego recimo 10000.
Način izvan kraja niza.
Ups. Možda ste vidjeli ovo prije.
Segmentacija kriv znači da je vaš program je srušio.
Možete početi dobivati ​​tih kada dodirnete područja memorije koju ne treba dodirivanje.
Ovdje smo dira 10.000 mjesta izvan početku x,
koja očito je mjesto u memoriji mi ne treba dira.
Dakle, većina nas vjerojatno nije slučajno stavili 10.000 umjesto N,
ali što ako mi nešto suptilniji kao što kažu zapisivanja manji ili jednak N
u za petlje uvjet za razliku od manje od N.
Zapamtite da niz ima samo indeksa od 0 do n-1,
što znači da je indeks N je izvan kraja niza.
Program ne može srušiti u ovom slučaju, ali to je još uvijek pogreška.
U stvari, ova pogreška je tako čest da ima svoj naziv,
isključiti jedna pogreška.
>> To je to za osnove.
Dakle, ono što su glavne razlike između dvije vrste deklaracijama polja?
Jedna od razlika je gdje veliki blok memorije ide.
U prvoj izjavi, koju ću nazvati nosač-array tip,
iako to nipošto nije uobičajeni naziv,
to će ići na stog.
Dok se u drugi, što ću nazvati pokazivač-array tip, to će ići na hrpi.
To znači da kada funkcija vraća, nosač polje će automatski biti deallocated,
dok god IskljuÄŤivo mora zvati besplatno na pokazivač niz
inače imate memorijsku curenja.
Osim toga, nosač polje nije zapravo varijabla.
To je važno. To je samo simbol.
Možete misliti o njemu kao konstanta koja prevodilac bira za vas.
To znači da ne možemo učiniti nešto slično x + + s nosača tipa,
iako je to savršeno valjana s ciljnikom tipa.
>> Pokazivač tip je varijabla.
Za tipa pokazivača, imamo dvije odvojene blokove memorije.
Varijabla x sama je pohranjena u stog, a samo jedan pokazivač,
ali veliki blok memorije pohranjen je na hrpi.
Varijabla x na stog samo pohranjuje adresu
od velikog bloka memorije na hrpi.
Jedna implikacija ovo je s veličinom operatora.
Ako pitate za veličinu nosača niz, to će vam dati veličinu velikog bloka memorije,
nešto poput 40 bajtova,
ali ako pitate za veličinu pokazivača tipa niza,
to će vam dati veličinu varijable x sama, što na aparatu je vjerojatno samo 4 bajta.
Koristeći pointer-array tipa, nemoguće je izravno pitati za
veličina velikog bloka memorije.
To je obično nije mnogo ograničenja jer smo vrlo rijetko žele veličinu
od veliki blok memorije, a obično možemo ga izračunati ako je to potrebno.
>> Konačno, nosač niz dogodi da nam kažete prečac za inicijalizaciju niz.
Idemo vidjeti kako bismo mogli napisati prvih 10 čak cijelih brojeva pomoću prečaca initilization.
Uz pokazivač niz, ne postoji način da to učinite prečicu kao što je ovaj.
Ovo je samo uvod u ono što možete učiniti s polja.
Oni se pojavljuju u gotovo svakom programu možete pisati.
Nadam se da sada možete vidjeti bolji način obavljanja primjer studentske iskaznice
od početka videa.
>> Moje ime je Rob Bowden, a ovo je CS50.