1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Pojďme mluvit o pole. 2 00:00:09,360 --> 00:00:12,780 Tak proč bychom chtěli použít pole? 3 00:00:12,780 --> 00:00:17,210 No řekněme, že máte program, který potřebuje k uložení 5 studentů ID. 4 00:00:17,210 --> 00:00:21,270 Mohlo by se zdát rozumné, aby 5 samostatných proměnných. 5 00:00:21,270 --> 00:00:24,240 Z důvodů, které uvidíme v trochu, začneme počítat od 0. 6 00:00:24,240 --> 00:00:30,700 Proměnné budeme mít bude int ID0, int ID1, a tak dále. 7 00:00:30,700 --> 00:00:34,870 Jakékoliv logika chceme provádět na studentské ID bude třeba zkopírovat a vložit 8 00:00:34,870 --> 00:00:36,870 pro každou z těchto studentských ID. 9 00:00:36,870 --> 00:00:39,710 Chceme-li zjistit, které studenti stalo, že se v CS50, 10 00:00:39,710 --> 00:00:43,910 budeme muset nejprve zkontrolovat, zda ID0 představuje studenta v kurzu. 11 00:00:43,910 --> 00:00:48,070 Pak udělat to samé pro další studenty, budeme muset zkopírovat a vložit kód pro ID0 12 00:00:48,070 --> 00:00:54,430 a nahradit všechny výskyty ID0 s ID1 a tak pro ID2, 3, a 4. 13 00:00:54,430 --> 00:00:57,560 >> Jakmile uslyšíte, že musíme zkopírovat a vložit, 14 00:00:57,560 --> 00:01:00,440 měli byste začít přemýšlet, že je lepší řešení. 15 00:01:00,440 --> 00:01:05,360 Tak co, pokud si uvědomíte, že nepotřebujete 5 studentské ID, ale 7? 16 00:01:05,360 --> 00:01:09,570 Musíte se vrátit do zdrojového kódu a přidat v ID5, k ID6, 17 00:01:09,570 --> 00:01:14,260 a kopírovat a vložit logiku pro kontrolu v případě, že ID patří do třídy pro tyto 2 nové ID. 18 00:01:14,260 --> 00:01:19,600 Není nic spojující všechny tyto identifikátory dohromady, a tak tam není žádný způsob, jak se ptát 19 00:01:19,600 --> 00:01:22,040 program, aby to pro ID 0 až 6. 20 00:01:22,040 --> 00:01:26,120 No teď si uvědomíte, že máte 100 studentů ID. 21 00:01:26,120 --> 00:01:30,770 Začíná to vypadat méně než ideální muset samostatně prohlásit každý z těchto ID, 22 00:01:30,770 --> 00:01:33,760 a kopírovat a vkládat žádnou logiku pro tyto nové ID. 23 00:01:33,760 --> 00:01:38,380 Ale možná jsme odhodláni, a děláme to pro všechny 100 studentů. 24 00:01:38,380 --> 00:01:42,240 Ale co když nevíte, kolik studentů je ve skutečnosti jsou? 25 00:01:42,240 --> 00:01:47,320 Tam jsou jen některé n studenti a váš program musí požádat uživatele, co to n je. 26 00:01:47,320 --> 00:01:50,250 Uh oh. To nebude fungovat velmi dobře. 27 00:01:50,250 --> 00:01:53,820 Váš program funguje pouze pro nějakou konstantu počtu studentů. 28 00:01:53,820 --> 00:01:57,520 >> Řešení všech těchto problémů je krása polí. 29 00:01:57,520 --> 00:01:59,930 Takže to, co je pole? 30 00:01:59,930 --> 00:02:04,480 V některých programovacích jazycích pole typ by mohl být schopni udělat trochu víc, 31 00:02:04,480 --> 00:02:09,960 ale tady budeme soustředit na základní strukturu pole dat, stejně jako uvidíte to v C. 32 00:02:09,960 --> 00:02:14,030 Pole je jen velký blok paměti. To je všechno. 33 00:02:14,030 --> 00:02:17,770 Když říkáme, že mají řadu 10 celých čísel, že právě znamená, že máme nějaký blok 34 00:02:17,770 --> 00:02:20,740 paměti, která je dostatečně velká pro uložení 10 samostatných celá čísla. 35 00:02:29,930 --> 00:02:33,410 Za předpokladu, že celé číslo je 4 bajty, to znamená, že řada 10 celých čísel 36 00:02:33,410 --> 00:02:37,180 je kontinuální blok 40 bajtů v paměti. 37 00:02:42,660 --> 00:02:46,280 Dokonce i při použití vícerozměrných polí, které nebudeme jít do tady, 38 00:02:46,280 --> 00:02:49,200 je to stále jen velký blok paměti. 39 00:02:49,200 --> 00:02:51,840 Multidimenzionální zápis je jen pohodlí. 40 00:02:51,840 --> 00:02:55,640 Pokud máte 3 od 3 multidimenzionální pole celých čísel, 41 00:02:55,640 --> 00:03:00,650 pak se váš program bude opravdu jen zacházet s tímto jako velký blok 36 bajtů. 42 00:03:00,650 --> 00:03:05,460 Celkový počet celých čísel je 3 krát 3, a každý z nich celé číslo zabírá 4 bajty. 43 00:03:05,460 --> 00:03:07,750 >> Pojďme se podívat na základní příklad. 44 00:03:07,750 --> 00:03:10,660 Vidíme zde 2 různé způsoby, jak deklarují polí. 45 00:03:15,660 --> 00:03:18,580 Budeme muset komentář 1 z nich se pro program sestavit 46 00:03:18,580 --> 00:03:20,900 protože jsme prohlásit x dvakrát. 47 00:03:20,900 --> 00:03:25,140 My se podíváme na některé z rozdílů mezi těmito 2 typy prohlášení v trochu. 48 00:03:25,140 --> 00:03:28,560 Oba těchto linek deklarovat pole velikosti N, 49 00:03:28,560 --> 00:03:30,740 kde jsme # define N jako 10. 50 00:03:30,740 --> 00:03:34,460 Mohli bychom stejně snadno požádala uživatele o kladné číslo 51 00:03:34,460 --> 00:03:37,250 a používá, že celé číslo jako řady prvků v našem poli. 52 00:03:37,250 --> 00:03:41,960 Stejně jako náš studentský průkaz příklad dříve, tohle je jako deklarování 10 zcela samostatnou 53 00:03:41,960 --> 00:03:49,000 imaginární proměnné; x0, x1, x2, a tak dále až do XN-1. 54 00:03:57,270 --> 00:04:00,840 Ignorování řádky, kde deklarujeme pole, zjistíte, že hranaté závorky neporušené 55 00:04:00,840 --> 00:04:02,090 uvnitř pro smyčky. 56 00:04:02,090 --> 00:04:09,660 Když jsme napsat něco jako x [3], který jsem si jen číst jako x držáku 3, 57 00:04:09,660 --> 00:04:13,090 můžete si na to, jako žádat o imaginární x3. 58 00:04:13,090 --> 00:04:17,519 Všimněte než s řadou velikosti N, to znamená, že se počet uvnitř držáků, 59 00:04:17,519 --> 00:04:22,630 které budeme nazývat index, může být cokoliv, od 0 do N-1, 60 00:04:22,630 --> 00:04:25,660 který je celkem indexů N. 61 00:04:25,660 --> 00:04:28,260 >> Chcete-li si o tom, jak to skutečně funguje 62 00:04:28,260 --> 00:04:31,260 na paměti, že pole je velký blok paměti. 63 00:04:31,260 --> 00:04:37,460 Za předpokladu, že číslo je 4 bajty, celé pole x je 40 byte bloku paměti. 64 00:04:37,460 --> 00:04:41,360 Takže x0 odkazuje na prvních 4 bytů bloku. 65 00:04:45,810 --> 00:04:49,230 X [1] odkazuje na další 4 bajty a tak dále. 66 00:04:49,230 --> 00:04:53,760 To znamená, že začátek x je všechno program někdy potřebuje sledovat. 67 00:04:55,660 --> 00:04:59,840 Pokud chcete použít x [400], pak program ví, že je to stejné 68 00:04:59,840 --> 00:05:03,460 k jen 1600 bajtů od začátku x. 69 00:05:03,460 --> 00:05:08,780 Kde získáme 1600 bytů z? Je to jen 400 krát 4 bytů na integer. 70 00:05:08,780 --> 00:05:13,170 >> Před tím, než, že je velmi důležité si uvědomit, že v C 71 00:05:13,170 --> 00:05:17,080 není výkon indexu že používáme v poli. 72 00:05:17,080 --> 00:05:23,180 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] 73 00:05:23,180 --> 00:05:26,060 nebo dokonce x [-5]. 74 00:05:26,060 --> 00:05:28,240 Index ani nemusí být číslo. 75 00:05:28,240 --> 00:05:30,630 To může být jakákoli libovolná výraz. 76 00:05:30,630 --> 00:05:34,800 V programu používáme proměnnou i od smyčky for a indexu do pole. 77 00:05:34,800 --> 00:05:40,340 To je velmi časté vzor, ​​opakování od i = 0 k délce pole, 78 00:05:40,340 --> 00:05:43,350 a pak se za použití i jako index pro pole. 79 00:05:43,350 --> 00:05:46,160 Tímto způsobem se účinně smyčky přes celé pole, 80 00:05:46,160 --> 00:05:50,600 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. 81 00:05:50,600 --> 00:05:53,920 >> V první pro smyčce, i začíná na hodnotě 0, 82 00:05:53,920 --> 00:05:58,680 a tak to bude přiřadit 0 místě v poli, hodnota 0 krát 2. 83 00:05:58,680 --> 00:06:04,370 Pak jsem přírůstky, a přiřadíme první místo v poli hodnota 1 krát 2. 84 00:06:04,370 --> 00:06:10,170 Pak jsem přírůstky znovu a tak dále, až bychom přiřadit do polohy N-1 v poli 85 00:06:10,170 --> 00:06:13,370 hodnota N-1 krát 2. 86 00:06:13,370 --> 00:06:17,810 Takže jsme vytvořili pole s prvními 10 sudých čísel. 87 00:06:17,810 --> 00:06:21,970 Možná vyrovnává by bylo trochu lepší jméno pro proměnnou než x, 88 00:06:21,970 --> 00:06:24,760 ale že by dali věci pryč. 89 00:06:24,760 --> 00:06:30,210 Druhý cyklus for poté vytiskne pouze hodnoty, které jsme již uložené uvnitř pole. 90 00:06:30,210 --> 00:06:33,600 >> Zkusme spuštění programu s oběma typy polí prohlášení 91 00:06:33,600 --> 00:06:36,330 a podívejte se na výstupu programu. 92 00:06:51,450 --> 00:06:57,020 Co se týče můžeme vidět, program se chová stejně pro oba typy prohlášení. 93 00:06:57,020 --> 00:07:02,230 Pojďme se také podívat na to, co se stane, když změníme první smyčku nezastaví na N 94 00:07:02,230 --> 00:07:05,040 ale říkají 10000. 95 00:07:05,040 --> 00:07:07,430 Cesta za koncem pole. 96 00:07:14,700 --> 00:07:17,210 Chybička se vloudila. Možná jste viděli předtím. 97 00:07:17,210 --> 00:07:20,440 Segmentation fault znamená, že máte program havaroval. 98 00:07:20,440 --> 00:07:24,430 Začnete vidět tyto, když se dotknete oblasti paměti, kterou by neměl být dotýkají. 99 00:07:24,430 --> 00:07:27,870 Zde jsme se dotýkají 10.000 míst mimo začátku x, 100 00:07:27,870 --> 00:07:31,920 které evidentně je místo v paměti bychom neměli dotýkat. 101 00:07:31,920 --> 00:07:37,690 Takže většina z nás by asi nebylo náhodou dal 10.000 místo N, 102 00:07:37,690 --> 00:07:42,930 ale co když to uděláme něco jemnější jako říct, psát méně než nebo se rovnat k n 103 00:07:42,930 --> 00:07:46,830 v pro smyčce stavu, na rozdíl od méně než N. 104 00:07:46,830 --> 00:07:50,100 Pamatujte si, že pole má pouze indexy od 0 do N-1, 105 00:07:50,100 --> 00:07:54,510 , což znamená, že index n je za koncem pole. 106 00:07:54,510 --> 00:07:58,050 Program nemusí selhání v tomto případě, ale je to stále chyba. 107 00:07:58,050 --> 00:08:01,950 Ve skutečnosti, tato chyba je tak běžné, že to má svůj vlastní název, 108 00:08:01,950 --> 00:08:03,970 off o 1 chybě. 109 00:08:03,970 --> 00:08:05,970 >> To je to pro základy. 110 00:08:05,970 --> 00:08:09,960 Takže jaké jsou hlavní rozdíly mezi 2 typy polí prohlášení? 111 00:08:09,960 --> 00:08:13,960 Jeden rozdíl je místo, kde velký blok paměti jde. 112 00:08:13,960 --> 00:08:17,660 V prvním prohlášení, které budu volat držák-typ pole, 113 00:08:17,660 --> 00:08:20,300 i když je to v žádném případě konvenční název, 114 00:08:20,300 --> 00:08:22,480 že půjde na stack. 115 00:08:22,480 --> 00:08:27,450 Zatímco v druhém, který budu volat ručičkový typ pole, bude to jít na haldě. 116 00:08:27,450 --> 00:08:32,480 To znamená, že když se funkce vrátí, držák pole automaticky navrácen, 117 00:08:32,480 --> 00:08:36,419 vzhledem k tomu, musíte explicitily volat zdarma na ukazatel pole 118 00:08:36,419 --> 00:08:38,010 jinak máte nevracení paměti. 119 00:08:38,010 --> 00:08:42,750 Navíc, držák pole není ve skutečnosti proměnná. 120 00:08:42,750 --> 00:08:45,490 To je důležité. Je to jen symbol. 121 00:08:45,490 --> 00:08:49,160 Můžete si ji představit jako konstantu, že kompilátor vybere pro vás. 122 00:08:49,160 --> 00:08:52,970 To znamená, že nemůžeme udělat něco jako x + + s držákem typu, 123 00:08:52,970 --> 00:08:56,240 i když je to naprosto platí při typ ukazatele. 124 00:08:56,240 --> 00:08:58,270 >> Ukazatel typu je proměnná. 125 00:08:58,270 --> 00:09:01,510 Pro typ ukazatele, máme 2 oddělené bloky paměti. 126 00:09:01,510 --> 00:09:06,060 Proměnná x sám je uložen v zásobníku a je jen jeden ukazatel, 127 00:09:06,060 --> 00:09:08,620 ale velký blok paměti je uložena na haldě. 128 00:09:08,620 --> 00:09:11,010 Proměnná x na zásobníku jen uloží adresu 129 00:09:11,010 --> 00:09:14,010 velkého bloku paměti na haldě. 130 00:09:14,010 --> 00:09:17,370 Jedním z důsledků tohoto je s velikostí provozovatele. 131 00:09:17,370 --> 00:09:22,480 Zeptáte-li se pro velikost držáku pole, bude vám velikost velkého bloku paměti, 132 00:09:22,480 --> 00:09:24,620 něco jako 40 bajtů, 133 00:09:24,620 --> 00:09:26,920 ale pokud se zeptáte na velikosti ukazatele typu pole, 134 00:09:26,920 --> 00:09:32,740 to vám dá velikost proměnné x sám, který na spotřebič je pravděpodobně jen 4 bajty. 135 00:09:32,740 --> 00:09:36,530 Pomocí ručičkový typu pole, to je nemožné přímo požádat o 136 00:09:36,530 --> 00:09:38,530 velikost velkého bloku paměti. 137 00:09:38,530 --> 00:09:42,530 To obvykle není moc omezení, protože jsme velmi zřídka chceme velikost 138 00:09:42,530 --> 00:09:46,980 z velkých blok paměti, a my můžeme obvykle spočítat, pokud ji potřebujeme. 139 00:09:46,980 --> 00:09:51,490 >> Konečně, držák pole se stane, aby nám poskytli zástupce pro inicializaci pole. 140 00:09:51,490 --> 00:09:56,130 Pojďme se podívat, jak by to mohlo psát první 10 dokonce celých čísel pomocí zástupce initilization. 141 00:10:11,220 --> 00:10:14,470 S ukazatelem pole, není způsob, jak to udělat zástupce takového. 142 00:10:14,470 --> 00:10:18,120 To je jen úvodem do toho, co můžete dělat s poli. 143 00:10:18,120 --> 00:10:20,990 Se objeví v téměř každém programu píšete. 144 00:10:20,990 --> 00:10:24,390 Doufejme, že nyní můžete vidět lepší způsob, jak dělat studentský ids příklad 145 00:10:24,390 --> 00:10:26,710 od začátku videa. 146 00:10:26,710 --> 00:10:29,960 >> Mé jméno je Rob Bowden, a to je CS50.