[Powered by Google Translate] Pakalbėkime apie masyvų.
Taigi, kodėl gi mes kada nors norite naudoti masyvų?
Na tegul sako, kad turite programą, kad reikia laikyti 5 studentų ID.
Tai gali atrodyti protinga turėti 5 atskirus kintamuosius.
Dėl priežasčių, mes matome šiek tiek, mes pradėsime skaičiuoti nuo 0.
Kintamieji, mes turime bus int id0, int id1, ir taip toliau.
Bet koks logika mes norime atlikti dėl studento ID reikės nukopijuoti ir įklijuoti
kiekvienos iš šių studentų ID.
Jei mes norime patikrinti, kuriuose studentai atsitiktų būti CS50,
mes pirmiausia reikia patikrinti, ar id0 atstovauja kurso studentas.
Tada padaryti tą patį į kitą studentas, mes jums reikia, nukopijuokite ir įklijuokite kodą id0
ir pakeisti visas id0 įvykių su ID1 ir tt ID2, 3 ir 4.
>> Tuoj pat, kai išgirsti, kad mes turime kopijuoti ir įklijuoti,
jums reikia pradėti galvoti, kad yra geresnis sprendimas.
Dabar ką daryti, jei jūs suprasite, jums nereikia 5 studento ID, o 7?
Jums reikia grįžti į savo kodą ir pridėti į id5 žinutę ID6
nukopijuokite ir įklijuokite patikrinti logika, jei IDS priklauso šioms 2 naujus ID klasės.
Nėra nieko, jungiantis visus šiuos identifikatorius kartu, ir todėl nėra klausia būdas
programa tai padaryti ID 0 iki 6.
Na, dabar jūs suprantate, turite 100 studentų ID.
Tai pradeda atrodyti mažiau nei idealus, reikia atskirai kurie kiekvienais iš šių identifikatorių,
nukopijuokite ir įklijuokite bet dėl ​​šių naujų ID logika.
Bet gal mes nustatoma, ir mes padarysime tai už visų 100 studentų.
Bet kas, jei jūs nežinote, kiek studentų iš tikrųjų yra?
Yra tik kai n studentai ir jūsų programa turi paprašyti, kad naudotojas, kas, kad n yra.
Uh oh. Tai nesiruošia dirbti labai gerai.
Jūsų programa veikia tik tada, kai nuolat studentų skaičiaus.
>> Spręsti visas šias problemas yra masyvų grožis.
Taigi, kas yra masyvas?
Kai kuriose programavimo kalbų masyvas tipas galėtų padaryti šiek tiek daugiau,
bet čia mes sutelkti dėmesį į pagrindinio masyvo duomenų struktūros, kaip ir jūs pamatysite jį C
Masyvas yra tik didelis atminties blokas. Štai ir viskas.
Kai mes kalbame, kad 10 sveikųjų skaičių masyvas, kad tik reiškia, kad turime tam tikrą bloką
atminties, kad yra pakankamai didelis, kad turėti 10 atskirų sveikieji skaičiai.
Darant prielaidą, kad sveikasis skaičius yra 4 baitų, tai reiškia, kad 10 sveikųjų skaičių masyvas
yra nenutrūkstamas 40 baitų atminties blokas.
Net jei jūs naudojate daugiamačių masyvų, kurių mes negalime eiti į čia,
jis vis dar yra tik didelis atminties blokas.
Įvairiapusis notacijos yra tiesiog patogiau.
Jei turite 3 3 daugiamačių sveikųjų skaičių masyvas,
tada jūsų programa bus tikrai tik traktuoti tai kaip didelis blokas 36 baitų.
Viso sveikųjų skaičių yra 3 kartus 3, ir kiekvienas sveikasis skaičius užima 4 baitų.
>> Paimkime bent pagrindinio pavyzdžiui išvaizdą.
Mes galime pamatyti čia 2 skirtingus būdus, kurie deklaravo masyvų.
Mes turime Komentaras 1 iš jų programos, sudarančios
nes mes pareiškiame x du kartus.
Mes priimsime į kai kurių skirtumų tarp šių 2 rūšių deklaracijų šiek tiek išvaizdą.
Tiek šių eilučių paskelbti N dydžio masyvą,
kur mes # define 10 N ".
Mes galime tiesiog taip pat lengvai, paprašė vartotoją teigiamas sveikasis skaičius
ir naudojami, kad kaip elementų mūsų masyvas sveikasis skaičius.
Patinka mūsų studento ID pavyzdžiui, prieš, tai natūra, pavyzdžiui, skelbiantis 10 visiškai atskirą
įsivaizduojamas kintamieji; x0, x1, x2, ir tt iki xn-1.
Ignoruojant eilutes kur mes skelbiame masyvo, pastebėsite, laužtiniuose skliaustuose nepažeistas
viduje už kilpos.
Kai kalbame apie kažką panašaus x [3], kurį aš ką tik perskaičiau kaip 3 konsole x
jūs galite galvoti apie tai, tarsi klausia, įsivaizduojamo x3.
Pranešimas nei su masyvo dydis N, tai reiškia, kad viduje skliausteliuose,
kuriuos mes vadiname indeksą, gali būti įvairi: nuo 0 iki N-1,
kuris yra N indeksų viso.
>> Galvoti apie tai, kaip tai iš tikrųjų veikia
prisiminti, kad masyvas yra didelis blokas atminties.
Darant prielaidą, kad sveikasis skaičius yra 4 baitai, visa eilė x 40 baitų atminties blokas.
Taigi x0 nuoroda į pirmųjų 4 baitų bloką.
X [1], kalbama apie ateinančius 4 baitų ir pan.
Tai reiškia, kad iš x Start programa kada nors reikia sekti.
Jei norite naudoti X [400], tada programa žino, kad tai atitinka
tik 1600 baitų po x pradžios.
Where'd mes gauname 1600 baitus? Tai vos 400 kartus 4 baitai per sveikojo skaičiaus.
>> Prieš pereinant, tai labai svarbu suprasti, kad C
yra ne indekse, mes naudojame masyve vykdymo.
Mūsų didelis blokas yra tik 10 sveikieji skaičiai, bet nieko klykauti ne su mumis, jei mes rašome X [20]
ar net x [-5].
Indeksas nėra net turi būti skaičius.
Jis gali būti savavališkai išraiška.
Programoje mes naudojame kintamojo i iš kilpos indeksą į masyvo.
Tai yra labai dažnas modelis, kilpų masyvo ilgis nuo i = 0,
ir tada naudojant i masyvo indekso.
Tokiu būdu jums efektyviai kilpos per visą masyvo,
ir galite priskirti kiekvienam masyvo vietoje arba jį naudoti kai kurias skaičiavimo.
>> Už linijos, aš prasideda 0,
ir todėl bus priskirti 0 vietoje masyve, vertė 0 kartų 2.
Tada aš žingsneliais, ir mes priskirti pirmąjį vietoje masyve vertė 1 kartų 2.
Tada i žingsniu vėl ir tt iki tol, kol mes priskirti poziciją N-1 masyve
vertė, N-1 kartus 2.
Todėl sukūrėme su pirmąja 10 net numerius masyvo.
Gal išlygina būtų buvę kintamojo pavadinimas šiek tiek geriau nei x,
bet kad būtų davė daiktų.
Antroji už linijos, tada tiesiog spausdina vertes, kad mes jau saugomi viduje masyvo.
>> Pabandykime paleisti programą su abiejų masyvo deklaracijų
ir imtis ne programos produkcijos išvaizdą.
Kiek mes galime pamatyti, programa elgiasi vienodai abiejų deklaracijų.
Leiskite taip pat atsižvelgti į tai, kas vyksta, atrodo, jei mes pakeisime pirmą kilpą nesibaigia ties N
, o pasakyti 10.000.
Toli už masyvo pabaigos.
Oi. Galbūt jūs matėte anksčiau.
Segmentavimo kaltės reiškia, kad jūsų programa nulūžo.
Jūs pradėtumėte matyti tai, kai jūs liečiate atminties sritis, jums neturėtų būti neliesti.
Čia mes neliesti 10.000 vietų ne tik x pradžios,
kuri akivaizdžiai yra atminties vieta, mes neturėtume būti neliesti.
Taigi, dauguma iš mūsų tikriausiai nebūtų netyčia 10.000 vietoj N,
bet ką daryti, jei mes darome kažką subtilesnių kaip pasakyti rašyti mažesnis arba lygus N
loop "sąlygos, o ne mažiau nei N.
Atminkite, kad masyvas turi tik indeksus nuo 0 iki N-1,
, o tai reiškia, kad indeksas N yra už masyvo pabaigos.
Programa gali ne katastrofos šiuo atveju, tačiau jis vis dar klaida.
Tiesą sakant, tai klaida yra toks įprastas, kad ji turi savo vardą,
1 klaida išjungtas.
>> Štai ir viskas pagrindai.
Taigi, kokie yra esminiai skirtumai tarp 2 rūšių masyvo deklaracijų?
Vienas skirtumas yra, kur eina didelis blokas atminties.
Pirmoje deklaracijoje, kurį aš kviesiu laikiklis-Array tipo,
, nors tai jokiu būdu tradicinį pavadinimą,
jis bus eiti kamino.
Kadangi antrojoje, kurį aš kviesiu rodyklė-Array tipo, tai bus eiti į krūvą.
Tai reiškia, kad kai funkcija grąžina, laikiklis masyvas automatiškai deallocated,
kadangi turite Atvirai skambinti nemokamai rodyklės masyvo
ar dar turite Atminties nutekėjimas.
Be to, laikiklis masyvas yra ne iš tikrųjų kintama.
Tai svarbu. Tai tik simbolis.
Jūs galite galvoti apie tai kaip pastovus, kad kompiliatorius pasirenka jums.
Tai reiškia, kad mes negalime padaryti kažką panašaus į X + + su laikiklio tipą,
nors tai yra visiškai tinkamas rodyklės tipo.
>> Rodyklė tipas yra kintama.
Rodyklės tipo, mes turime 2 atskiros atminties blokus.
Pačios kintamasis x yra saugomi įrenginyje ir yra tik viena rodyklė,
bet didelis atminties blokas yra saugomi krūvos.
Kintamasis x kamino tik saugo adresą
didžiosios bloko atmintyje krūvos.
Viena išvada yra tai, su operatoriaus dydžiui.
Jei jūs paprašykite kronšteiną masyvo dydį, jis duos jums didelis atminties bloko dydį,
kažkas panašaus į 40 baitų,
tačiau, jei jūs paprašykite rodyklės tipo masyvo dydžio,
jis duos jums kintamojo x, kuris ant prietaiso, gali tik 4 baitų dydžio.
Naudojant rodyklė matricos tipo, neįmanoma tiesiogiai prašyti
didžiosios bloko atminties dydis.
Tai paprastai nėra apribojimo, nes mes labai retai nori dydį
didelis atminties blokas, ir mes paprastai apskaičiuoti, jei mums reikia.
>> Galiausiai, skliausteliuose masyvas atsitinka pateikti mums Inicijuojama masyvą nuorodą.
Pažiūrėkime, kaip mes galime rašyti pirmąsias 10 net sveikieji skaičiai, naudodami klavišų initilization.
Su rodyklės masyvo, nėra būdas tai padaryti nuorodą kaip šis.
Tai yra tik įvadas į tai, ką jūs galite padaryti su matricomis.
Jie pasirodo beveik kiekvienoje programoje rašote.
Tikimės, kad dabar galite pamatyti geresnį būdą padaryti studentų identifikacijos pavyzdys
iš vaizdo įrašo pradžios.
>> My name is Rob Bowden, ir tai yra CS50.