Avatar billede mcergud Nybegynder
13. januar 2000 - 10:38 Der er 4 kommentarer og
1 løsning

Hjælp pointers(*) og reference(&)

Er der nogle der har nogle link´s eller hjælpe filer til hjælp omkring pointers(*) og reference(&).
Avatar billede dmk Nybegynder
13. januar 2000 - 10:44 #1
Hvad er det du gerne vil vide? Du kan jo prøve at stille dine spørgsmål her, så skal jeg nok prøve at hjælpe dig.

DMK
Avatar billede jinxed Nybegynder
13. januar 2000 - 10:51 #2
Ja, bare spørg løs.
Har du prøvet at kigge i din compilers help fil? (selvom der står nok ikke det store)
Prøv at kigge på http://www.cpp.dk under tutorials
Avatar billede 127144146281 Nybegynder
13. januar 2000 - 11:47 #3
Prøv at se på http://www.codeguru.com der er en del  om C++
Avatar billede mcergud Nybegynder
20. januar 2000 - 10:04 #4
Bare det grund læggene
Avatar billede dmk Nybegynder
20. januar 2000 - 10:39 #5
Øhh okay.

En pointer er en henvisning til et fysisk adresseområde. Som du måske ved, så har du et adresse område der repræsenterer fysisk hukommelse. En adresse er blot et tal, og hver adresse repræsenterer en enkelt byte hukommelse. Det vil sige, at hvis vi putter en streng hvor der står "eksperten" ind på adresse 10.000, så vil det første 'e'(den første byte i vores ord) stå på adresse 10.000, vores 'k' vil stå på adresse 10.001, vores 's' på 10.002 osv.

Du kan så lave en pointer til en adresse, og når du kan så henvise til det data der ligger på denne adresse.
Hvis du laver en integer, som fx:

int StortTal=100;

Så reserverer styresystemet plads til en integer for dig et eller andet sted i computerens hukommelse. En integer fylder (i win32) 4 bytes, så computeren kan tildele dig adresserne 10.000, 10.001, 10.002 og 10.003 til din integer. Når du så sætter din integer lig med værdien 100, betyder det at man computeren kopierer værdien 100 ind på disse 4 bytes. Når du senere i dit program henviser til variablen StortTal, så så vil computeren vide, at du mener den værdi der ligger på disse 4 bytes hukommelse.

Variablen StortTal er derfor blot en henvisning til adressen 10.000, og typen som StortTal er af(integer) fortæller computeren, at der er reserveret 4 bytes til den. Du kan ikke på nogen måde lave om på det, da du ikke direkte kan manipulere hvor en datavariabel ligger i hukommelsen. Du vil ikke selv kunne flytte den til et andet sted i hukommelsen, men du behøver derfor heller ikke selv holde styr på noget.
Hvis du derimod laver en pointer til en integer:
int* StortTalPtr;
Så vil du have en pointer, som du selv kan sætte til at pege på lige præcis det hukommelse du ønsker. En pointer er også blot en variabel, som ligger et sted i hukommelsen, men den kan bruges på en anden måde end en datavariabel. Selve pointeren fylder også (i win32) 4 bytes. Men ideen med en pointer er, at du kan sætte den til at pege på en anden adresse i din hukommelse.
Du kan fx. have lyst til at den skal pege på den samme værdi som variablen StortTal, og det kan du gøre på følgende måde:

StortTalPtr=&StortTal;

'&'-tegnet betyder i c++ "adressen på". Det vil sige, når man laver denne operator på variablen StortTal, som vi jo har værdien 100 og ligger på adresse 10.000-10.003, så returnerer &-operatoren adressen 10.000, og kopierer denne værdi over i StortTalPtr.

Nu kan du tilgå variablen StortTal uden at referere direkte til StortTal-variablen, men ved i stedet at tilgå følgende:

int Tal2=*StortTalPtr;

Det jeg gør her er at lave en ny variabel, som hedder Tal2, og ligger det som StortTalPtr peger på ind på Tal2's dataområde. '*'-tegnet betyder "indholdet af" eller "det som den peger på", og den betyder, at man tilgår den integer, som StortTalPtr peger på. Det vil sige at vi her får kopieret værdien 100 fra adresseområdet 10.000-10.003 over i variablen Tal2.

En reference er ogås en slags pointer, men den tilgåes på samme måde som en almindelig variabel.
Hvis jeg vil ligge en værdi ind på den adresse som en pointer peger på, så skal jeg gøre følgende:

*PtrVariabel=100;

Her fortæller jeg compileren, at jeg vil ligge værdien 100 ind på det dataområde som min pointer peger på. Hvis jeg vil ligge en værdi ind på noget som en reference peger på, så skal jeg ikke gøre andet end hvis det havde været en almindelig variabel:

RefVariabel=100;

References bruges ofte som parameter overførsler, når man gerne vil have at den funktion man overfører parameteren til skal have lov til at ændre på værdien. Hvis vi laver en funktion:

void AddNumbers(int Result, int Value1, int Value2)
{
  Result=Value1+Value2;
}

void main()
{
  int Res, Var1, Var2;
...
  AddNumbers(Res, Var1, Var2);
}

I dette tilfælde vil compilernen, når man kalder funktionen, laver kopier af værdierne af mine tre variabler i main, og kalde funktionen med disse. Det vil sige, at når funktioen er udført, så vil Res variablen stadig have samme værdi som da jeg kaldte funktionen, fordi det er en værdi funktionen har arbejdet på.
Derfor skal funktionen laves som:

void AddNumbers(int &Result, int Value1, int Value2)

Så vil variablen Result være en reference til min variabel Res i main (altså en pointer til Res), og når jeg lægger en ny værdi ind i Result i min funktion, vil Res i main have fået samme værdi.

References bruges også hvis man skal overføre store datamængder som parametre, fordi det jo som sagt blot er en pointer. Hvis vi fx. har følgende datastruktur:

struct Data
{
  int Alder;
  int Hojde;
  char Navn[2000];
  char Kommentar[2000];
};

Hvis jeg overfører denne til en funktion som en almindelig variabel, så vil compileren tage en kopi af min struktur, som altså fylder en hel del (4+4+2000+2000=4008 bytes) og det er ikke særlig effektivt. Det fylder meget i hukommelsen, og det er langsomt fordi en masse hukommelse skal kopieres.
Hvis jeg i stedet overfører den som en reference, så vil den kun fylde en pointer (4 bytes). Så skal man selvfølgelig bare huske, at hvis jeg begynder at overskrive dataene i den i min funktion, så vil de også blive overskrevet i den variabel jeg kaldte funktionen med.


Nogle spørgsmål?

DMK

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester