[Powered by Google Translate] Lad os tale om arrays. Så hvorfor skulle vi nogensinde ønsker at bruge arrays? Jamen så lad os sige du har et program, der skal til at gemme 5 studerende id'er. Det kan virke rimeligt at have 5 separate variabler. Af grunde, vi vil se i en smule, vil vi begynde at tælle fra 0. De variable vi vil have, vil være int ID0, int ID1, og så videre. Enhver logik vi ønsker at udføre på et studiekort skal kopieres og indsættes for hver af disse studerende id'er. Hvis vi ønsker at se, hvilke studerende tilfældigvis i CS50, vi først nødt til at kontrollere, om ID0 repræsenterer den studerende i kurset. Så for at gøre det samme for den næste elev, vil vi nødt til at kopiere og indsætte koden for ID0 og erstatte alle forekomster af ID0 med ID1 og så videre for ID2, 3 og 4. Så snart du hører, at vi er nødt til at kopiere og indsætte, bør du begynde at tænke, at der er en bedre løsning. Hvad nu hvis du indser, at du ikke behøver 5 studerende id'er, men snarere 7? Du er nødt til at gå tilbage i din kilde kode og tilføje i en ID5, en ID6, og kopiere og indsætte den logik for kontrol, hvis de ID'er tilhører klassen for disse 2 nye ID'er. Der er intet der forbinder alle disse ID'er sammen, og så der er ingen måde at spørge programmet for at gøre dette for ID'er 0 til 6. Nå nu har du indser du har 100 studerende id'er. Det er begyndt at synes mindre end ideel til brug for at særskilt erklære hver af disse ID'er, og kopiere og indsætte nogen logik for disse nye ID'er. Men måske er vi bestemt, og vi gør det for alle 100 elever. Men hvad nu, hvis du ikke ved, hvor mange studerende der rent faktisk er? Der er bare nogle n studerende og dit program har at spørge brugeren, hvad der n er. Uh oh. Dette kommer ikke til at arbejde meget godt. Dit program virker kun for nogle konstant antal studerende. Løsning alle disse problemer er skønheden i arrays. Så hvad er et array? I nogle programmeringssprog et array type, kan være i stand til at gøre en smule mere, men her vil vi fokusere på den grundlæggende opstilling datastruktur lige som du vil se det i C. Et array er bare en stor blok af hukommelse. Det er det. Når vi siger, at vi har en vifte af 10 heltal, der bare betyder, at vi har nogle blok hukommelse, der er stor nok til at rumme 10 separate heltal. Antages det, at et helt tal er fire bytes, betyder dette, at et array af 10 heltal er en kontinuerlig blok på 40 bytes i hukommelsen. Selv når du bruger flerdimensionelle arrays, som vi ikke vil gå ind på her, det er stadig bare en stor blok af hukommelse. Den flerdimensionale notation er bare en bekvemmelighed. Hvis du har en 3 gange 3 multidimensional array af heltal, så dit program vil egentlig bare betragte dette som en stor blok af 36 bytes. Det samlede antal heltal er 3 gange 3, og hvert heltal optager 4 byte. Lad os tage et kig på et grundlæggende eksempel. Vi kan se her 2 forskellige måder at erklære arrays. Vi bliver nødt til at kommentere 1 af dem ud for programmet at indsamle da vi erklærer x to gange. Vi tager et kig på nogle af forskellene mellem disse 2 typer af erklæringer i en smule. Begge disse linjer erklærer en vifte af størrelse N, hvor vi har # define N som 10. Vi kunne lige så godt have bedt brugeren om et positivt heltal og brugte den heltal som en række elementer i vores array. Ligesom vores studiekort eksempel før, det er lidt ligesom at erklære 10 helt adskilt imaginære variabler, x0, x1, x2, og så videre op til xn-1. Ignorerer de strækninger, hvor vi erklærer array, bemærker de firkantede parenteser intakt inde i for-løkker. Når vi skriver noget i retning af x [3], som jeg bare læses som x konsol 3, du kan tænke på det som beder om det imaginære x3. Bemærker end med et array af størrelsen N, betyder dette, at antallet indersiden af ​​konsollerne, som vi vil kalde indekset, kan være alt fra 0 til N-1, som er i alt N indeks. At tænke over, hvordan dette rent faktisk virker huske, at opstillingen er en stor blok af hukommelse. Antages det, at et helt tal er fire bytes, hele array'et x er en 40 byte blok af hukommelse. Så x0 refererer til de første 4 bytes af blokken. X [1] henviser til de næste 4 bytes og så videre. Dette betyder, at starten på x er så program nogensinde skal holde styr på. Hvis du ønsker at bruge x [400], så programmet ved, at det er ækvivalent til kun 1.600 bytes efter starten af ​​x. Hvor vi får 1.600 bytes fra? Det er blot 400 gange 4 bytes per heltal. Før vi går videre, er det meget vigtigt at indse, at i C Der er ingen håndhævelse af indekset, som vi bruger i array. Vores store blok er kun 10 heltal lang, men intet vil yell på os, hvis vi skriver x [20] eller endog x [-5]. Indekset har ikke engang at være et tal. Det kan være enhver vilkårlig ekspression. I programmet bruger vi variablen i fra for-løkken til indeks i array. Dette er en meget almindelig mønster, looping fra i = 0 til længde af arrayet, og derefter bruge i som indekset for opstillingen. På denne måde kan du faktisk loop over hele systemet, og du kan enten tildele hver plet i rækken, eller bruge det til noget beregning. I den første for-løkke, starter jeg på 0, og så det vil tildele 0 plet i arrayet, værdien 0 gange 2. Så jeg intervaller, og vi tildele det første sted i arrayet værdien 1 gange 2. Så jeg intervaller igen og så videre indtil vi tildeler at positionere N-1 i array værdien N-1 gange 2. Så vi har oprettet et array med de første 10 lige numre. Måske udligner ville have været en smule bedre navn for variablen end x, men det ville have givet ting væk. Den anden for-løkke så bare udskriver de værdier, som vi allerede har gemt inde i array. Lad os prøve at køre programmet med begge typer array-erklæringer og tage et kig på outputtet af programmet. Så vidt vi kan se, at programmet opfører sig på samme måde for begge typer erklæringer. Lad os også tage et kig på, hvad der sker, hvis vi ændre det første sløjfe til ikke stoppe ved N men snarere sige 10.000. Langt ud over enden af ​​arrayet. Ups. Måske har du set det før. En segmentering fejl betyder, at din program er gået ned. Du begynder at se disse, når du trykker på områder med hukommelse, bør du ikke røre. Her er vi rører 10.000 pladser ud over starten af ​​x, som åbenbart er et sted i hukommelsen, vi skal ikke røre. Så de fleste af os nok ikke utilsigtet sætte 10.000 i stedet for N, men hvad nu hvis vi gør noget mere subtile lignende sige skrive mindre end eller lig med N i for-løkken tilstand i modsætning til mindre end N. Husk, at en matrix kun har indekser fra 0 til N-1, hvilket betyder, at indeks N er ud over enden af ​​matrixen. Programmet kan ikke gå ned i denne sag, men det er stadig en fejl. I virkeligheden er denne fejl så almindeligt, at det har det eget navn, en off med 1 fejl. Det er det for det grundlæggende. Så hvad er de store forskelle mellem de 2 typer af array-erklæringer? En forskel er, hvor den store blok af hukommelse går. I den første erklæring, jeg som ringer til beslaget-array-type, men dette er på ingen måde en konventionel betegnelse, den kan komme på stakken. Hvorimod i det andet, som jeg vil kalde markøren-array-typen, vil det gå på heapen. Det betyder, at når funktionen returnerer, vil konsollen arrayet automatisk blive deallokeret, hvorimod som du explicitily skal ringe gratis på pointer arrayet eller andet, du har en hukommelsesfejl. Derudover konsollen arrayet er faktisk ikke en variabel. Dette er vigtigt. Det er bare et symbol. Du kan tænke på det som en konstant at compileren vælger for dig. Det betyder, at vi ikke kan gøre noget som x + + med beslaget type, selvom det er fuldt på højde med markøren type. Markøren type er en variabel. For henvisningstype har vi 2 separate blokke af hukommelsen. Variablen x selv er lagret i stakken og er blot en enkelt pointerjustering, men den store blok af hukommelse er lagret på heapen. Den variable x på stakken bare gemmer adressen af den store blok af hukommelse på heapen. En implikation af dette er med størrelsen af ​​operatøren. Hvis du beder om størrelsen af ​​konsollen array, vil det give dig størrelsen af ​​den store blok af hukommelse, noget lignende 40 bytes, men hvis du beder om størrelsen af ​​pointer type array, det vil give dig størrelsen af ​​den variable x selv, som om apparatet er sandsynligvis kun 4 bytes. Brug markøren array type, er det umuligt at direkte bede om størrelsen af ​​den store blok af hukommelse. Dette er normalt ikke meget af en begrænsning, da vi meget sjældent vil have den størrelse af den store blok af hukommelse, og vi kan som regel beregne det, hvis vi har brug for det. Endelig konsollen arrayet sker for at give os en genvej til initialisering et array. Lad os se, hvordan vi kunne skrive de første 10 lige heltal ved hjælp af genvejen initilization. Med markøren array, er der ikke en måde at gøre en genvej som denne. Dette er blot en introduktion til, hvad du kan gøre med arrays. De dukker op i næsten alle program, du skriver. Forhåbentlig kan du nu se en bedre måde at gøre den studerende id'er eksempel fra begyndelsen af ​​video. Mit navn er Rob Bowden, og dette er CS50.