Avatar billede yates Nybegynder
10. januar 2006 - 15:36 Der er 11 kommentarer

Pointer til pointer

int **X..

... er i mine øjne ikke intuitivt. Jeg vil gerne bede experterne give eksempler på hvornår ** er nyttigt, og hvad alternativerne er. Det er selvfølgelig afhængigt af situation (sådan er det jo altid), så derfor søger jeg både generelle og spcifikke  eksempler samt gode forklaringer. Et link eller to er heller ikke af vejen, men helst ikke til sider der bare beskriver pointere etc. (Dagens tidligere spm. om arrays i funktioner, hvorunder ** blev nævnt, bidrog ikke til min forståelse). 

Mange tusind tak.
Y.
Avatar billede arne_v Ekspert
10. januar 2006 - 15:43 #1
pointer som out argument

dynamisk allokeret array of array
Avatar billede datasource Nybegynder
10. januar 2006 - 16:08 #2
Her er en super artike om pointere, hvor der også står noget om pointere til pointere:
http://udvikleren.dk/article.php?aid=6&techid=1
Avatar billede bertelbrander Novice
10. januar 2006 - 19:26 #3
Et par eksempler:
void Foo(int **x)
{
  *x = new int [10];
}

int main()
{
  int **p = new int *[4];

  for(n = 0; n < 4; n++)
      p[n] = new int [5];

  int *y;
  Foo(&y);

  for(n = 0; n < 4; n++)
      delete [] p[n];
  delete [] p;
  delete [] y;
}

Alternativet må være:
  std::vector<std::vector <int > > My2DVector;
Avatar billede yates Nybegynder
11. januar 2006 - 08:10 #4
Hej alle,
tak fordi I prøvede. Det er stadig helt sort. Arne-V's svar er utvivlsomt velkvalificeret, men mangler nok visse spor af pædagogik. Jeg er ikke på det niveau.
DS-linket hjalp heller ikke. Jeg har mødt muren her, og det er trods alt ikke fordi jeg ikke gider læse.

BB, jeg beklager jeg ikke fik fortalt at jeg kun kan programmere noget i C, ikke C++. Din  kode er trodsalt alligevel nogenlunde læsbar for mig, men jeg forstår ikke princippet bag ** overhovedet. Kunne måske være godt om de enkelt linjer var kommenteret...

X er en pointer til nogle integers.
p er en pointer til en pointer til nogle integers? Eller p er en pointer til en pointer til nogle integer pointers (hvorfor det ene og ikke det andet?)???
Hvorfor ikke "int **p = new int [4]"?
p[n]=new int [5]  => vi sætter det n'te p til at pege på 5 nye integers eller hva??
osv. osv.
Overordnet kommentar ønsket til kodeeksemplet: Vi bruger denne strategi fordi sådan og sådan og alternativet var at gøre dette og dette, men det ville væremere besværligt fordi det og det og blah.

Jeg har som sagt brug for blot at se verdens mest simple eksempel på at ** bruges til noget som ikke -eller blot mere besværligt- kunne have lavet vha alternativerne.

Y.
Avatar billede arne_v Ekspert
11. januar 2006 - 08:13 #5
void Foo(int **x)
{
  *x = new int [10];
}

i C er

void Foo(int **x)
{
  *x = (int*)malloc(10*sizeof(int));
}

og det kan ikke laves anderledes
Avatar billede arne_v Ekspert
11. januar 2006 - 08:15 #6
typedef int *intptr;
...
int **p:
...
p = new intptr[10];
for(int i = 0; i < 10; i++) p[i] = new int[i];

kan heller ikke laves anderledes

(det er så igen C++ men med C er det bare malloc fremfor new)
Avatar billede yates Nybegynder
11. januar 2006 - 08:36 #7
Hej, tak det var så en præcisering af malloc (C) og new (C++).
Jeg ser frem til en forklaring på selve mit problem, nemlig **.

Y.
Avatar billede segmose Nybegynder
11. januar 2006 - 08:53 #8
(utestet exemple)

pointer til pointer bruges når du skal ændre værdien af en pointer
int x = 3; /* x er et tal */
int y = 4; /* et andet tal */

void ChangePointer(int **ppy) {
  *ppy = &y;

  return;
}

int main() {
  int *px = &x; /* px er en pointer til x, x ændres med *px = 7 */

  printf("px peger på %d\n", *px);
  ChangePointer(&px); 
  printf("px peger på %d\n", *px);

  return 0;
}
Avatar billede jpk Nybegynder
11. januar 2006 - 11:30 #9
Hvis du opretter et array med 'new', kommer det til at ligge et sted i hukommelsen (heap'en). Hvis det er et array af int's, kan du henvise (pege på) det med:

int* pIntArray;

Men hvis array'et ikke bare indeholder int's, men også array's af int (hvilket igen 'peges på', bruger man:

int** pIntPointerArray;

Altså, en pointer til et array af pointers.


Håber det hjalp en smule...
Avatar billede bertelbrander Novice
11. januar 2006 - 20:04 #10
Det samme som "10/01-2006 19:26:50" i C:
#include <stdlib.h>

void Foo(int **x)
{
  *x = malloc(10*sizeof(int));
}

int main()
{
  int n;
  int *y;
  int **p = malloc(4*sizeof(int *));

  for(n = 0; n < 4; n++)
      p[n] = malloc(5*sizeof(int));


  Foo(&y);

  for(n = 0; n < 4; n++)
      free(p[n]);
  free(p);
  free(y);
  return 0;
}

I C++ skal man caste returværdien fra malloc
I C er der ikke nogen alternativer.
Avatar billede bertelbrander Novice
11. januar 2006 - 20:08 #11
Hvis du ønsker at have:
void Foo(int i, int j)
{
  int Array[x][y];
 
Er du nødt til at lave Array som en int **, og bruge metoden fra p fra før til at allokere plads.

Hvis du vil have:
void bar(int i)
{
  int Array[10][i];

Kan du lave det som:

void bar(int i)
{
  int *Array[10];
  int x;
  for(x = 0; x < 10; k++)
    Array[x] = malloc(i*sizeof(int));

Her er Array et array af pointere.
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