1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Räägime massiivid. 2 00:00:09,360 --> 00:00:12,780 Miks me üldse tahame kasutada massiive? 3 00:00:12,780 --> 00:00:17,210 Noh oletame, et sul on olemas programm, mis vajab salvestada 5 üliõpilane IDd. 4 00:00:17,210 --> 00:00:21,270 See võib tunduda mõistlik on 5 eraldi muutujad. 5 00:00:21,270 --> 00:00:24,240 Põhjustel me näeme natuke, hakkame lugedes 0. 6 00:00:24,240 --> 00:00:30,700 Muutujad on meil saab olema int id0, int id1, ja nii edasi. 7 00:00:30,700 --> 00:00:34,870 Iga loogika tahame läbi viia õpilase ID tuleb kopeerida ja kleepida 8 00:00:34,870 --> 00:00:36,870 iga nimetatud üliõpilane IDd. 9 00:00:36,870 --> 00:00:39,710 Kui me tahame, et kontrollida, kus õpilased juhtub olema CS50, 10 00:00:39,710 --> 00:00:43,910 me kõigepealt pead kontrollima, kas id0 esindab õpilane käigus. 11 00:00:43,910 --> 00:00:48,070 Siis teha sama järgmise üliõpilane, vajame kopeeri ja kleebi kood id0 12 00:00:48,070 --> 00:00:54,430 ja asendada kõik esinemistest id0 koos id1 ja nii edasi ID2, 3 ja 4. 13 00:00:54,430 --> 00:00:57,560 >> Niipea kui sa kuuled, et me peame kopeeri ja kleebi, 14 00:00:57,560 --> 00:01:00,440 siis peaks hakkama mõtlema, et on olemas ka parem lahendus. 15 00:01:00,440 --> 00:01:05,360 Mis nüüd, kui sa mõistad, sa ei pea 5 õpilane sümbolid vaid 7? 16 00:01:05,360 --> 00:01:09,570 Sa pead minema tagasi oma lähtekoodi ja lisada ID5, id6, 17 00:01:09,570 --> 00:01:14,260 ja kopeeri ja kleebi loogika kontrollimiseks, kui ID-d kuuluvad klassi jaoks need 2 uut ID-d. 18 00:01:14,260 --> 00:01:19,600 Ei ole midagi ühendab kõik need sümbolid koos, ja nii ei ole võimalik taotleda 19 00:01:19,600 --> 00:01:22,040 programm seda teha ID-d 0 kuni 6. 20 00:01:22,040 --> 00:01:26,120 Noh nüüd sa mõistad, sul on 100 õpilase ID-d. 21 00:01:26,120 --> 00:01:30,770 See hakkab tunduda vähem kui ideaalne vaja eraldi deklareerida kõik need sümbolid, 22 00:01:30,770 --> 00:01:33,760 ja kopeeri ja kleebi mingit loogikat, et neid uusi isikutunnistusi. 23 00:01:33,760 --> 00:01:38,380 Aga võibolla oleme otsustanud, ja me teeme seda kõik 100 õpilast. 24 00:01:38,380 --> 00:01:42,240 Aga kui sa ei tea, kui palju õpilasi seal tegelikult on? 25 00:01:42,240 --> 00:01:47,320 Seal on vaid mõned n õpilased ja teie programm on paluda kasutajal, mida see n. 26 00:01:47,320 --> 00:01:50,250 Uh oh. See ei kavatse tööd väga hästi. 27 00:01:50,250 --> 00:01:53,820 Teie programm töötab ainult teatud konstandi õpilaste arv. 28 00:01:53,820 --> 00:01:57,520 >> Lahendada kõik need probleemid on ilu massiivid. 29 00:01:57,520 --> 00:01:59,930 Mis on massiivi? 30 00:01:59,930 --> 00:02:04,480 Mõnel programmeerimiskeeled massiivi tüüp võiksid teha natuke rohkem, 31 00:02:04,480 --> 00:02:09,960 kuid siin me keskenduma põhiliste massiivi andmestruktuuri nagu näete seda C. 32 00:02:09,960 --> 00:02:14,030 Massiiv on lihtsalt suur blokk mälu. Nii see on. 33 00:02:14,030 --> 00:02:17,770 Kui me ütleme, et meil on hulgaliselt 10. täisarvud, mis tähendab lihtsalt meil on mõned plokk 34 00:02:17,770 --> 00:02:20,740 mälu, mis on piisavalt suur, et hoidke 10 eraldi täisarvud. 35 00:02:29,930 --> 00:02:33,410 Eeldades, et täisarv on 4 baiti, see tähendab, et massiivi 10. täisarvud 36 00:02:33,410 --> 00:02:37,180 on pidev plokk 40 baiti mälu. 37 00:02:42,660 --> 00:02:46,280 Isegi kui te kasutate mitmemõõtmelise massiivi, mida me ei lähe, et siin, 38 00:02:46,280 --> 00:02:49,200 see on ikka lihtsalt suur blokk mälu. 39 00:02:49,200 --> 00:02:51,840 Mitmemõõtmeline märke on lihtsalt mugavam. 40 00:02:51,840 --> 00:02:55,640 Kui teil on 3 3 mitmemõõtmelise massiivi täisarvud, 41 00:02:55,640 --> 00:03:00,650 siis teie programm tõesti ainult käsitada seda suur plokk 36 baiti. 42 00:03:00,650 --> 00:03:05,460 Koguarv täisarvud on 3 korda 3, ja iga täisarv võtab kuni 4 baiti. 43 00:03:05,460 --> 00:03:07,750 >> Võtame pilk lihtne näide. 44 00:03:07,750 --> 00:03:10,660 Me näeme siin 2 erinevat viisi kuulutatakse massiivid. 45 00:03:15,660 --> 00:03:18,580 Me peame Kommentaar 1 neist välja programmi koostamiseks 46 00:03:18,580 --> 00:03:20,900 kuna me kuulutame kaks korda x. 47 00:03:20,900 --> 00:03:25,140 Võtame pilk mõned erinevused 2 tüüpi deklaratsioone natuke. 48 00:03:25,140 --> 00:03:28,560 Mõlemad read kuulutada massiivi suurus N, 49 00:03:28,560 --> 00:03:30,740 kus oleme # define N 10. 50 00:03:30,740 --> 00:03:34,460 Me võiks sama hästi palunud kasutaja jaoks positiivne täisarv 51 00:03:34,460 --> 00:03:37,250 ja kasutada, et täisarv on mitmeid elemente meie massiivi. 52 00:03:37,250 --> 00:03:41,960 Nagu meie õpilase ID Näiteks enne, see on selline nagu kuulutades 10. täiesti eraldi 53 00:03:41,960 --> 00:03:49,000 kujuteldav muutujad; x0, x1, x2, ja nii edasi kuni xN-1. 54 00:03:57,270 --> 00:04:00,840 Ignoreerimine liinidel, kus me kuulutame massiiv, märkate nurksulgudes puutumata 55 00:04:00,840 --> 00:04:02,090 sees jaoks silmuseid. 56 00:04:02,090 --> 00:04:09,660 Kui me kirjutame midagi x [3], mis ma just lugesin kui x sulg 3, 57 00:04:09,660 --> 00:04:13,090 sa ei mõtle seda nagu paludes kujuteldava x3. 58 00:04:13,090 --> 00:04:17,519 Teade kui massiivi suurus N, tähendab see, et number sees sulgudes, 59 00:04:17,519 --> 00:04:22,630 mis me kutsume indeks võib olla ükskõik vahemikus 0 kuni n-1, 60 00:04:22,630 --> 00:04:25,660 mis on kokku N indeksid. 61 00:04:25,660 --> 00:04:28,260 >> Mõelda, kuidas see tegelikult töötab 62 00:04:28,260 --> 00:04:31,260 meeles pidada, et massiiv on suur blokk mälu. 63 00:04:31,260 --> 00:04:37,460 Eeldades, et täisarv on 4 baiti, kogu massiivi x on 40 baidi ploki mälu. 64 00:04:37,460 --> 00:04:41,360 Nii x0 viitab kõige esimesele 4 baiti blokeerida. 65 00:04:45,810 --> 00:04:49,230 X [1] viitab järgmise 4 baiti ja nii edasi. 66 00:04:49,230 --> 00:04:53,760 See tähendab, et alguses x on kõigi programmi kunagi vaja jälgida. 67 00:04:55,660 --> 00:04:59,840 Kui soovite kasutada x [400], siis programm teab, et see on samaväärne 68 00:04:59,840 --> 00:05:03,460 lihtsalt 1600 baiti pärast algust x. 69 00:05:03,460 --> 00:05:08,780 Kust me saame 1600 baiti? See on vaid 400 korda 4 baiti. 70 00:05:08,780 --> 00:05:13,170 >> Enne, kui minna, see on väga oluline mõista, et C 71 00:05:13,170 --> 00:05:17,080 ei ole täitmise indeks, mida me kasutame massiivi. 72 00:05:17,080 --> 00:05:23,180 Meie suur blokk on ainult 10 täisarvud pikk, kuid miski ei karju meile, kui me kirjutame x [20] 73 00:05:23,180 --> 00:05:26,060 või isegi x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeks ei pea olema number. 75 00:05:28,240 --> 00:05:30,630 See võib olla meelevaldne väljend. 76 00:05:30,630 --> 00:05:34,800 Programmis me kasutame muutuja i Vanuses jaoks silmuse indeks array. 77 00:05:34,800 --> 00:05:40,340 See on väga levinud mudel, silmuspõletamise alates i = 0 kuni pikkusega massiiv, 78 00:05:40,340 --> 00:05:43,350 ja siis kasutades I indeks array. 79 00:05:43,350 --> 00:05:46,160 Sel viisil saate tõhusalt silmus üle kogu antennide massiivi, 80 00:05:46,160 --> 00:05:50,600 ja võite igale kohapeal massiiv või kasutada seda mõnel arvutamisel. 81 00:05:50,600 --> 00:05:53,920 >> Esimeses jaoks silmus, i algab 0, 82 00:05:53,920 --> 00:05:58,680 ja nii see loovutada 0 kohapeal massiiv, väärtus 0 korda 2. 83 00:05:58,680 --> 00:06:04,370 Siis ma sammuga ja me omistama esimese koha array väärtusest: 1 korda 2. 84 00:06:04,370 --> 00:06:10,170 Siis ma sammuga uuesti ja nii edasi, kuni me määrata asendisse N-1 massiiv 85 00:06:10,170 --> 00:06:13,370 väärtus n-1 korda 2. 86 00:06:13,370 --> 00:06:17,810 Nii et me oleme loonud massiivi esimese 10 paarisarvud. 87 00:06:17,810 --> 00:06:21,970 Ehk ühtlustab oleks olnud natuke parem nimi muutuja kui x, 88 00:06:21,970 --> 00:06:24,760 kuid mis oleks andnud asjad ära. 89 00:06:24,760 --> 00:06:30,210 Teine jaoks silmus siis lihtsalt trükib väärtused, mida oleme juba ladestunud massiivist. 90 00:06:30,210 --> 00:06:33,600 >> Proovime töötab programm mõlemat tüüpi massiivi deklaratsioonid 91 00:06:33,600 --> 00:06:36,330 ja kui heita pilk väljund programmi. 92 00:06:51,450 --> 00:06:57,020 Niipalju kui me näeme, et programm käitub samamoodi mõlemat liiki deklaratsioonid. 93 00:06:57,020 --> 00:07:02,230 Teeme ka võtta pilk, mis juhtub, kui me muudame esimese silmuse ei peatu N 94 00:07:02,230 --> 00:07:05,040 vaid näiteks 10000. 95 00:07:05,040 --> 00:07:07,430 Way kauem massiivi. 96 00:07:14,700 --> 00:07:17,210 Oih. Võib-olla olete näinud seda enne. 97 00:07:17,210 --> 00:07:20,440 Killustatust süü tähendab, et teie programm jooksis kokku. 98 00:07:20,440 --> 00:07:24,430 Hakkate nägema neid kui sa ühendust valdkondades mälu sa ei peaks liigutav. 99 00:07:24,430 --> 00:07:27,870 Siin on liigutav 10000 kohti kaugemale algust x, 100 00:07:27,870 --> 00:07:31,920 mis ilmselt on koht mällu me ei tohiks liigutav. 101 00:07:31,920 --> 00:07:37,690 Nii et enamik meist ilmselt ei kogemata panna 10,000 asemel N, 102 00:07:37,690 --> 00:07:42,930 aga mis siis, kui me midagi peenemalt nagu ütlevad kirjutada alla või võrdne n 103 00:07:42,930 --> 00:07:46,830 aastal jaoks silmus tingimus mitte vähem kui N. 104 00:07:46,830 --> 00:07:50,100 Pea meeles, et massiiv on ainult indekseid vahemikus 0 kuni n-1, 105 00:07:50,100 --> 00:07:54,510 mis tähendab, et indeks N on kauem massiivi. 106 00:07:54,510 --> 00:07:58,050 Programm ei pruugi krahhi sel juhul, kuid see on ikka viga. 107 00:07:58,050 --> 00:08:01,950 Tegelikult on see viga on nii üldine, et see on ta enda nime, 108 00:08:01,950 --> 00:08:03,970 maha 1 viga. 109 00:08:03,970 --> 00:08:05,970 >> Ongi põhitõed. 110 00:08:05,970 --> 00:08:09,960 Millised on peamised erinevused 2 tüüpi massiivi deklaratsiooni? 111 00:08:09,960 --> 00:08:13,960 Üks erinevus on see, kui suur ploki mälu läheb. 112 00:08:13,960 --> 00:08:17,660 Esimesel deklaratsiooni, mis ma helistan sulg-massiivi tüüp, 113 00:08:17,660 --> 00:08:20,300 kuigi see ei ole sugugi tavaline nimi, 114 00:08:20,300 --> 00:08:22,480 see läheb pinu. 115 00:08:22,480 --> 00:08:27,450 Arvestades teises, mis ma helistan pointer-massiivi tüüp, see läheb hunnik. 116 00:08:27,450 --> 00:08:32,480 See tähendab, et kui funktsioon tagastab, sulg massiiv automaatselt deallocated, 117 00:08:32,480 --> 00:08:36,419 arvestades, peate explicitily helistada tasuta pointer array 118 00:08:36,419 --> 00:08:38,010 või siis sul on mälu leke. 119 00:08:38,010 --> 00:08:42,750 Lisaks sulg massiivi ei ole tegelikult muutuja. 120 00:08:42,750 --> 00:08:45,490 See on oluline. See on lihtsalt sümbol. 121 00:08:45,490 --> 00:08:49,160 Sa ei mõtle seda pidevalt, et kompilaator valib sinu jaoks. 122 00:08:49,160 --> 00:08:52,970 See tähendab, et me ei saa midagi teha nagu x + + koos klambri tüüp, 123 00:08:52,970 --> 00:08:56,240 kuigi see on täiesti sobivaks osutiloendurid. 124 00:08:56,240 --> 00:08:58,270 >> Osutiloendurid on muutuv. 125 00:08:58,270 --> 00:09:01,510 Sest osutiloendurid, meil on 2 eraldi plokki mälu. 126 00:09:01,510 --> 00:09:06,060 Muutuja x ise on hoida virnas ja on vaid üks pointer, 127 00:09:06,060 --> 00:09:08,620 kuid suur blokk mälu on salvestatud hunnik. 128 00:09:08,620 --> 00:09:11,010 Muutuja x kohta virna lihtsalt salvestab aadress 129 00:09:11,010 --> 00:09:14,010 suur ploki mälu hunnik. 130 00:09:14,010 --> 00:09:17,370 Üks järeldus on, mida suurem ettevõtja. 131 00:09:17,370 --> 00:09:22,480 Kui te küsite suurus sulg massiiv, siis annan teile suur kui suur ploki mälu, 132 00:09:22,480 --> 00:09:24,620 umbes 40 baiti, 133 00:09:24,620 --> 00:09:26,920 aga kui te küsite suurus pointer tüüpi massiiv, 134 00:09:26,920 --> 00:09:32,740 see annab sulle suuruse muutuja x ise, mis seadmele on tõenäoliselt vaid 4 baiti. 135 00:09:32,740 --> 00:09:36,530 Kasutades osuti-massiivi tüüp, ei ole võimalik otse küsida 136 00:09:36,530 --> 00:09:38,530 suur kui suur ploki mälu. 137 00:09:38,530 --> 00:09:42,530 See ei ole tavaliselt palju piiranguid, sest me väga harva tahan suurus 138 00:09:42,530 --> 00:09:46,980 suur ploki mälu, ja me tavaliselt seda arvutada, kui me seda vajame. 139 00:09:46,980 --> 00:09:51,490 >> Lõpuks sulg massiivi juhtub meile otsetee initsialiseerimisel massiivi. 140 00:09:51,490 --> 00:09:56,130 Vaatame, kuidas me võiks kirjutada esimese 10 isegi täisarvud kasutades otsetee initilization. 141 00:10:11,220 --> 00:10:14,470 Mis pointer array, ei ole viis seda teha otsetee niimoodi. 142 00:10:14,470 --> 00:10:18,120 See on vaid sissejuhatus, mida saate teha koos massiivid. 143 00:10:18,120 --> 00:10:20,990 Nad näitavad üles peaaegu iga programm, mida kirjutad. 144 00:10:20,990 --> 00:10:24,390 Loodetavasti saate nüüd näha, parimaks viisiks õpilane ID näide 145 00:10:24,390 --> 00:10:26,710 aasta algusest video. 146 00:10:26,710 --> 00:10:29,960 >> Minu nimi on Rob Bowden, ja see on CS50.