[Powered by Google Translate] Poďme hovoriť o pole.
Tak prečo by sme chceli použiť pole?
No povedzme, že máte program, ktorý potrebuje na uloženie 5 študentov ID.
Mohlo by sa zdať rozumné, aby 5 samostatných premenných.
Z dôvodov, ktoré uvidíme v trochu, začneme počítať od 0.
Premenné budeme mať bude int ID0, int ID1, a tak ďalej.
Akékoľvek logika chceme vykonávať na študentské ID bude potrebné skopírovať a vložiť
pre každú z týchto študentských ID.
Ak chceme zistiť, ktoré študenti stalo, že sa v CS50,
budeme musieť najprv skontrolovať, či ID0 predstavuje študenta v kurze.
Potom urobiť to isté pre ďalšie študentov, budeme musieť skopírovať a vložiť kód pre ID0
a nahradiť všetky výskyty ID0 s ID1 a tak pre ID2, 3, a 4.
>> Keď počujete, že musíme skopírovať a vložiť,
mali by ste začať premýšľať, že je lepšie riešenie.
Tak čo, ak si uvedomíte, že nepotrebujete 5 študentské ID, ale 7?
Musíte sa vrátiť do zdrojového kódu a pridať v ID5, k ID6,
a kopírovať a vložiť logiku pre kontrolu v prípade, že ID patrí do triedy pre tieto 2 nové ID.
Nie je nič spájajúcej všetky tieto identifikátory dohromady, a tak tam nie je žiadny spôsob, ako sa pýtať
program to pre ID 0 až 6.
No teraz si uvedomíte, že máte 100 študentov ID.
Začína to vyzerať menej než ideálne musieť samostatne vyhlásiť každý z týchto ID,
a kopírovať a vkladať žiadnu logiku pre tieto nové ID.
Ale možno sme odhodlaní, a robíme to pre všetkých 100 študentov.
Ale čo keď neviete, koľko študentov je v skutočnosti sú?
Tam sú len niektoré n študenti a váš program musí požiadať užívateľa, čo to n je.
Uh oh. To nebude fungovať veľmi dobre.
Váš program funguje len pre nejakú konštantu počtu študentov.
>> Riešenie všetkých týchto problémov je krása polí.
Takže to, čo je pole?
V niektorých programovacích jazykoch pole typ by mohol byť schopní urobiť trochu viac,
ale tu budeme sústrediť na základnú štruktúru pole dát, rovnako ako uvidíte to v C.
Pole je len veľký blok pamäte. To je všetko.
Keď hovoríme, že majú rad 10 celých čísel, že práve znamená, že máme nejaký blok
pamäte, ktorá je dostatočne veľká pre uloženie 10 samostatných celé čísla.
Za predpokladu, že celé číslo je 4 bajty, to znamená, že rad 10 celých čísel
je kontinuálny blok 40 bajtov v pamäti.
Dokonca aj pri použití viacrozmerných polí, ktoré nebudeme ísť do tu,
je to stále len veľký blok pamäte.
Multidimenzionálne zápis je len pohodlie.
Ak máte 3 od 3 multidimenzionálne pole celých čísel,
potom sa váš program bude naozaj len zaobchádzať s týmto ako veľký blok 36 bajtov.
Celkový počet celých čísel je 3 krát 3, a každý z nich celé číslo zaberá 4 bajty.
>> Poďme sa pozrieť na základné príklad.
Vidíme tu 2 rôzne spôsoby, ako deklarujú polí.
Budeme musieť komentár 1 z nich sa pre program zostaviť
pretože sme vyhlásiť x dvakrát.
My sa pozrieme na niektoré z rozdielov medzi týmito 2 typy vyhlásenia v trochu.
Oba týchto liniek deklarovať pole veľkosti N,
kde sme # define N ako 10.
Mohli by sme rovnako ľahko požiadala užívateľa o kladné číslo
a používa, že celé číslo ako radu prvkov v našom poli.
Rovnako ako náš študentský preukaz príklad skôr, toto je ako deklarovaní 10 úplne samostatnú
imaginárny premenné; x0, x1, x2, a tak ďalej až do XN-1.
Ignorovanie riadky, kde deklarujeme pole, zistíte, že hranaté zátvorky neporušené
vnútri pre slučky.
Keď sme napísať niečo ako x [3], ktorý som si len čítať ako x držiaku 3,
môžete si na to, ako žiadať o imaginárny x3.
Všimnite než s radom veľkosti N, to znamená, že sa počet vnútri držiakov,
ktoré budeme nazývať index, môže byť čokoľvek, od 0 do N-1,
ktorý je celkom indexov N.
>> Ak chcete premýšľať o tom, ako to skutočne funguje
na pamäti, že pole je veľký blok pamäte.
Za predpokladu, že číslo je 4 bajty, celé pole x je 40 byte bloku pamäte.
Takže x0 odkazuje na prvých 4 bytov bloku.
X [1] odkazuje na ďalšie 4 bajty a tak ďalej.
To znamená, že začiatok x je všetko program niekedy potrebuje sledovať.
Ak chcete použiť x [400], potom program vie, že je to rovnaké
na iba 1600 bajtov od začiatku x.
Kde získame 1600 bytov z? Je to len 400 krát 4 bytov na integer.
>> Pred tým, než, že je to veľmi dôležité si uvedomiť, že v C
nie je výkon indexu že používame v poli.
Náš veľký blok je iba 10 celých čísel dlhý, ale nič sa kričať na nás, ak budeme písať x [20]
alebo dokonca x [-5].
Index ani nemusí byť číslo.
To môže byť akákoľvek ľubovoľná výraz.
V programe používame premennú aj od slučky for a indexu do poľa.
To je veľmi časté vzor, ​​opakovanie od i = 0 k dĺžke poľa,
a potom sa za použitie aj ako index pre pole.
Týmto spôsobom sa účinne slučky cez celé pole,
a vy môžete buď priradiť každom mieste v poli alebo ho použiť k nejakej výpočet.
>> V prvej pre sláčiky, aj začína 0,
a tak to bude priradiť 0 mieste v poli, hodnota 0 krát 2.
Potom aj prírastky, a priradíme prvé miesto v poli Hodnota 1 krát 2.
Potom aj prírastky znovu a tak ďalej, až by sme priradiť do polohy N-1 v poli
hodnota N-1 krát 2.
Takže sme vytvorili pole s prvými 10 párnych čísel.
Možno vyrovnáva by bolo trochu lepšie meno pre premennú ako x,
ale to by rovnako veci preč.
Druhý cyklus for potom vytlačí len hodnoty, ktoré sme už uložené vnútri poľa.
>> Skúsme spustenie programu s oboma typmi polí vyhlásenie
a pozrite sa na výstupe programu.
Ak, ako môžeme vidieť, program sa chová rovnako pre obidva typy vyhlásení.
Poďme sa tiež pozrieť na to, čo sa stane, keď zmeníme prvé slučku nezastaví na N
ale hovoria 10000.
Cesta za koncom poľa.
Chybička sa vlúdila. Možno ste videli predtým.
Segmentation fault znamená, že máte program havaroval.
Začnete vidieť tieto, keď sa dotknete oblasti pamäte, ktorú by nemal byť dotýkajú.
Tu sme sa dotýkajú 10.000 miest mimo začiatku x,
ktoré evidentne je miesto v pamäti by sme nemali dotýkať.
Takže väčšina z nás by asi nebolo náhodou dal 10.000 miesto N,
ale čo keď to urobíme niečo jemnejšie ako povedať, písať menej než alebo sa rovno k n
v pre slučke stave, na rozdiel od menej ako N.
Pamätajte si, že pole má iba indexy od 0 do N-1,
, Čo znamená, že index n je za koncom poľa.
Program nemusí zlyhanie v tomto prípade, ale je to stále chyba.
V skutočnosti, táto chyba je tak bežné, že to má svoj vlastný názov,
preč 1 chybe.
>> To je to pre základy.
Takže aké sú hlavné rozdiely medzi 2 typy polí vyhlásenie?
Jeden rozdiel je tam veľké blok pamäte ide.
V prvom vyhlásení, ktoré budem volať držiak-typ poľa,
aj keď je to v žiadnom prípade konvenčné meno,
že pôjde na stack.
Zatiaľ čo v druhom, ktorý budem volať ručičkový typ poľa, bude to ísť na halde.
To znamená, že keď sa funkcia vráti, držiak poľa automaticky vrátený,
vzhľadom k tomu, musíte explicitily volať zadarmo na ukazovateľ poľa
inak máte pretečeniu pamäte.
Navyše držiak pole nie je v skutočnosti premenná.
To je dôležité. Je to len symbol.
Môžete si ju predstaviť ako konštantu, ktorá kompilátor vyberie pre vás.
To znamená, že nemôžeme urobiť niečo ako x + + s držiakom typu,
aj keď je to úplne platí pri typ ukazovateľa.
>> Ukazovateľ typu je premenná.
Pre typ ukazovatele, máme 2 oddelené bloky pamäte.
Premenná x sám je uložený v zásobníku a je len jeden ukazovateľ,
ale veľký blok pamäte je uložená na halde.
Premenná x na zásobníku len uloží adresu
veľkého bloku pamäte na halde.
Jedným z dôsledkov tohto je s veľkosťou prevádzkovateľa.
Ak sa spýtate pre veľkosť držiaka pole, bude vám veľkosť veľkého bloku pamäte,
niečo ako 40 bajtov,
ale ak sa spýtate na veľkosti ukazovatele typu poľa,
to vám dá veľkosť premennej x sám, ktorý na spotrebič je pravdepodobne len 4 bajty.
Pomocou ručičkový typu pole, to je nemožné priamo požiadať o
veľkosť veľkého bloku pamäte.
To zvyčajne nie je moc obmedzenia, pretože sme veľmi zriedka chceme veľkosť
z veľkých blok pamäte, a my môžeme zvyčajne spočítať, ak ju potrebujeme.
>> Konečne, držiak pole sa stane, aby nám poskytli zástupca pre inicializáciu poľa.
Poďme sa pozrieť, ako by to mohlo písať prvý 10 dokonca celých čísel pomocou zástupcu initilization.
S ukazovateľom pole, nie je spôsob, ako to urobiť zástupcu takého.
To je len úvodom do toho, čo môžete robiť s poľami.
Sa objaví v takmer každom programe píšete.
Dúfajme, že si teraz môžete vidieť lepší spôsob, ako robiť študentský ids príklad
od začiatku videa.
>> Moje meno je Rob Bowden, a to je CS50.