[Powered by Google Translate] La oss snakke om arrays. Så hvorfor skulle vi ønske å bruke arrays? Vel la oss si du har et program som trenger å lagre 5 student IDer. Det kan virke rimelig å ha 5 separate variabler. Av grunner vi vil se i en bit, vil vi begynne å telle fra 0. Variablene vi vil ha vil bli int ID0, int ID1, og så videre. Noen logikk vi ønsker å utføre på en student-ID må kopieres og limes for hver av disse student-ID. Hvis vi ønsker å sjekke hvilke studenter måtte være i CS50, Vi må først sjekke om ID0 representerer student i kurset. Så for å gjøre det samme for neste student, må vi kopiere og lime inn koden for ID0 og erstatte alle forekomster av ID0 med ID1 og så videre for ID2, 3 og 4. Så snart du hører at vi trenger å kopiere og lime inn, du bør begynne å tenke på at det er en bedre løsning. Hva nå hvis du innser at du ikke trenger 5 studenter IDer men heller 7? Du trenger å gå tilbake til kildekoden og legge i en ID5, en id6, og kopiere og lime inn logikk for å sjekke om de IDer tilhører klassen for disse to nye IDer. Det er ingenting å koble alle disse IDene sammen, og så er det ingen måte å spørre programmet å gjøre dette for IDer 0 til 6. Vel nå innser at du har 100 studenter IDer. Det begynner å virke mindre enn ideelle til å trenge å separat erklære hver av disse IDene, og kopiere og lime inn noen logikk for de nye ID-er. Men kanskje vi er fast bestemt på, og vi gjør det for alle 100 studenter. Men hva hvis du ikke vet hvor mange elever det faktisk er? Det er bare noen n studenter og programmet har å spørre brukeren hva som n er. Uh oh. Dette er ikke til å fungere veldig bra. Programmet fungerer bare for noen konstant antall studenter. Løse alle disse problemene er skjønnheten i arrays. Så hva er en matrise? I noen programmeringsspråk en rekke typer kan være i stand til å gjøre litt mer, men her vil vi fokusere på grunnleggende matrise datastrukturen akkurat som du vil se den i C. En matrise er bare en stor blokk med minne. Det var det. Når vi sier vi har en rekke 10 heltall, det betyr bare at vi har noen blokk minne som er stor nok til å romme 10 separate heltall. Forutsatt at et heltall er 4 byte, betyr dette at en rekke av 10 heltall er en sammenhengende blokk på 40 byte i minnet. Selv når du bruker flerdimensjonale arrays, som vi ikke vil gå inn på her, det er fortsatt bare en stor blokk med minne. Flerdimensjonale notasjon er bare et hjelpemiddel. Hvis du har en 3 x 3 flerdimensjonal array av heltall, da programmet vil egentlig bare behandle dette som en stor blokk med 36 byte. Det totale antall av heltall er 3 ganger 3, og hver heltall tar opp 4 byte. La oss ta en titt på en grunnleggende eksempel. Vi ser her to forskjellige måter erklære arrays. Vi må kommentere en av dem ut for programmet å kompilere siden vi erklærer x to ganger. Vi vil ta en titt på noen av forskjellene mellom disse to typene erklæringer i litt. Begge disse linjene erklære en rekke størrelse N, hvor vi har # define N som 10. Vi kunne like gjerne ha spurt brukeren om et positivt heltall og brukes som heltall som en rekke elementer i matrisen vår. Liker vår student-ID eksempel før, er dette typen som erklære 10 helt separat imaginære variabler; x0, x1, x2, og så videre opp til xN-1. Ignorerer linjer der vi erklærer tabellen, merker klammeparentesene intakt inne i for sløyfer. Når vi skriver noe sånt x [3], som jeg vil bare lese som x brakett 3, du kan tenke på det som å be om den imaginære x3. Merke enn med en matrise av størrelse N, betyr dette at antall innsiden av vinkelen, som vi kaller indeksen, kan være alt fra 0 til N-1, som er en total av N indeksene. Å tenke på hvordan dette faktisk fungerer husk at matrisen er en stor blokk med minne. Forutsatt at et heltall er 4 bytes, er hele matrisen X en 40 byte minneblokk. Så x0 refererer til de aller første 4 byte av blokken. X [1] viser til de neste 4 byte og så videre. Dette betyr at inngangen av x er alle program noensinne behov for å holde styr på. Hvis du ønsker å bruke x [400], og programmet vet at dette tilsvarer til bare 1600 byte etter starten av x. Hvor fikk vi får 1600 bytes fra? Det er bare 400 ganger 4 bytes per tall. Før du går videre, er det svært viktig å innse at i C Det er ingen håndhevelse av indeksen som vi bruker i tabellen. Vår store blokken er bare 10 heltall lang, men ingenting vil kjefte på oss hvis vi skriver x [20] eller x [-5]. Indeksen har ikke engang å være ett nummer. Det kan være en hvilken som helst vilkårlig uttrykk. I programmet bruker vi variabelen i fra for loop å indeksere inn i matrisen. Dette er en svært vanlig mønster looping fra i = 0 til lengden av tabellen, og deretter bruke jeg som indeksen for tabellen. På denne måten du effektivt sløyfe over hele array, og du kan enten tildele hver plass i matrisen eller bruke det til noen beregning. I den første for-løkken, starter jeg ved 0, og slik vil det tilordne til 0 plass i tabellen, verdien 0 ganger 2. Så jeg trinn, og vi tilordne det første stedet i matrisen verdien 1 ganger 2. Så jeg trinn igjen og så videre inntil vi gir posisjonere N-1 i rekken verdien N-1 ganger 2. Derfor har vi laget en matrise med de første 10 partall. Kanskje jevner ville ha vært litt bedre navn på variabelen enn x, men som ville ha gitt ting unna. Den andre for loop så skriver bare de verdiene som vi allerede har lagret inne i matrisen. La oss prøve å kjøre programmet med begge typer rekke erklæringer og ta en titt på utgangen av programmet. Så vidt vi kan se, oppfører programmet på samme måte for begge typer erklæringer. La oss også ta en titt på hva som skjer hvis vi endrer den første loop til ikke stoppe på N men heller si 10.000. Langt utover slutten av tabellen. Oops. Kanskje du har sett dette før. En segmentering feil betyr at programmet har krasjet. Du begynner å se disse når du trykker på områder av minnet du ikke bør berøre. Her er vi rørende 10000 steder utenfor inngangen til x, som er åpenbart et sted i minnet vi ikke bør berøre. Så de fleste av oss sannsynligvis ikke ville ved et uhell sette 10000 i stedet for N, men hva hvis vi gjør noe mer subtil som sier write mindre enn eller lik N i for loop tilstand i motsetning til mindre enn N. Husk at en matrise bare har indekser fra 0 til n-1, noe som betyr at indeks N er utover slutten av tabellen. Programmet er kanskje ikke krasje i dette tilfellet, men det er fortsatt en feil. Faktisk er denne feilen så vanlig at det har det egne navn, en av ved en feil. Det er det for det grunnleggende. Så hva er de største forskjellene mellom de to typene rekke erklæringer? En forskjell er der den store blokken av minnet går. I den første erklæringen, som jeg vil kalle braketten-array type, selv om dette er på ingen måte en konvensjonell navn, det vil gå på stakken. Mens i andre, som jeg vil kalle pekeren-array type, vil det gå på haugen. Dette betyr at når funksjonen returnerer vil braketten matrisen automatisk deallocated, mens som du må eksplisitt ringe gratis på pekeren rekke eller annet du har en minnelekkasje. I tillegg, er braketten matrisen faktisk ikke en variabel. Dette er viktig. Det er bare et symbol. Du kan tenke på det som en konstant som kompilatoren velger for deg. Dette betyr at vi ikke kan gjøre noe sånt x + + med braketten type, men dette er helt gyldig med pekeren type. Pekeren typen er en variabel. For pekeren type, har vi 2 separate blokker av minnet. Variabelen X selv er lagret i stakken og er bare en enkelt peker, men den store blokken av minnet er lagret på haugen. Variabelen x på stakken lagrer bare adressen av den store blokken av minnet på haugen. En implikasjon av denne er med størrelsen av operatør. Hvis du ber om størrelsen på braketten array, vil det gi deg størrelsen på den store blokken av minne, noe sånt som 40 byte, men hvis du ber om størrelsen på pekeren type array, det vil gi deg størrelsen på variabelen x selv, som på apparatet er sannsynlig bare 4 bytes. Ved hjelp av pekeren-array type, er det umulig å direkte spørre om størrelsen av den store minneblokk. Dette er vanligvis ikke mye av en begrensning siden vi svært sjelden ønsker størrelsen av den store blokken av minnet, og vi kan vanligvis regne det hvis vi trenger det. Endelig skjer braketten rekke å gi oss en snarvei for initialisering en matrise. La oss se hvordan vi kan skrive de første 10 selv heltall ved hjelp av snarveien initilization. Med pekeren array, det er ikke en måte å gjøre en snarvei som dette. Dette er bare en introduksjon til hva du kan gjøre med arrays. De dukker opp i nesten hvert program du skriver. Forhåpentligvis kan du nå se en bedre måte å gjøre studenten IDer eksempel fra begynnelsen av videoen. Mitt navn er Rob Bowden, og dette er CS50.