Avatar billede kube Nybegynder
02. november 2002 - 11:24 Der er 10 kommentarer og
3 løsninger

pointer - hvorfor det?

hej Eksperter,
jeg er forholdsvis ny inden for c. Jeg forstår ikke rigtig fordelen(e) ved pointere - altså hvorfor man pointer til en variable i stedet for bare give give variablen den samme værdi.
b=25;
a=b; //værdi en 25
a=&b; //adressen på b
Kan nogle give ekspempler på hvornår det er smart og hvorfor?
mvh kube
Avatar billede speedy Nybegynder
02. november 2002 - 11:28 #1
Måske er det ikke så anvendeligt på en lille variabel som i dit eksempel. Men forestil dig du har et stort objekt som fylder meget i hukommelsen (eksempelvis en stor bitmap). Hvis du så putter den i en anden variabel har du den ligepludselig 2 gange i hukommelsen og dermed kan man hurtigt løbe tør for RAM hvis man ikke passer på.

Nu kender jeg ikke så meget til C/C++ men i Delphi fylder en pointer 4 bytes hvor f.eks. en stor bitmap nemt kan fylde 2MB

Der er sikkert også andre fordele som jeg ikke lige kan komme på nu ;)

/SpEeDy
Avatar billede kube Nybegynder
02. november 2002 - 11:32 #2
jeg kan godt se det når det gælder lagring af så store størelser - den havde jeg ikke tænkt på! for en int fylder jo ikke så meget...nogen andre der har fordele?
Avatar billede speedy Nybegynder
02. november 2002 - 11:44 #3
en ting mere..hvis man kigger på dit eksempel her:

b=25;
a=b; //værdi en 25
b=26;

Så hvis du ændrer på b så vil a stadig være 25 ligemeget hvad du gør ved b. I dette tilfælde er a nu stadig 25 mens b er 26.

b=25;
a=&b; //adressen på b
b=26;

Hvis du ændrer b herefter, så peger a jo hele tiden på b og dermed peger a på det nye tal. Så peger a nu på 26 i stedet for 25.

Om det er en fordel afhænger jo meget af hvad man skal bruge det til.

Håber det har hjulpet lidt

/SpEeDy
Avatar billede arne_v Ekspert
02. november 2002 - 11:56 #4
Brug af pointere er nødvendigt i mange
tilfælde.

F.eks. dynamisk allokering:
  int *a;
  a = (int *)malloc(n);
som skal laves med pointere.

Der er også en tradition i C verdenen for at bruge
pointer manipulation i.s.f. array indexing. Eksempel:

int countspace(char s[])
{
  int i;
  int n = 0;
  for(int i=0; i < strlen(s); i++) {
      if(s[i]==' ') n++;
  }
  return n;
}

versus:

int countspace(char *s)
{
  char *p;
  int n = 0;
  p=s;
  while(*p) {
      if(*p==' ') n++;
  }
  return n;
}

hvor det altså er tradition for noget
ligesom det sidste.
Avatar billede soreno Praktikant
02. november 2002 - 11:57 #5
du kan også udføre operationer på pointere.

eks. hvis du vil vide hvor lang et char array er (\0 termineret) kunne du gøre sådan:

    char test[] = "hello world"; //pointeren peger på første char i array'et..
    int count = 0;

    while(*text) //sålænge værdien af text ikke er \0
    {
        count++; //tæl antal tegn op
        text++; //tæl pointeren én op - så er vi klar til næste char i array'et
    }
    printf("der var %i tegn i [%s]\n", count, test);

iøvrigt er der en del gode indlæg hist og pist her på eksperten der forklarer pointere og deres brug. prøv at søge på "pointer" i c/c++ kategorien.
Avatar billede soreno Praktikant
02. november 2002 - 11:58 #6
..while(*test)..
Avatar billede tosssen Nybegynder
02. november 2002 - 11:59 #7
Grunden til det er smart er at med pointere kan ændre værdien af en variabel i en funktion med en anden funktion.

Hvis du fx har variablen a i din main funktion og du med en anden funktion Change_a vil ændre værdien af a, kan det kun lade sig gøre hvis du i stedet for variablen a, sender a's adresse til Change_a

Det skyldes at variable i funktioner slettes når funktionen afsluttes. Det vil sige at hvis du inde i Change_a erklærer en variabel a, så er det ikke den samme som i din main funktion.

Pointere tvinger således funktioner til at bruge de rigtige variable i stedet for nogle midlertidige, der kun eksisterer så længe funktionerne kører
Avatar billede tosssen Nybegynder
02. november 2002 - 12:01 #8
Det var kun den halve sandhed. Man kan nemlig bruge references i stedet for pointere til ovennævnte problem. References eksisterer dog så vidt jeg ved ikke i C, men kun i C++
Avatar billede tosssen Nybegynder
02. november 2002 - 12:02 #9
I C++ er fordelen ved pointere det som soreno har beskrevet, men i C kan fordelene udvides til min problemstilling
Avatar billede soreno Praktikant
02. november 2002 - 12:03 #10
tossen>>
lige for at supplere,
du kan også returnere en ny variabel fra din funktion. men så har du jo et problem hvis du gerne vil returnere flere værdier..
Avatar billede kube Nybegynder
02. november 2002 - 12:04 #11
tak gode - gode forklaringer der har hjulpet mig videre..
Avatar billede tosssen Nybegynder
02. november 2002 - 12:06 #12
soreno>> Fuldstændig rigtigt ;-) Det var den 'pointe' jeg glemte at skrive...
Avatar billede kube Nybegynder
02. november 2002 - 19:15 #13
okay -> så er det bare at forsætte med koden...
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