1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Pakalbėkime apie masyvų. 2 00:00:09,360 --> 00:00:12,780 Taigi, kodėl gi mes kada nors norite naudoti masyvų? 3 00:00:12,780 --> 00:00:17,210 Na tegul sako, kad turite programą, kad reikia laikyti 5 studentų ID. 4 00:00:17,210 --> 00:00:21,270 Tai gali atrodyti protinga turėti 5 atskirus kintamuosius. 5 00:00:21,270 --> 00:00:24,240 Dėl priežasčių, mes matome šiek tiek, mes pradėsime skaičiuoti nuo 0. 6 00:00:24,240 --> 00:00:30,700 Kintamieji, mes turime bus int id0, int id1, ir taip toliau. 7 00:00:30,700 --> 00:00:34,870 Bet koks logika mes norime atlikti dėl studento ID reikės nukopijuoti ir įklijuoti 8 00:00:34,870 --> 00:00:36,870 kiekvienos iš šių studentų ID. 9 00:00:36,870 --> 00:00:39,710 Jei mes norime patikrinti, kuriuose studentai atsitiktų būti CS50, 10 00:00:39,710 --> 00:00:43,910 mes pirmiausia reikia patikrinti, ar id0 atstovauja kurso studentas. 11 00:00:43,910 --> 00:00:48,070 Tada padaryti tą patį į kitą studentas, mes jums reikia, nukopijuokite ir įklijuokite kodą id0 12 00:00:48,070 --> 00:00:54,430 ir pakeisti visas id0 įvykių su ID1 ir tt ID2, 3 ir 4. 13 00:00:54,430 --> 00:00:57,560 >> Tuoj pat, kai išgirsti, kad mes turime kopijuoti ir įklijuoti, 14 00:00:57,560 --> 00:01:00,440 jums reikia pradėti galvoti, kad yra geresnis sprendimas. 15 00:01:00,440 --> 00:01:05,360 Dabar ką daryti, jei jūs suprasite, jums nereikia 5 studento ID, o 7? 16 00:01:05,360 --> 00:01:09,570 Jums reikia grįžti į savo kodą ir pridėti į id5 žinutę ID6 17 00:01:09,570 --> 00:01:14,260 nukopijuokite ir įklijuokite patikrinti logika, jei IDS priklauso šioms 2 naujus ID klasės. 18 00:01:14,260 --> 00:01:19,600 Nėra nieko, jungiantis visus šiuos identifikatorius kartu, ir todėl nėra klausia būdas 19 00:01:19,600 --> 00:01:22,040 programa tai padaryti ID 0 iki 6. 20 00:01:22,040 --> 00:01:26,120 Na, dabar jūs suprantate, turite 100 studentų ID. 21 00:01:26,120 --> 00:01:30,770 Tai pradeda atrodyti mažiau nei idealus, reikia atskirai kurie kiekvienais iš šių identifikatorių, 22 00:01:30,770 --> 00:01:33,760 nukopijuokite ir įklijuokite bet dėl ​​šių naujų ID logika. 23 00:01:33,760 --> 00:01:38,380 Bet gal mes nustatoma, ir mes padarysime tai už visų 100 studentų. 24 00:01:38,380 --> 00:01:42,240 Bet kas, jei jūs nežinote, kiek studentų iš tikrųjų yra? 25 00:01:42,240 --> 00:01:47,320 Yra tik kai n studentai ir jūsų programa turi paprašyti, kad naudotojas, kas, kad n yra. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Tai nesiruošia dirbti labai gerai. 27 00:01:50,250 --> 00:01:53,820 Jūsų programa veikia tik tada, kai nuolat studentų skaičiaus. 28 00:01:53,820 --> 00:01:57,520 >> Spręsti visas šias problemas yra masyvų grožis. 29 00:01:57,520 --> 00:01:59,930 Taigi, kas yra masyvas? 30 00:01:59,930 --> 00:02:04,480 Kai kuriose programavimo kalbų masyvas tipas galėtų padaryti šiek tiek daugiau, 31 00:02:04,480 --> 00:02:09,960 bet čia mes sutelkti dėmesį į pagrindinio masyvo duomenų struktūros, kaip ir jūs pamatysite jį C 32 00:02:09,960 --> 00:02:14,030 Masyvas yra tik didelis atminties blokas. Štai ir viskas. 33 00:02:14,030 --> 00:02:17,770 Kai mes kalbame, kad 10 sveikųjų skaičių masyvas, kad tik reiškia, kad turime tam tikrą bloką 34 00:02:17,770 --> 00:02:20,740 atminties, kad yra pakankamai didelis, kad turėti 10 atskirų sveikieji skaičiai. 35 00:02:29,930 --> 00:02:33,410 Darant prielaidą, kad sveikasis skaičius yra 4 baitų, tai reiškia, kad 10 sveikųjų skaičių masyvas 36 00:02:33,410 --> 00:02:37,180 yra nenutrūkstamas 40 baitų atminties blokas. 37 00:02:42,660 --> 00:02:46,280 Net jei jūs naudojate daugiamačių masyvų, kurių mes negalime eiti į čia, 38 00:02:46,280 --> 00:02:49,200 jis vis dar yra tik didelis atminties blokas. 39 00:02:49,200 --> 00:02:51,840 Įvairiapusis notacijos yra tiesiog patogiau. 40 00:02:51,840 --> 00:02:55,640 Jei turite 3 3 daugiamačių sveikųjų skaičių masyvas, 41 00:02:55,640 --> 00:03:00,650 tada jūsų programa bus tikrai tik traktuoti tai kaip didelis blokas 36 baitų. 42 00:03:00,650 --> 00:03:05,460 Viso sveikųjų skaičių yra 3 kartus 3, ir kiekvienas sveikasis skaičius užima 4 baitų. 43 00:03:05,460 --> 00:03:07,750 >> Paimkime bent pagrindinio pavyzdžiui išvaizdą. 44 00:03:07,750 --> 00:03:10,660 Mes galime pamatyti čia 2 skirtingus būdus, kurie deklaravo masyvų. 45 00:03:15,660 --> 00:03:18,580 Mes turime Komentaras 1 iš jų programos, sudarančios 46 00:03:18,580 --> 00:03:20,900 nes mes pareiškiame x du kartus. 47 00:03:20,900 --> 00:03:25,140 Mes priimsime į kai kurių skirtumų tarp šių 2 rūšių deklaracijų šiek tiek išvaizdą. 48 00:03:25,140 --> 00:03:28,560 Tiek šių eilučių paskelbti N dydžio masyvą, 49 00:03:28,560 --> 00:03:30,740 kur mes # define 10 N ". 50 00:03:30,740 --> 00:03:34,460 Mes galime tiesiog taip pat lengvai, paprašė vartotoją teigiamas sveikasis skaičius 51 00:03:34,460 --> 00:03:37,250 ir naudojami, kad kaip elementų mūsų masyvas sveikasis skaičius. 52 00:03:37,250 --> 00:03:41,960 Patinka mūsų studento ID pavyzdžiui, prieš, tai natūra, pavyzdžiui, skelbiantis 10 visiškai atskirą 53 00:03:41,960 --> 00:03:49,000 įsivaizduojamas kintamieji; x0, x1, x2, ir tt iki xn-1. 54 00:03:57,270 --> 00:04:00,840 Ignoruojant eilutes kur mes skelbiame masyvo, pastebėsite, laužtiniuose skliaustuose nepažeistas 55 00:04:00,840 --> 00:04:02,090 viduje už kilpos. 56 00:04:02,090 --> 00:04:09,660 Kai kalbame apie kažką panašaus x [3], kurį aš ką tik perskaičiau kaip 3 konsole x 57 00:04:09,660 --> 00:04:13,090 jūs galite galvoti apie tai, tarsi klausia, įsivaizduojamo x3. 58 00:04:13,090 --> 00:04:17,519 Pranešimas nei su masyvo dydis N, tai reiškia, kad viduje skliausteliuose, 59 00:04:17,519 --> 00:04:22,630 kuriuos mes vadiname indeksą, gali būti įvairi: nuo 0 iki N-1, 60 00:04:22,630 --> 00:04:25,660 kuris yra N indeksų viso. 61 00:04:25,660 --> 00:04:28,260 >> Galvoti apie tai, kaip tai iš tikrųjų veikia 62 00:04:28,260 --> 00:04:31,260 prisiminti, kad masyvas yra didelis blokas atminties. 63 00:04:31,260 --> 00:04:37,460 Darant prielaidą, kad sveikasis skaičius yra 4 baitai, visa eilė x 40 baitų atminties blokas. 64 00:04:37,460 --> 00:04:41,360 Taigi x0 nuoroda į pirmųjų 4 baitų bloką. 65 00:04:45,810 --> 00:04:49,230 X [1], kalbama apie ateinančius 4 baitų ir pan. 66 00:04:49,230 --> 00:04:53,760 Tai reiškia, kad iš x Start programa kada nors reikia sekti. 67 00:04:55,660 --> 00:04:59,840 Jei norite naudoti X [400], tada programa žino, kad tai atitinka 68 00:04:59,840 --> 00:05:03,460 tik 1600 baitų po x pradžios. 69 00:05:03,460 --> 00:05:08,780 Where'd mes gauname 1600 baitus? Tai vos 400 kartus 4 baitai per sveikojo skaičiaus. 70 00:05:08,780 --> 00:05:13,170 >> Prieš pereinant, tai labai svarbu suprasti, kad C 71 00:05:13,170 --> 00:05:17,080 yra ne indekse, mes naudojame masyve vykdymo. 72 00:05:17,080 --> 00:05:23,180 Mūsų didelis blokas yra tik 10 sveikieji skaičiai, bet nieko klykauti ne su mumis, jei mes rašome X [20] 73 00:05:23,180 --> 00:05:26,060 ar net x [-5]. 74 00:05:26,060 --> 00:05:28,240 Indeksas nėra net turi būti skaičius. 75 00:05:28,240 --> 00:05:30,630 Jis gali būti savavališkai išraiška. 76 00:05:30,630 --> 00:05:34,800 Programoje mes naudojame kintamojo i iš kilpos indeksą į masyvo. 77 00:05:34,800 --> 00:05:40,340 Tai yra labai dažnas modelis, kilpų masyvo ilgis nuo i = 0, 78 00:05:40,340 --> 00:05:43,350 ir tada naudojant i masyvo indekso. 79 00:05:43,350 --> 00:05:46,160 Tokiu būdu jums efektyviai kilpos per visą masyvo, 80 00:05:46,160 --> 00:05:50,600 ir galite priskirti kiekvienam masyvo vietoje arba jį naudoti kai kurias skaičiavimo. 81 00:05:50,600 --> 00:05:53,920 >> Už linijos, aš prasideda 0, 82 00:05:53,920 --> 00:05:58,680 ir todėl bus priskirti 0 vietoje masyve, vertė 0 kartų 2. 83 00:05:58,680 --> 00:06:04,370 Tada aš žingsneliais, ir mes priskirti pirmąjį vietoje masyve vertė 1 kartų 2. 84 00:06:04,370 --> 00:06:10,170 Tada i žingsniu vėl ir tt iki tol, kol mes priskirti poziciją N-1 masyve 85 00:06:10,170 --> 00:06:13,370 vertė, N-1 kartus 2. 86 00:06:13,370 --> 00:06:17,810 Todėl sukūrėme su pirmąja 10 net numerius masyvo. 87 00:06:17,810 --> 00:06:21,970 Gal išlygina būtų buvę kintamojo pavadinimas šiek tiek geriau nei x, 88 00:06:21,970 --> 00:06:24,760 bet kad būtų davė daiktų. 89 00:06:24,760 --> 00:06:30,210 Antroji už linijos, tada tiesiog spausdina vertes, kad mes jau saugomi viduje masyvo. 90 00:06:30,210 --> 00:06:33,600 >> Pabandykime paleisti programą su abiejų masyvo deklaracijų 91 00:06:33,600 --> 00:06:36,330 ir imtis ne programos produkcijos išvaizdą. 92 00:06:51,450 --> 00:06:57,020 Kiek mes galime pamatyti, programa elgiasi vienodai abiejų deklaracijų. 93 00:06:57,020 --> 00:07:02,230 Leiskite taip pat atsižvelgti į tai, kas vyksta, atrodo, jei mes pakeisime pirmą kilpą nesibaigia ties N 94 00:07:02,230 --> 00:07:05,040 , o pasakyti 10.000. 95 00:07:05,040 --> 00:07:07,430 Toli už masyvo pabaigos. 96 00:07:14,700 --> 00:07:17,210 Oi. Galbūt jūs matėte anksčiau. 97 00:07:17,210 --> 00:07:20,440 Segmentavimo kaltės reiškia, kad jūsų programa nulūžo. 98 00:07:20,440 --> 00:07:24,430 Jūs pradėtumėte matyti tai, kai jūs liečiate atminties sritis, jums neturėtų būti neliesti. 99 00:07:24,430 --> 00:07:27,870 Čia mes neliesti 10.000 vietų ne tik x pradžios, 100 00:07:27,870 --> 00:07:31,920 kuri akivaizdžiai yra atminties vieta, mes neturėtume būti neliesti. 101 00:07:31,920 --> 00:07:37,690 Taigi, dauguma iš mūsų tikriausiai nebūtų netyčia 10.000 vietoj N, 102 00:07:37,690 --> 00:07:42,930 bet ką daryti, jei mes darome kažką subtilesnių kaip pasakyti rašyti mažesnis arba lygus N 103 00:07:42,930 --> 00:07:46,830 loop "sąlygos, o ne mažiau nei N. 104 00:07:46,830 --> 00:07:50,100 Atminkite, kad masyvas turi tik indeksus nuo 0 iki N-1, 105 00:07:50,100 --> 00:07:54,510 , o tai reiškia, kad indeksas N yra už masyvo pabaigos. 106 00:07:54,510 --> 00:07:58,050 Programa gali ne katastrofos šiuo atveju, tačiau jis vis dar klaida. 107 00:07:58,050 --> 00:08:01,950 Tiesą sakant, tai klaida yra toks įprastas, kad ji turi savo vardą, 108 00:08:01,950 --> 00:08:03,970 1 klaida išjungtas. 109 00:08:03,970 --> 00:08:05,970 >> Štai ir viskas pagrindai. 110 00:08:05,970 --> 00:08:09,960 Taigi, kokie yra esminiai skirtumai tarp 2 rūšių masyvo deklaracijų? 111 00:08:09,960 --> 00:08:13,960 Vienas skirtumas yra, kur eina didelis blokas atminties. 112 00:08:13,960 --> 00:08:17,660 Pirmoje deklaracijoje, kurį aš kviesiu laikiklis-Array tipo, 113 00:08:17,660 --> 00:08:20,300 , nors tai jokiu būdu tradicinį pavadinimą, 114 00:08:20,300 --> 00:08:22,480 jis bus eiti kamino. 115 00:08:22,480 --> 00:08:27,450 Kadangi antrojoje, kurį aš kviesiu rodyklė-Array tipo, tai bus eiti į krūvą. 116 00:08:27,450 --> 00:08:32,480 Tai reiškia, kad kai funkcija grąžina, laikiklis masyvas automatiškai deallocated, 117 00:08:32,480 --> 00:08:36,419 kadangi turite Atvirai skambinti nemokamai rodyklės masyvo 118 00:08:36,419 --> 00:08:38,010 ar dar turite Atminties nutekėjimas. 119 00:08:38,010 --> 00:08:42,750 Be to, laikiklis masyvas yra ne iš tikrųjų kintama. 120 00:08:42,750 --> 00:08:45,490 Tai svarbu. Tai tik simbolis. 121 00:08:45,490 --> 00:08:49,160 Jūs galite galvoti apie tai kaip pastovus, kad kompiliatorius pasirenka jums. 122 00:08:49,160 --> 00:08:52,970 Tai reiškia, kad mes negalime padaryti kažką panašaus į X + + su laikiklio tipą, 123 00:08:52,970 --> 00:08:56,240 nors tai yra visiškai tinkamas rodyklės tipo. 124 00:08:56,240 --> 00:08:58,270 >> Rodyklė tipas yra kintama. 125 00:08:58,270 --> 00:09:01,510 Rodyklės tipo, mes turime 2 atskiros atminties blokus. 126 00:09:01,510 --> 00:09:06,060 Pačios kintamasis x yra saugomi įrenginyje ir yra tik viena rodyklė, 127 00:09:06,060 --> 00:09:08,620 bet didelis atminties blokas yra saugomi krūvos. 128 00:09:08,620 --> 00:09:11,010 Kintamasis x kamino tik saugo adresą 129 00:09:11,010 --> 00:09:14,010 didžiosios bloko atmintyje krūvos. 130 00:09:14,010 --> 00:09:17,370 Viena išvada yra tai, su operatoriaus dydžiui. 131 00:09:17,370 --> 00:09:22,480 Jei jūs paprašykite kronšteiną masyvo dydį, jis duos jums didelis atminties bloko dydį, 132 00:09:22,480 --> 00:09:24,620 kažkas panašaus į 40 baitų, 133 00:09:24,620 --> 00:09:26,920 tačiau, jei jūs paprašykite rodyklės tipo masyvo dydžio, 134 00:09:26,920 --> 00:09:32,740 jis duos jums kintamojo x, kuris ant prietaiso, gali tik 4 baitų dydžio. 135 00:09:32,740 --> 00:09:36,530 Naudojant rodyklė matricos tipo, neįmanoma tiesiogiai prašyti 136 00:09:36,530 --> 00:09:38,530 didžiosios bloko atminties dydis. 137 00:09:38,530 --> 00:09:42,530 Tai paprastai nėra apribojimo, nes mes labai retai nori dydį 138 00:09:42,530 --> 00:09:46,980 didelis atminties blokas, ir mes paprastai apskaičiuoti, jei mums reikia. 139 00:09:46,980 --> 00:09:51,490 >> Galiausiai, skliausteliuose masyvas atsitinka pateikti mums Inicijuojama masyvą nuorodą. 140 00:09:51,490 --> 00:09:56,130 Pažiūrėkime, kaip mes galime rašyti pirmąsias 10 net sveikieji skaičiai, naudodami klavišų initilization. 141 00:10:11,220 --> 00:10:14,470 Su rodyklės masyvo, nėra būdas tai padaryti nuorodą kaip šis. 142 00:10:14,470 --> 00:10:18,120 Tai yra tik įvadas į tai, ką jūs galite padaryti su matricomis. 143 00:10:18,120 --> 00:10:20,990 Jie pasirodo beveik kiekvienoje programoje rašote. 144 00:10:20,990 --> 00:10:24,390 Tikimės, kad dabar galite pamatyti geresnį būdą padaryti studentų identifikacijos pavyzdys 145 00:10:24,390 --> 00:10:26,710 iš vaizdo įrašo pradžios. 146 00:10:26,710 --> 00:10:29,960 >> My name is Rob Bowden, ir tai yra CS50.