Kurt Nørmark
Institut for Datalogi, Aalborg Universitet
| Sammendrag Forrige lektion Næste lektion Stikord Referencer Indhold | I denne lektion studerer vi pointere og arrays. Vi ser først på pointere. Dernæst ser vi på arrays som pointere. Efter dette kommer vi til arrays af flere dimensioner. Vi slutter af med sondringen mellem statisk og dynamisk lagerallokering. |
| Introduktion til arrays |
| Arrays i C - motivation og introduktion Slide Indhold Stikord Referencer |
|
| Program: Motivation for arrays - et stort antal simple variable. |
|
| Program: Introduktion af arrays. |
|
| Program: Eksplicit array initialisering - kun i erklæringer. |
|
| Program: En variant af eksplicit array initialisering. |
|
| Generelle egenskaber af arrays Slide Indhold Stikord Referencer |
|
| Figur. Et array med 11 elementer indiceret fra 0 til 10 | ![]() |
|
|
| Arrays i C - begrænsninger Slide Indhold Stikord Referencer |
|
|
| Program: Illustration af at arrays ikke kan assignes til hinanden. |
|
| Program: Illustration af at et array ikke kan overføres som en værdiparameter. |
|
| Program: Program output. |
|
| Program: Et array der overføres som input parameter - compilerer ikke. |
|
| Program: Illustration af at arrays ikke umiddelbart kan returneres fra en funktion. |
|
| Program: Program output. |
|
| Program: Illustration af at arrays kan returneres fra en funktion - med et lille trick. |
|
| Program: Program output. |
|
| Pointers |
| Introduktion til pointere Slide Indhold Stikord Referencer |
|
| Figur. En illustration af to pointer variable. pvar indeholder en pointer til en integer, som peger på adressen af var. pobj indeholder en anden pointer, der peger på et objekt obj1,som ikke er indeholdt i nogen variabel. Fra obj1 peges der på et andet objekt obj2, som 'cyklisk' peger tilbage på obj1. | ![]() |
|
| Pointer variable Slide Indhold Stikord Referencer |
|
| Program: Erklæring og initialisering af et antal variable, hvoraf nogle er pointer variable. |
|
| Figur. Situationen før de to assignments | ![]() |
| Program: Erklæring og initialisering af et antal variable, hvoraf nogle er pointer variable. |
|
| Figur. Grafisk illustration af variablene i, j, c og deres tilsvarende pointervariable. Læg mærke til værdien af ptr_i, som er sat til at pege på samme værdi som ptr_j, altså variablen j. | ![]() |
| Program: Hele programmet inklusive udskrivning af variablenes værdier. |
|
| Program: Output fra programmet. |
|
| Addresse og dereferencing operatorerne Slide Indhold Stikord Referencer |
|
|
| Program: Fremhævelse af adresse og dereferencing udtryk programmet fra forrige side. |
|
|
|
| Pointer eksempler - en opgave Slide Indhold Stikord Referencer |
| Program: The variables i, j, p, q, r, and x. |
|
| Tabel. |
|
|
| Opgave 6.2. En pointer øvelse | På den tilknyttede slide finder du nogle erklæringer af double og int variable, herunder pointere til sådanne. Du finder også en tabel med udtryk, både med og uden parenteser som afklarer operator-prioriteringerne. Beregn værdierne af alle de udtryk, som giver mening. Check dine resultater ved at indføre udtrykkene i et lille C program. |
| Pointer typer i C Slide Indhold Stikord Referencer |
|
| Program: Illustration af pointervariable af forskellige typer - giver compileringsfejl. |
|
| Program: Et lignende program - kan oversættes og køres. |
|
| Program: Program output. |
|
|
| Call by reference parametre |
| Call by reference parametre Slide Indhold Stikord Referencer |
|
| Program: Et forsøg på ombytning af to variables værdi uden pointere - virker ikke. |
|
| Program: Program output. |
|
| Program: En funktion der ombytter værdierne af to int variable. |
|
| Program: Funktionen swap og et hovedprogram, som kalder swap på to variable. |
|
| Program: Program output. |
|
|
| Pointers og arrays |
| Pointers og arrays (1) Slide Indhold Stikord Referencer |
|
| Figur. Et array med fem elementer og en pointer til første element | ![]() |
| Program: Illustration af pointertilgang til arrays. |
|
| Billedserie: Forskellige opdateringer af table ved brug af pointere | Forskellige opdateringer af table ved brug af pointere |
| Billed nr. 1. ptr_table peger på elementet med index 0 i table | ![]() |
| Billed nr. 2. *ptr_table refererer til indholdet i table[0]. Denne celles indehold ændres til 7.0. | ![]() |
| Billed nr. 3. ptr_table flyttes én plads til højre. Indholdet af denne celle bliver indholdet af cellen table[0] * 5. | ![]() |
| Billed nr. 4. ptr_table flyttes tre positioner længere til højre. Indholdet af den pågældende celle tælles én op. | ![]() |
| Billed nr. 5. Indekset af den sidste celle (4) og indexet af table[0] (0) trækkes fra hinanden og tallet skrives ud. | ![]() |
| Program: Et komplet C program, som illustrerer opdateringerne af table. |
|
| Program: Program output. |
|
| Pointers og arrays (2) Slide Indhold Stikord Referencer |
|
| Program: Et simpelt program med arrays - fra starten af lektionen - med subscripting. |
|
| Program: Et tilsvarende program - med pointer tilgang til elementerne. Med rødt og blåt har vi fremhævet de aspekter, som svarer til detaljerne med samme farver i det
oprindelige array program: De røde erklæringer af tabellen, og de blå tilgange til array elementerne.
Med brunt ser vi et udtryk som udgør betingelsen for afslutningen af forløkkerne. Med lilla ser
vi en 'optælling' af pointeren. Denne form for pointeraritmetik diskuterer vi lidt senere i materialet. |
|
| Program: Output fra programmerne. |
|
|
| Pointers og arrays (3) Slide Indhold Stikord Referencer |
|
| Program: Illustration af pointertilgang til arrays. |
|
|
|
| Pointeraritmetik Slide Indhold Stikord Referencer |
| Program: Erklæring af to pointere p og q samt en int i. |
|
|
| Program: En funktion som tæller antallet af tegn i en streng. |
|
| Program: Hele programmet. |
|
| Program: Output fra programmet. |
|
| Index out of bounds Slide Indhold Stikord Referencer |
|
| Program: Et eksempel på indicering uden for indeksgrænserne i et array. |
|
| Program: Hele programmet. |
|
| Program: Muligt program output. |
|
|
| Eksempel: Bubble sort Slide Indhold Stikord Referencer |
|
| Program: Function bubble_sort som laver 'bubble sort' på arrayet a som har n heltalselementer. |
|
| Program: Hele 'bubble sort' programmet - med løbende udskrift af arrayet. |
|
| Program: Output fra bubble sort programmet. |
|
| Billedserie: Illustration af de forskellige faser i boblesorteringen | Illustration af de forskellige faser i boblesorteringen |
| Billed nr. 1. Det usorterede array | ![]() |
| Billed nr. 2. Tallet -77 er, som det 'letteste' tal, boblet op foroven gennem en række ombytninger | ![]() |
| Billed nr. 3. Tallet -5 er, som det 'letteste' resterende tal, boblet op foroven gennem en række ombytninger | ![]() |
| Billed nr. 4. Tallet 7 er, som det 'letteste' tal, boblet op. Bemærk at de øverste tre tal - de røde - nu er sorteret. | ![]() |
| Billed nr. 5. Mønstret fortsætter, nu med 3 som bobleren. Nu er de øverste fire tal røde og sorteret. | ![]() |
| Billed nr. 6. Det næste 3 tal bringes på plads. Bemærk at vi reelt er færdige på dette tidspunkt. | ![]() |
| Billed nr. 7. Den yderste forløkke fortsætter, men den indre foretager ikke flere ombytninger. | ![]() |
| Billed nr. 8. Stadig samme situation. | ![]() |
| Billed nr. 9. Slutbilledet. De røde tal er sorteret, og det sorte tal er større end dem alle. | ![]() |
|
| Brug af qsort fra standard biblioteket Slide Indhold Stikord Referencer |
|
| Program: Anvendelse af qsort til sortering af et heltals array. |
|
| Program: En variant af anvendelse af qsort - med int_compare funktion. |
|
| Program: Output af programmerne. |
|
|
| Array input og output parametre Slide Indhold Stikord Referencer |
|
|
|
| Arrays af flere dimensioner |
| Arrays af to dimensioner Slide Indhold Stikord Referencer |
|
| Figur. Illustrationer af et to dimensionelt array. Øverst til venstre illustreres forståelse af de to dimensioner, med to rækker og tre søjler. Vi kunne naturligvis lige så godt have byttet om på rækker og søjler. Nederst til venstre ses en forståelse der understreger at a er et array med to elementer, som begge er arrays af tre elementer. Længst til højre ses den maskinnære forståelse, 'row major' ordningen. | ![]() |
|
| Gennemløb af arrays med to dimensioner Slide Indhold Stikord Referencer |
|
| Program: Erklæring, initialisering og to identiske gennemløb af et to dimensionelt array. |
|
| Program: De viste gennemløb i et helt C program. |
|
| Program: Program output. |
|
| Program: En variation der afslører rækkenfølgen hvorefter elementerne besøges. |
|
| Program: Program output. |
|
| Program: Endnu en variation. |
|
| Program: Program output. |
|
|
| Statisk og dynamisk lagerallokering |
| Statisk lagerallokering Slide Indhold Stikord Referencer |
| Begrebet statisk lagerallokering: Med statisk lagerallokering afsættes lagerplads implicit når den omkringliggende blok aktiveres. Lagerplads frigives implicit når blokken forlades. |
| Program: Illustration af statisk lagerallokering i C. |
|
|
| Dynamisk lagerallokering (1) Slide Indhold Stikord Referencer |
|
| Begrebet dynamisk lagerallokering: Med dynamisk lagerallokering afsættes lagerplads eksplicit, når programmet har behov for det. |
| Program: Et kreativt forsøg på dynamisk allokering - ikke ANSI C. |
|
| Program: ANSI C Oversættelse af programmet. |
|
| Program: Et program der foretager dynamisk allokering af et array - calloc. |
|
| Program: Et program der foretager dynamisk allokering af et array - malloc. |
|
| Program: Et program der dynamisk allokerer et to-dimensionelt array. |
|
| Program: Output fra programmet. |
|
|
| Dynamisk lagerallokering (2) Slide Indhold Stikord Referencer |
|
|
| Dynamisk allokering af PPM billeder Slide Indhold Stikord Referencer |
|
| Figur. The organization of the memory allocated for a PPM image | ![]() |
| Program: Funktionen der allokerer plads til et PPM billede. |
|
| Program: Eksempel på en funktion der tilgår pixels i et PPM billede. |
|
|
| Opgaver Slide Indhold Stikord Referencer |
| Opgave 6.3. Polynomier | I denne opgave vil vi repræsentere et polynomium p af grad n som et array af koeficienter a0, ..., an, hver af typen double, p(x) = a0 + a1 x + a2 x2 + ... + an xn hvor an er forskellig fra nul. Skriv et C program som indlæser et polynomium af grad højst 8, og som kan beregne polynomiets værdi for forskellige x værdier. Opdel din problemløsning i delproblemer, get_polynomium, som indlæser et polynomium i et array, og eval_polynomium, som beregner polynomiets værdi for en given x værdi: void get_polynomium(double coeff[], int* degreep); double eval_polynomium(const double coeff[], int degree, double x); Denne opgave svarer til opgave 14 side 464 i 6. udgave af lærebogen |
| Samlede referencer Indhold Stikord |
|
Kapitel 6: Pointers og Arrays
Kursets hjemmeside Forfatteren's hjemmeside Om frembringelsen af disse sider Forrige lektion (top) Næste lektion (top) Forrige lektion (bund) Næste lektion (bund)
Genereret: 6. november 2012, 16:27:34