Pointer (programmering)
En pointer er en datatype inden for programmering af computere, der, meget basalt, er en variabel indeholdende en adresse der peger på et sted i computerens lager. På et højere abstraktionsniveau kan en pointer beskrives som en reference, ikke nødvendigvis en adresse.
En pointer benyttes inden for nogle programmeringssprog, mens andre ikke tillader dem.
En pointer kan pege på en variabel. Denne variabel kan være simpel eller sammensat af flere variable (aggregat). En sammensat variabel kan være en record eller et objekt. En pointer kan også pege på eksekverbar kode, en del af et oversat program. Endelig kan den pege på ingenting, den siges så at have værdien null eller nil.
Ved at ændre adressen lagret i en pointervariabel, kan man få pointeren til at pege på et andet sted i lageret. Dette kaldes pointer aritmetik, og kan f.eks. benyttes til at flytte en pointer så langt frem, at den nu peger på næste element i en [Tabel (datastruktur)|[tabel]]. Normalt vil en programmør ikke skulle regne direkte på adressen i en pointer, men nogle programmeringssprog tillader dette.
Type
[redigér | rediger kildetekst]En pointer peger som nævnt på en adresse. Hvad der ligger på den adresse (og de efterfølgende pladser) er ikke direkte angivet. For at undgå forvirring og fejl vil mange programmeringssprog kontrollere typen på pointeren. En variabel, der er udpeget med en pointer til f.eks. et heltal, kan ikke tildeles adressen på en tekststreng. Hvis man ved, hvad man gør, kan man oftest typecaste pointeren, så man faktisk kan bryde reglerne.
Allokering
[redigér | rediger kildetekst]Heap
[redigér | rediger kildetekst]De variable, som pointerne skal pege på, skaffes normalt fra heap'en, et område af lageret tildelt programmet, hvor dynamiske variable placeres. Programmøren administrerer ikke selv heap'en, men anmoder om en allokering af et stykke lager af en angivet størrelse.
Under andre systemer placerer man som programmør selv sine variable på et reserveret dataareal. Her kan man placere dem efter hinanden eller oven i hinanden, alt efter, hvilken datastruktur man vil benytte. Det kan ske i sprog som PL/I på mainframe.
Anvendelse
[redigér | rediger kildetekst]Parameteroverførsel
[redigér | rediger kildetekst][Data (datalogi)|[Data]] der skal overføres til en funktion/procedure kan overføres på flere måder. Jeg omtales kun to af dem. De kan overføres by value, hvor der sker en kopiering af data, så funktionen får sin egen kopi. Ændringer af disse data afspejles ikke uden for funktionen. Eller de kan overføres by reference, dvs. der overføres en pointer, der peger på data. Man sparer herved en kopiering af data, og det er også muligt at ændre data uden for funktionen, da data jo kun ligger ét sted.
Kædede variable
[redigér | rediger kildetekst]Hvis man vil benytte en datastruktur med et variabelt antal elementer, kan man starte med en pointer til roden, og den vil naturligvis pege på nil. Dataelementerne kan være sammensatte variable bestående af f.eks. et navn (en tekststreng) og en pointer kaldet næste (next). Man kan således tilføje elementer ved at starte i roden og bevæge sig ud af listen til man finder en nil-pointer, allokere en ny variabel, sætte nilpointeren på den variabel, man står på, til adressen på den nye variabel og sætte den nye variabels næste-pointer til nil. Ligeledes kan man indsætte nye variable midt i kæden og slette variable, blot man retter pointerne, så det hele hænger sammen.
Man kan have en dobbeltkædet liste, hvor hver variabel har en næste-pointer og en forrige-pointer, hvis det fungerer bedre for opgaven[1].
Datalogiske træer er også en mulighed, hvor man kan have en up-pointer og en til venstre gren og en anden til højre gren (ved et binært træ, andre er også mulige).
Pointere til eksekverbar kode
[redigér | rediger kildetekst]Da en pointer basalt set peger på en adresse i lageret, så kan den også pege på eksekverbar programkode. Det bruges bl.a. i objektorienteret programmering, hvor den programkode, der er knyttet til en klasse (metoder), findes et sted og adresseres via en tabel med pointere, hvorimod data (attributter) findes for hvert objekt, udpeget med (mindst) en pointer for hvert objekt.
Deallokering
[redigér | rediger kildetekst]Når en variabel ikke længere skal bruges, bør den frigives, så den ikke fylder lageret unødigt op, og så pladsen kan bruges til andre variabel. Det gøres i mange systemer ved at deallokere variablen.
Problemer ved pointere
[redigér | rediger kildetekst]Brug af pointere giver flere muligheder for problemer. 1) En pointer kan være uinitialiseret, når programmet forsøger at læse eller skrive til en variabel. Programmet vil så få en meget tilfældig værdi retur eller opdatere et tilfældigt sted i lageret. Hvis dette tilfældige sted bruges til andre variable, har man introduceret en fejl, der kan vise sig ganske uventet på et senere tidspunkt.
2) En variabel, hvor flere pointere peger på, kan blive deallokeret, selv om der stadig er en pointer og dermed en del af programmet, der peger på denne variabel. Igen er resultatet vanskeligt at forudse, da lageret jo kan være brugt til andre formål og derfor er ændret.
Dette samles under betegnelsen dangling pointers.
3) En variabel bliver ikke deallokeret, selv om der nu ikke længere er en pointer, der peger på den. Den slags betyder, at lageret ikke bliver frigivet, så det kan genbruges. Resultatet er, at programmets lagerforbrug vokser over tid og kaldes memory leak.
4) En pointer kan benyttes til at skaffe sig adgang til data, som programmøren ikke bør have adgang til.
På nogle maskiner vil en pointer, der peger ud i intetheden eller ud over det tildelte lager, generere en fejl (fault), som kan fanges af operativsystemet.
Garbage collection
[redigér | rediger kildetekst]En metode til at mindske problemet med deallokering er garbage collection. Her fritages programmøren for at holde styr på, hvilke variable/objekter, der ikke bruges længere og dermed kan deallokeres, og hvilke, der stadig er i brug. Systemet holder så øje med eller undersøger, hvilke variable, der ikke referes, direkte og indirekte, og frigiver dem ved at gennemløb af dem alle med passende mellemrum. Denne oprydning kan hæmme computerens ydeevne, så længe den kører.
Eksterne henvisninger
[redigér | rediger kildetekst]- ^ Tenenbaum, Aaron M.; Augenstein, Moshe J. (1986), Data Structures using Pascal (2 udgave), Prentice-Hall, s. 646-667, ISBN 0-13-196684-7
- MacLennan, Bruce J., Principles of Programming Languages (2 udgave), Holt, Rinehart and Winston, s. 200-202, ISBN 0-03-021999-X
- Tanenbaum, Andrew S. (1984), Structured Computer Organization (2 udgave), Prentice/Hall, s. 215-217, ISBN 0-13-854605-3
- Hahn, Rainer (1981), Höhere Programmiersprachen im Vergleich, Wiesbaden: Akademische Verlagsgesellschaft Wiesbaden, s. 240-253, ISBN 3-400-00433-2, ISSN 0172-2239