[Powered by Google Translate] Pojďme mluvit o pole.
Tak proč bychom chtěli použít pole?
No řekněme, že máte program, který potřebuje k uložení 5 studentů ID.
Mohlo by se zdát rozumné, aby 5 samostatných proměnných.
Z důvodů, které uvidíme v trochu, začneme počítat od 0.
Proměnné budeme mít bude int ID0, int ID1, a tak dále.
Jakékoliv logika chceme provádět na studentské ID bude třeba zkopírovat a vložit
pro každou z těchto studentských ID.
Chceme-li zjistit, které studenti stalo, že se v CS50,
budeme muset nejprve zkontrolovat, zda ID0 představuje studenta v kurzu.
Pak udělat to samé pro další studenty, budeme muset zkopírovat a vložit kód pro ID0
a nahradit všechny výskyty ID0 s ID1 a tak pro ID2, 3, a 4.
>> Jakmile uslyšíte, že musíme zkopírovat a vložit,
měli byste začít přemýšlet, že je lepší řešení.
Tak co, pokud si uvědomíte, že nepotřebujete 5 studentské ID, ale 7?
Musíte se vrátit do zdrojového kódu a přidat v ID5, k ID6,
a kopírovat a vložit logiku pro kontrolu v případě, že ID patří do třídy pro tyto 2 nové ID.
Není nic spojující všechny tyto identifikátory dohromady, a tak tam není žádný způsob, jak se ptát
program, aby to pro ID 0 až 6.
No teď si uvědomíte, že máte 100 studentů ID.
Začíná to vypadat méně než ideální muset samostatně prohlásit každý z těchto ID,
a kopírovat a vkládat žádnou logiku pro tyto nové ID.
Ale možná jsme odhodláni, a děláme to pro všechny 100 studentů.
Ale co když nevíte, kolik studentů je ve skutečnosti jsou?
Tam jsou jen některé n studenti a váš program musí požádat uživatele, co to n je.
Uh oh. To nebude fungovat velmi dobře.
Váš program funguje pouze pro nějakou konstantu počtu studentů.
>> Řešení všech těchto problémů je krása polí.
Takže to, co je pole?
V některých programovacích jazycích pole typ by mohl být schopni udělat trochu víc,
ale tady budeme soustředit na základní strukturu pole dat, stejně jako uvidíte to v C.
Pole je jen velký blok paměti. To je všechno.
Když říkáme, že mají řadu 10 celých čísel, že právě znamená, že máme nějaký blok
paměti, která je dostatečně velká pro uložení 10 samostatných celá čísla.
Za předpokladu, že celé číslo je 4 bajty, to znamená, že řada 10 celých čísel
je kontinuální blok 40 bajtů v paměti.
Dokonce i při použití vícerozměrných polí, které nebudeme jít do tady,
je to stále jen velký blok paměti.
Multidimenzionální zápis je jen pohodlí.
Pokud máte 3 od 3 multidimenzionální pole celých čísel,
pak se váš program bude opravdu jen zacházet s tímto jako velký blok 36 bajtů.
Celkový počet celých čísel je 3 krát 3, a každý z nich celé číslo zabírá 4 bajty.
>> Pojďme se podívat na základní příklad.
Vidíme zde 2 různé způsoby, jak deklarují polí.
Budeme muset komentář 1 z nich se pro program sestavit
protože jsme prohlásit x dvakrát.
My se podíváme na některé z rozdílů mezi těmito 2 typy prohlášení v trochu.
Oba těchto linek deklarovat pole velikosti N,
kde jsme # define N jako 10.
Mohli bychom stejně snadno požádala uživatele o kladné číslo
a používá, že celé číslo jako řady prvků v našem poli.
Stejně jako náš studentský průkaz příklad dříve, tohle je jako deklarování 10 zcela samostatnou
imaginární proměnné; x0, x1, x2, a tak dále až do XN-1.
Ignorování řádky, kde deklarujeme pole, zjistíte, že hranaté závorky neporušené
uvnitř pro smyčky.
Když jsme napsat něco jako x [3], který jsem si jen číst jako x držáku 3,
můžete si na to, jako žádat o imaginární x3.
Všimněte než s řadou velikosti N, to znamená, že se počet uvnitř držáků,
které budeme nazývat index, může být cokoliv, od 0 do N-1,
který je celkem indexů N.
>> Chcete-li si o tom, jak to skutečně funguje
na paměti, že pole je velký blok paměti.
Za předpokladu, že číslo je 4 bajty, celé pole x je 40 byte bloku paměti.
Takže x0 odkazuje na prvních 4 bytů bloku.
X [1] odkazuje na další 4 bajty a tak dále.
To znamená, že začátek x je všechno program někdy potřebuje sledovat.
Pokud chcete použít x [400], pak program ví, že je to stejné
k jen 1600 bajtů od začátku x.
Kde získáme 1600 bytů z? Je to jen 400 krát 4 bytů na integer.
>> Před tím, než, že je velmi důležité si uvědomit, že v C
není výkon indexu že používáme v poli.
Náš velký blok je pouze 10 celých čísel dlouhý, ale nic se křičet na nás, pokud budeme psát x [20]
nebo dokonce x [-5].
Index ani nemusí být číslo.
To může být jakákoli libovolná výraz.
V programu používáme proměnnou i od smyčky for a indexu do pole.
To je velmi časté vzor, ​​opakování od i = 0 k délce pole,
a pak se za použití i jako index pro pole.
Tímto způsobem se účinně smyčky přes celé pole,
a vy můžete buď přiřadit ke každému bodu v poli nebo jej použít pro některé výpočet.
>> V první pro smyčce, i začíná na hodnotě 0,
a tak to bude přiřadit 0 místě v poli, hodnota 0 krát 2.
Pak jsem přírůstky, a přiřadíme první místo v poli hodnota 1 krát 2.
Pak jsem přírůstky znovu a tak dále, až bychom přiřadit do polohy N-1 v poli
hodnota N-1 krát 2.
Takže jsme vytvořili pole s prvními 10 sudých čísel.
Možná vyrovnává by bylo trochu lepší jméno pro proměnnou než x,
ale že by dali věci pryč.
Druhý cyklus for poté vytiskne pouze hodnoty, které jsme již uložené uvnitř pole.
>> Zkusme spuštění programu s oběma typy polí prohlášení
a podívejte se na výstupu programu.
Co se týče můžeme vidět, program se chová stejně pro oba typy prohlášení.
Pojďme se také podívat na to, co se stane, když změníme první smyčku nezastaví na N
ale říkají 10000.
Cesta za koncem pole.
Chybička se vloudila. Možná jste viděli předtím.
Segmentation fault znamená, že máte program havaroval.
Začnete vidět tyto, když se dotknete oblasti paměti, kterou by neměl být dotýkají.
Zde jsme se dotýkají 10.000 míst mimo začátku x,
které evidentně je místo v paměti bychom neměli dotýkat.
Takže většina z nás by asi nebylo náhodou dal 10.000 místo N,
ale co když to uděláme něco jemnější jako říct, psát méně než nebo se rovnat k n
v pro smyčce stavu, na rozdíl od méně než N.
Pamatujte si, že pole má pouze indexy od 0 do N-1,
, což znamená, že index n je za koncem pole.
Program nemusí selhání v tomto případě, ale je to stále chyba.
Ve skutečnosti, tato chyba je tak běžné, že to má svůj vlastní název,
off o 1 chybě.
>> To je to pro základy.
Takže jaké jsou hlavní rozdíly mezi 2 typy polí prohlášení?
Jeden rozdíl je místo, kde velký blok paměti jde.
V prvním prohlášení, které budu volat držák-typ pole,
i když je to v žádném případě konvenční název,
že půjde na stack.
Zatímco v druhém, který budu volat ručičkový typ pole, bude to jít na haldě.
To znamená, že když se funkce vrátí, držák pole automaticky navrácen,
vzhledem k tomu, musíte explicitily volat zdarma na ukazatel pole
jinak máte nevracení paměti.
Navíc, držák pole není ve skutečnosti proměnná.
To je důležité. Je to jen symbol.
Můžete si ji představit jako konstantu, že kompilátor vybere pro vás.
To znamená, že nemůžeme udělat něco jako x + + s držákem typu,
i když je to naprosto platí při typ ukazatele.
>> Ukazatel typu je proměnná.
Pro typ ukazatele, máme 2 oddělené bloky paměti.
Proměnná x sám je uložen v zásobníku a je jen jeden ukazatel,
ale velký blok paměti je uložena na haldě.
Proměnná x na zásobníku jen uloží adresu
velkého bloku paměti na haldě.
Jedním z důsledků tohoto je s velikostí provozovatele.
Zeptáte-li se pro velikost držáku pole, bude vám velikost velkého bloku paměti,
něco jako 40 bajtů,
ale pokud se zeptáte na velikosti ukazatele typu pole,
to vám dá velikost proměnné x sám, který na spotřebič je pravděpodobně jen 4 bajty.
Pomocí ručičkový typu pole, to je nemožné přímo požádat o
velikost velkého bloku paměti.
To obvykle není moc omezení, protože jsme velmi zřídka chceme velikost
z velkých blok paměti, a my můžeme obvykle spočítat, pokud ji potřebujeme.
>> Konečně, držák pole se stane, aby nám poskytli zástupce pro inicializaci pole.
Pojďme se podívat, jak by to mohlo psát první 10 dokonce celých čísel pomocí zástupce initilization.
S ukazatelem pole, není způsob, jak to udělat zástupce takového.
To je jen úvodem do toho, co můžete dělat s poli.
Se objeví v téměř každém programu píšete.
Doufejme, že nyní můžete vidět lepší způsob, jak dělat studentský ids příklad
od začátku videa.
>> Mé jméno je Rob Bowden, a to je CS50.