1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Beszéljünk tömbök. 2 00:00:09,360 --> 00:00:12,780 Akkor miért lenne valaha használni kívánt tömböket? 3 00:00:12,780 --> 00:00:17,210 Nos, tegyük fel, hogy van egy program, hogy kell tárolni 5 hallgatói azonosítók. 4 00:00:17,210 --> 00:00:21,270 Úgy tűnhet ésszerűnek, hogy 5 különböző változók. 5 00:00:21,270 --> 00:00:24,240 Okokból meglátjuk egy kicsit, akkor kezdeni számítva 0. 6 00:00:24,240 --> 00:00:30,700 A változók mi lesz majd int ID0, int ID1, és így tovább. 7 00:00:30,700 --> 00:00:34,870 Minden logika akarunk végezni a diákigazolvány kell majd a vágólapra másolni 8 00:00:34,870 --> 00:00:36,870 Minden ilyen diák azonosítók. 9 00:00:36,870 --> 00:00:39,710 Ha azt akarjuk, hogy ellenőrizzék, mely a diákok történetesen CS50, 10 00:00:39,710 --> 00:00:43,910 akkor először meg kell, hogy ellenőrizze, ID0 képviseli a hallgató a tanfolyamot. 11 00:00:43,910 --> 00:00:48,070 Aztán ugyanezt a következő diák, akkor kell, hogy másolja be a kódot ID0 12 00:00:48,070 --> 00:00:54,430 és cserélje minden előfordulását ID0 a id1 és így tovább id2, 3, és 4. 13 00:00:54,430 --> 00:00:57,560 >> Amint hallja, hogy meg kell másolni és beilleszteni, 14 00:00:57,560 --> 00:01:00,440 meg kell kezdeni gondolkodni, hogy van jobb megoldás. 15 00:01:00,440 --> 00:01:05,360 Most mi van, ha rájössz, hogy nem kell 5 hallgatói azonosítók, hanem 7-et? 16 00:01:05,360 --> 00:01:09,570 Be kell, hogy menjen vissza a forráskódot, és adjunk hozzá egy ID5, egy ID6, 17 00:01:09,570 --> 00:01:14,260 és másolja a logikai ellenőrzésére, ha az azonosítók tartoznak az osztály ezeket a 2 új azonosítók. 18 00:01:14,260 --> 00:01:19,600 Nincs semmi összekötő mindezen azonosítók együtt, és így nincs mód megkérdezni 19 00:01:19,600 --> 00:01:22,040 A program ezt az azonosítót 0 és 6. 20 00:01:22,040 --> 00:01:26,120 Hát most már észre, hogy 100 diák azonosítók. 21 00:01:26,120 --> 00:01:30,770 Kezd úgy tűnik, kevesebb, mint ideális szüksége, hogy külön-külön állapítsa mindegyik azonosítók, 22 00:01:30,770 --> 00:01:33,760 és másolja minden logikát az új azonosítók. 23 00:01:33,760 --> 00:01:38,380 De talán mi határozza meg, és tedd meg mind a 100 versenyző. 24 00:01:38,380 --> 00:01:42,240 De mi van, ha nem tudja, hogy hány diák van valójában? 25 00:01:42,240 --> 00:01:47,320 Már csak néhány n a diákok és a program, hogy kérje a felhasználót, hogy mi n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Ez nem fog működni jól. 27 00:01:50,250 --> 00:01:53,820 A program csak akkor működik, néhány állandó számú versenyző. 28 00:01:53,820 --> 00:01:57,520 >> Megoldása mindezen problémák a szépsége tömbök. 29 00:01:57,520 --> 00:01:59,930 Tehát mi egy tömb? 30 00:01:59,930 --> 00:02:04,480 Néhány programozási nyelv egy tömb típusú lehet, hogy csinál egy kicsit, 31 00:02:04,480 --> 00:02:09,960 de itt fogunk összpontosítani az alapvető tömb adatszerkezet ahogy látni fogod, hogy a C 32 00:02:09,960 --> 00:02:14,030 Egy tömb csak egy nagy blokk memória. Ennyi. 33 00:02:14,030 --> 00:02:17,770 Amikor azt mondjuk, van egy sor 10-egészek, hogy csak azt jelenti, hogy néhány mondatban 34 00:02:17,770 --> 00:02:20,740 memóriával rendelkezik, amely elég nagy ahhoz, hogy tartsa 10 különálló egészek. 35 00:02:29,930 --> 00:02:33,410 Feltételezve, hogy egy egész szám 4 bájt, ez azt jelenti, hogy egy sor 10 egész számok 36 00:02:33,410 --> 00:02:37,180 folyamatos blokk 40 bájt a memóriában. 37 00:02:42,660 --> 00:02:46,280 Még ha használja többdimenziós tömbök, amelyek nem megyünk be, hogy itt, 38 00:02:46,280 --> 00:02:49,200 ez még mindig csak egy nagy blokk memória. 39 00:02:49,200 --> 00:02:51,840 A többdimenziós jelölés csak a kényelem. 40 00:02:51,840 --> 00:02:55,640 Ha van egy 3 * 3 többdimenziós tömb egész számok, 41 00:02:55,640 --> 00:03:00,650 akkor a program tényleg csak kezeli ezt, mint egy nagy blokk 36 bájt. 42 00:03:00,650 --> 00:03:05,460 Teljes száma egész 3-szor 3, és mindegyik egész szám vesz fel 4 bájt. 43 00:03:05,460 --> 00:03:07,750 >> Vessünk egy pillantást az alap példát. 44 00:03:07,750 --> 00:03:10,660 Láthatjuk itt 2 különböző módon nyilvánítja tömbök. 45 00:03:15,660 --> 00:03:18,580 Mi lesz a hozzászóláshoz 1-őket a program összeállítása 46 00:03:18,580 --> 00:03:20,900 hiszen állapítsa x kétszer. 47 00:03:20,900 --> 00:03:25,140 Akkor vessen egy pillantást néhány a különbség e 2 típusú nyilatkozatok egy kicsit. 48 00:03:25,140 --> 00:03:28,560 Mindkét vonal állapítsa tömb mérete N, 49 00:03:28,560 --> 00:03:30,740 ahol már # define N 10. 50 00:03:30,740 --> 00:03:34,460 Mi is ugyanúgy kérte a felhasználó pozitív egész 51 00:03:34,460 --> 00:03:37,250 és használt, hogy egész, mint egy számos elemet a tömbben. 52 00:03:37,250 --> 00:03:41,960 Mint a diákigazolvány például azelőtt, ez olyan, mint nyilvánító 10 teljesen különálló 53 00:03:41,960 --> 00:03:49,000 képzeletbeli változók, x0, x1, x2, és így tovább, egészen xn-1. 54 00:03:57,270 --> 00:04:00,840 Figyelmen kívül hagyva a vonalakon, ahol kijelentjük a tömb, észre a szögletes zárójelek ép 55 00:04:00,840 --> 00:04:02,090 belül a hurkok. 56 00:04:02,090 --> 00:04:09,660 Amikor írunk valami ilyesmit x [3], amelyet én csak olvasni x konzol 3, 57 00:04:09,660 --> 00:04:13,090 lehet gondolni rá, mint kérni a képzeletbeli x3. 58 00:04:13,090 --> 00:04:17,519 Észrevesz mint egy sor N méret, ez azt jelenti, hogy a belsejében a számát zárójelben, 59 00:04:17,519 --> 00:04:22,630 amely fogjuk hívni index, bármi lehet 0 és N-1, 60 00:04:22,630 --> 00:04:25,660 amely összes N indexeket. 61 00:04:25,660 --> 00:04:28,260 >> Gondolni, hogy ez tényleg működik 62 00:04:28,260 --> 00:04:31,260 ne feledjük, hogy a tömb nagy blokk memória. 63 00:04:31,260 --> 00:04:37,460 Feltételezve, hogy egy egész szám 4 bájt, a teljes tömb x egy 40 bájtos blokk memória. 64 00:04:37,460 --> 00:04:41,360 Tehát x0 utal az első 4 byte a blokk. 65 00:04:45,810 --> 00:04:49,230 X [1] utal a következő 4 byte és így tovább. 66 00:04:49,230 --> 00:04:53,760 Ez azt jelenti, hogy kezdetét x minden a program mindig kell nyomon követni. 67 00:04:55,660 --> 00:04:59,840 Ha szeretné használni x [400], akkor a program tudja, hogy ez egyenértékű azzal, 68 00:04:59,840 --> 00:05:03,460 , hogy csak 1600 byte kezdete után az x. 69 00:05:03,460 --> 00:05:08,780 Honnan jutunk 1600 bájt? Ez csak 400-szor 4 byte per egész. 70 00:05:08,780 --> 00:05:13,170 >> Mielőtt mozog, nagyon fontos felismerni, hogy a C 71 00:05:13,170 --> 00:05:17,080 nincs érvényesítése az index, hogy használjuk a tömbben. 72 00:05:17,080 --> 00:05:23,180 A nagy blokk csak 10 egész hosszú, de semmi nem fog kiabálni minket, ha írunk x [20] 73 00:05:23,180 --> 00:05:26,060 vagy akár x [-5]. 74 00:05:26,060 --> 00:05:28,240 Az index még csak nem is kell egy számot. 75 00:05:28,240 --> 00:05:30,630 Ez lehet tetszőleges kifejezés. 76 00:05:30,630 --> 00:05:34,800 A programban használjuk az i változó a for ciklus index a tömb. 77 00:05:34,800 --> 00:05:40,340 Ez egy nagyon gyakori minta, a ciklusok az i = 0 és a hossza a tömb, 78 00:05:40,340 --> 00:05:43,350 , majd használja i az indexet a tömb. 79 00:05:43,350 --> 00:05:46,160 Ily módon hatékonyan hurok az egész tömb, 80 00:05:46,160 --> 00:05:50,600 és akkor sem rendelhet minden egyes helyszínen a tömbben, vagy használja azt a bizonyos számítás. 81 00:05:50,600 --> 00:05:53,920 >> Az első a hurok i 0-tól indul, 82 00:05:53,920 --> 00:05:58,680 , és így fog rendelni a 0 helyszínen a tömbben, az érték 0 alkalommal 2. 83 00:05:58,680 --> 00:06:04,370 Aztán i lépésekben, és hozzárendelni az első helyszínen, a tömb értéke 1-szer 2. 84 00:06:04,370 --> 00:06:10,170 Majd i lépésekben újra és így tovább, egészen addig, amíg meg rendelni helyzetbe N-1-ben a tömbben 85 00:06:10,170 --> 00:06:13,370 az érték N-1-szer 2. 86 00:06:13,370 --> 00:06:17,810 Ezért hoztunk létre egy tömböt az első 10 páros számok. 87 00:06:17,810 --> 00:06:21,970 Lehet, hogy kiegyenlíti lett volna egy kicsit jobban nevet a változó x-nél, 88 00:06:21,970 --> 00:06:24,760 de adott volna a dolgokat el. 89 00:06:24,760 --> 00:06:30,210 A második for ciklus akkor csak kiírja az értékeket, hogy már tárolt a tömb. 90 00:06:30,210 --> 00:06:33,600 >> Próbáljuk fut a program mindkét típusú tömb nyilatkozatok 91 00:06:33,600 --> 00:06:36,330 és vess egy pillantást a program kimenete. 92 00:06:51,450 --> 00:06:57,020 Amennyire látjuk, a program úgy viselkedik ugyanúgy mindkét típusú nyilatkozatok. 93 00:06:57,020 --> 00:07:02,230 Nézzük is, nézd meg mi történik, ha megváltoztatjuk az első ciklus, hogy nem hagyja abba az N 94 00:07:02,230 --> 00:07:05,040 hanem mondjuk 10.000. 95 00:07:05,040 --> 00:07:07,430 Way vége után a tömb. 96 00:07:14,700 --> 00:07:17,210 Hoppá. Talán láttad ezt korábban. 97 00:07:17,210 --> 00:07:20,440 A szegmentációs hiba azt jelenti, a program összeomlott. 98 00:07:20,440 --> 00:07:24,430 Te újra látni ezeket, amikor megérinti területeken memória nem érnek össze. 99 00:07:24,430 --> 00:07:27,870 Itt vagyunk megható 10.000 helyeken túl kezdete x, 100 00:07:27,870 --> 00:07:31,920 amely nyilvánvalóan egy hely a memóriában nem kellene megható. 101 00:07:31,920 --> 00:07:37,690 Így a legtöbben valószínűleg nem véletlenül hozott 10.000 helyett N, 102 00:07:37,690 --> 00:07:42,930 de mi van, ha nem teszünk valamit sokkal finomabb, mint mondjuk write kisebb vagy egyenlő az N 103 00:07:42,930 --> 00:07:46,830 A for ciklus feltétel, szemben a kevesebb, mint N. 104 00:07:46,830 --> 00:07:50,100 Vegye figyelembe, hogy a tömb csak indexek-tól 0-N-1, 105 00:07:50,100 --> 00:07:54,510 ami azt jelenti, hogy az n index túl van a végén a tömb. 106 00:07:54,510 --> 00:07:58,050 A program lehet, hogy nem összeomolhat ebben az esetben, de ez még mindig a hiba. 107 00:07:58,050 --> 00:08:01,950 Tény, hogy ez a hiba annyira gyakori, hogy megvan a saját nevét, 108 00:08:01,950 --> 00:08:03,970 Egy 1-jéig ki hibát. 109 00:08:03,970 --> 00:08:05,970 >> Ennyi az alapokat. 110 00:08:05,970 --> 00:08:09,960 Szóval, mi a fő különbség a 2 típusú tömb nyilatkozatok? 111 00:08:09,960 --> 00:08:13,960 Az egyik különbség az, ahol a nagy memóriablokkot megy. 112 00:08:13,960 --> 00:08:17,660 Az első nyilatkozat, amelyet hívom a konzol-tömb típusú, 113 00:08:17,660 --> 00:08:20,300 bár ez egyáltalán nem egy hagyományos név, 114 00:08:20,300 --> 00:08:22,480 akkor megy a verem. 115 00:08:22,480 --> 00:08:27,450 Míg a második, amit hívom a pointer-tömb típusú, akkor megy a kupac. 116 00:08:27,450 --> 00:08:32,480 Ez azt jelenti, hogy a függvény a tömb konzol automatikusan felszabadul 117 00:08:32,480 --> 00:08:36,419 mivel ahogy kell explicitily hívja ingyenes a mutató tömb 118 00:08:36,419 --> 00:08:38,010 vagy pedig van egy memóriavesztés. 119 00:08:38,010 --> 00:08:42,750 Továbbá, a konzol tömb valójában nem egy változó. 120 00:08:42,750 --> 00:08:45,490 Ez fontos. Ez csak egy szimbólum. 121 00:08:45,490 --> 00:08:49,160 Azt hiszem, hogy ez egy állandó, hogy a fordító választja ki az Ön számára. 122 00:08:49,160 --> 00:08:52,970 Ez azt jelenti, hogy nem tud ilyet x + + a konzol típusát, 123 00:08:52,970 --> 00:08:56,240 bár ez tökéletesen érvényes a mutató típus. 124 00:08:56,240 --> 00:08:58,270 >> A mutató típus egy változó. 125 00:08:58,270 --> 00:09:01,510 A mutató típusú, van 2 külön blokk memória. 126 00:09:01,510 --> 00:09:06,060 A változó x maga tárolja a verem, és csak egy mutató, 127 00:09:06,060 --> 00:09:08,620 de a nagy blokk memória tárolja a kupac. 128 00:09:08,620 --> 00:09:11,010 A változó x a veremben csak tárolja a címet 129 00:09:11,010 --> 00:09:14,010 a nagy blokk memóriát a kupac. 130 00:09:14,010 --> 00:09:17,370 Egyik következménye, ez a méret az üzemeltető. 131 00:09:17,370 --> 00:09:22,480 Ha megkérdezzük a méret a konzol tömb, akkor megadja a méret a nagy blokk memória, 132 00:09:22,480 --> 00:09:24,620 olyasmi, mint 40 bájt, 133 00:09:24,620 --> 00:09:26,920 de ha kéri a méret a mutató típusa tömb, 134 00:09:26,920 --> 00:09:32,740 hogy megadja a méret a változó x is, amely a készülék valószínűleg csak 4 bájt. 135 00:09:32,740 --> 00:09:36,530 A pointer-tömb típusú, lehetetlen, hogy közvetlenül kérni 136 00:09:36,530 --> 00:09:38,530 a méret a nagy blokk memória. 137 00:09:38,530 --> 00:09:42,530 Ez általában nem sok a korlátozás hiszen nagyon ritkán akarjuk, hogy a méret 138 00:09:42,530 --> 00:09:46,980 a nagy blokk memória, és mi általában számítani, ha szükségünk van rá. 139 00:09:46,980 --> 00:09:51,490 >> Végül, a konzol tömb történik adjon nekünk egy parancsikont inicializálására egy tömb. 140 00:09:51,490 --> 00:09:56,130 Lássuk, hogyan lehetne írni az első 10 még egész parancsikonnal initilization. 141 00:10:11,220 --> 00:10:14,470 A mutató tömb, nincs módja annak, hogy egy parancsikont, mint ez. 142 00:10:14,470 --> 00:10:18,120 Ez csak egy bevezetés, hogy mit lehet csinálni tömbök. 143 00:10:18,120 --> 00:10:20,990 Ezek jelennek meg szinte minden program írsz. 144 00:10:20,990 --> 00:10:24,390 Remélhetőleg most már láthatod egy jobb módja az a hallgató azonosítók példa 145 00:10:24,390 --> 00:10:26,710 elejétől a videó. 146 00:10:26,710 --> 00:10:29,960 >> A nevem Rob Bowden, és ez CS50.