English

Pekare / Referenser

Pekare, referens och adress... Kärt barn har många namn. Det pekaren pekar på, referensen refererar till och adressen lokaliserar är helt enkelt en plats i datorns minne. En minnescell. Man kan se minnet i datorn som en gigantisk array av bytes, och adressen är då helt enkelt indexet i arrayen. Det finns många skäl till att man som programmerare bör känna till pekare och ha någorlunda koll på hur de fungerar och framför allt hur de inte fungerar, även om man endast jobbar i högnivåspråk som av en eller annan anledning påstår att de inte har några pekare.

Allt data som vi hanterar i våra program kommer att ligga någonstans i datorns minne. Denna plats i minnet kommer att ha en adress som pekar ut just den minnescell där datat ligger. Om vi någonstans i vårt program skapar ett objekt kanske detta råkar hamna på minnesposition 400. När vi lite senare vill komma åt detta objekt så måste datorn veta var i minnet det ligger - vilken adress det ligger på. Adressen fick vi från datorn när vi skapade objektet (det fungerar så i många programmeringsspråk), och eftersom vi var förutseende så sparade vi den i en pekare. Pekaren, som alltså är en helt vanlig variabel, innehåller siffran 400 - objektets adress.

Pekare i Java

Programmeringsspråket Java är tänkt att vara ett högnivåspråk. Man brukar säga att det inte finns några pekare i Java och man ska inte behöva veta något om pekare eller andra detaljer för att kunna använda språket. Dock märker man ganska snabbt att det krävs en viss förståelse för pekare om man vill skriva större program, och tittar man lite under ytan så ser man att Java är fullt av pekare. Precis allting är pekare - fast man kallar dem för referenser istället.

I Java kallas pekare oftast för referenser, men de är inget annat än vanliga adresser där heller. När man i Java skriver String ord; så har man skapat en referensvariabel. Detta är en variabel som senare kan innehålla en adress till ett strängobjekt. Än så länge så är den dock tom, vi har inte skapat något objekt ännu. För att skapa objekt i Java använder man kommandot new och det är först när vi skriver new String("Hej"); som vi faktiskt skapar strängobjektet. Kommandot new returnerar adressen till det nya objektet, om vi vill ha kvar den måste vi alltså spara den i en referensvariabel. ord = new String("Hej") är alltså det vi vill skriva.

Vi kan nu skicka ord som argument till metoder som vill hantera strängen. Det är nu vi kan se själva poängen med referenserna. Det argument som skickas till metoden är alltså bara en adress till objektet, inte hela objektet. Detta spar både tid och plats eftersom en adress är mycket mindre än ett objekt. Att förstå skillnaden mellan referenser och objekt är ett av de första svåra stegen när man lär sig Java.

Pekare i C

Pekare i Java är ändå ganska snälla. Man kan inte göra särskillt mycket med dem, och man behöver aldrig använda dem till annat än att just referera till objekt med. Ett annat språk där pekare är betydligt mer mångsidiga och därför mycket svårare att hantera är C.

Om vi i C skulle deklarera strängen "Hej" så skulle det kunna göras med char *ord = "Hej";. ord är nu en pekare till den plats i minnet där "Hej" allokerats (på stacken) och precis som i Java kan vi skicka ord som argument till en funktion.

I C är adressen bara är ett tal, som vilket annat tal som helst, och man kan därför utföra allehanda aritmetiska operationer på dem. ord pekar sedan tidigare på "Hej". Skulle vi utföra en helt vanlig addition på adressen och lägga till ett (ord++;) så har vi alltså stegat fram adressen till nästa minnescell.

En annan sak som gör att det är lite krångligare i C än exempelvis Java, är att allt inte nödvändigtvis är pekare. Det är därför viktigt att man tänker sig för när man skickar agrument till funktioner i C. Om man gör fel är det nämligen inte bara adressen som skickas utan hela objektet, vilket, som vi sagt tidigare, tar onödig plats och tid. Skulle vi deklarera en variabel struct string mening; så är mening inte en pekare, utan själva objektet. Vill vi ha en pekare till mening så måste vi ta ut adressen med &mening. & och * är två viktiga operatorer när det handlar om pekare. Mycket magi kan blandas till med dessa, men i grunden är de enkla att förstå. * använder man om man har en adress och vill ha ut det som ligger på den adressen (man följer en pekare). & använder man om man har ett objekt och vill ha dess adress.

Pekare och referenser förekommer i nästan alla program. Vill man inte veta så mycket om dem så väljer man att programmera i ett högnivåspråk, tycker man att de verkar trevliga så kan man mycket väl experimentera med dem i C eller något annat lågnivåspråk.