Avatar billede bumle90 Nybegynder
26. maj 2003 - 16:24 Der er 23 kommentarer og
1 løsning

Hjælp til pointere

Jeg forstår ikke hvad jeg gør galt i følgende kode hvor jeg vil bytte om på 2 pointere, så de kommer til at pege på det den anden pegede på før og omvendt


#include <stdio.h>

void swap(int *pp,int *pa);
    int main()
    {
    int *a,*p,v,f;
   
    f=4;
    v=3;
   
    p=&v;
    a=&f;
   
   
    printf("P vaerdi : %i \nP addresse : %i \nA vaerdi : %i \nA addresse : %i \n",*p,p,*a,a);
   
    swap(&p,&a);
   
    printf("P vaerdi : %i \nP addresse : %i \nA vaerdi : %i \nA addresse : %i \n",*p,p,*a,a);
    return 0;
    }

    void swap(int *pp,int *pa)
    {
    int temp;
    temp=*pp;
    *pp=*pa;
    *pa=temp;
    }
Avatar billede tosssen Nybegynder
26. maj 2003 - 16:27 #1
hvad med

int* temp
Avatar billede tosssen Nybegynder
26. maj 2003 - 16:28 #2
Det gør at temp bliver af typen pointer til int i stedet for at være af typen int
Avatar billede tosssen Nybegynder
26. maj 2003 - 16:29 #3
void swap(int* pp, int* pa)
{
  int* temp:
  temp=pp;
  pp=pa;
  pa=temp;
}
Avatar billede tosssen Nybegynder
26. maj 2003 - 16:30 #4
Der skal selvfølgelig være et semikolon efter temp i stedet for min tastefejl
Avatar billede chries Nybegynder
26. maj 2003 - 16:37 #5
du skal returner værdien.. enten ved reference eller pointer

void swap(int** pp, int** pa)
{
  int* temp = 0:
  temp=*pp;
  *pp=*pa;
  *pa=temp;
}
Avatar billede bumle90 Nybegynder
26. maj 2003 - 16:38 #6
Så gir det da ik nogen mening ?
Hvis temp skal være en pointer...Det skal da bare være en variabel der midlertidigt indeholder en værdi
Avatar billede bumle90 Nybegynder
26. maj 2003 - 16:38 #7
Hvad er en int** ?
Avatar billede bumle90 Nybegynder
26. maj 2003 - 16:40 #8
E:\rodeDir\eksametest\filen.cpp(17) : error C2664: 'swap' : cannot convert parameter 1 from 'int ** ' to 'int *'
        Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast


siger den
Avatar billede chries Nybegynder
26. maj 2003 - 16:44 #9
du skal huske at opdatere din forward elklæring:

void swap(int **pp,int **pa);

og det er en pointer til en pointer der peger på en "int". Det er så du kan modificere værdien.

ved:
void swap(int* pp, int* pa)

ville du i funktionen have en kopi der har samme værdi som den pointer uden for (i main), men en ændring i funktion ændrer ikke pointeren i main.
Avatar billede bumle90 Nybegynder
26. maj 2003 - 16:47 #10
Hvordan opdaterer man sin forward erklæring ?
Avatar billede chries Nybegynder
26. maj 2003 - 16:48 #11
det her virker i visual studio c++

#include <stdio.h>

//using namespace std;

void swap(int** pp, int** pa)
{
  int* temp = 0;
  temp=*pp;
  *pp=*pa;
  *pa=temp;
}

int main()
{
    int *a,*p,v,f;
   
    f=4;
    v=3;
   
    p=&v;
    a=&f;
   
   
    printf("P vaerdi : %i \nP addresse : %i \nA vaerdi : %i \nA addresse : %i \n",*p,p,*a,a);
   
    swap(&p,&a);
   
    printf("P vaerdi : %i \nP addresse : %i \nA vaerdi : %i \nA addresse : %i \n",*p,p,*a,a);
    return 0;
}
Avatar billede bumle90 Nybegynder
26. maj 2003 - 16:57 #12
ja oki...nu virker det...tak skal du have....Hvad sker der så helt præcist i det program nu hvor du bruger ** istedet for *

Jeg er i gang med at lære pointere...og vil gerne kunne det sådan helt til bunds nemlig....Ville være taknemmelig hvis du lige gad forklare programmet...
Avatar billede bumle90 Nybegynder
26. maj 2003 - 17:02 #13
Altså fx. variablen **pp peger den så på p eller peger den på a ?
Avatar billede tosssen Nybegynder
26. maj 2003 - 17:03 #14
Jep - mit forslag var forkert! Man er naturligvis nødt til at bruge pointere til de to pointere for at kunne ændre permanent på dem ;-)
Avatar billede tosssen Nybegynder
26. maj 2003 - 17:06 #15
**pp peger på p, som peger på v
Avatar billede bumle90 Nybegynder
26. maj 2003 - 17:09 #16
Men hvis **pp peger på p så forstår jeg det ik helt....Hvad ville *pp så pege på ?
Avatar billede tosssen Nybegynder
26. maj 2003 - 17:15 #17
int** peger på en pointer til en int
int* peger på en int
Avatar billede tosssen Nybegynder
26. maj 2003 - 17:17 #18
Da det er en "pointer til en int" du skal ændre skal du altså bruge en pointer til en "pointer til en int"
Avatar billede chries Nybegynder
26. maj 2003 - 17:33 #19
Jeg er skod til at forklare det, men jeg prøver lige :)

en parameter først, der kun sendes over som enkelt pointer.
void func( int* w )
{
}

void main
{
  int e = 3; // ligger på addresse 0x100
  int *pE = &e; // pE's addresse er 0x200, pE's værdi er nu 0x100 og *pE er 3
  func( pE );

ville i func, *w være 3 og w's værdi være 0x100.

hvis du så skriver w = 0x200, ville pE ikke bliver 0x300 da w er en lokal værdi, der i kladet får samme værdi som pE. For at pE ændrer sig, skal du sende en pointer med til den:



dobbelt pointer:
void func( int** w )
{
}

void main
{

  int e = 3; // ligger på addresse 0x100
  int *pE = &e; // pE's addresse er 0x200, pE's værdi er nu 0x100 og *pE er 3
  func( &pE );

ville w's værdi være addressen på pE (0x200) og *w være værdien af pE og **w værdien af det pE peger på (3).
Når du så skirver *w = 0x400, ændrer du faktisk i pE's værdi, dvs det sted den peger hen på.
Avatar billede chries Nybegynder
26. maj 2003 - 17:40 #20
rettelse
...
hvis du så skriver w = 0x300, ville pE ikke bliver 0x300
...
Avatar billede chries Nybegynder
26. maj 2003 - 17:41 #21
og det er "kaldet" og ikke "kladet"
Avatar billede bumle90 Nybegynder
26. maj 2003 - 17:58 #22
ahhh ja oki...jeg er med tror jeg :)
Tusind tak skal du have for hjælpen...
Avatar billede bumle90 Nybegynder
26. maj 2003 - 18:33 #23
lige et sidste  spg...

Kan man så også godt lave ***pp og ****pp osv. ?
Avatar billede arne_v Ekspert
27. maj 2003 - 04:17 #24
Ja.

Men jeg har aldrig set dem brugt.
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