PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Pointerarray



awehrm
31-03-2006, 13:33
Ich habe mich heute ein bisschen mit meinem Prof gestritten.
Es ging darum:
Ich möchte ein Pointer Array mit 10 Elementen.
Soll heissen in dem Array soll ich 10 Pointer speichern können.
Allerdings Pointer auf ein einzelnes Int und nicht
Pointer auf ein Array!

Nun ist meine Frage:
Was bewirkt dieser Code?



int *ptr[10];


Habe ich jetzt tatsächlich ein Pointer Array mit 10 Elementen oder habe ich
eine Pointer VARIABLE die auf ein Int-Array mit 10 Elementen zeigt?

Mein Prof. sagte dann, wenn ich tatsächlich 10 Pointer auf einzelne Ints speichern will
müsste ich das Array folgendermaßen deklarieren:



int **ptr[10];


Was ist nun richtig?

Boron
31-03-2006, 13:48
int* ptr[10] ist richtig, weil das aussagt, dass du ein Array mit dem Namen ptr hast, das 10 Elemente vom Typ int* speichert (also "Zeiger auf int").

Wenn du int** ptr[10] schrieben würdest, dann wäre das ein Array, das 10 Elemente von Typ int** speichert.
Und int** ist ja ein Zeiger auf einen Zeiger auf int (entspricht Zeiger auf ein Array von int).

awehrm
31-03-2006, 13:56
Das habe ich mir auch gedacht, allerdings habe ich mal ein kleines Experiment gemacht...

awehrm
31-03-2006, 14:16
...und zwar hab ich folgenden Code ausprobiert:



int *ptr[10];
int **p[10];

printf("\n%i\n",sizeof(ptr));
printf("\n%i\n",sizeof(p));



Nun lautet die erste Ausgabe 4 und die Zweite 40.
Müsste aber die Speicherbelegung des ersten Arrays (von dem wir vermuten dass es eins ist)
nicht auch die erwarteten 40 Bytes ergeben??

Boron
31-03-2006, 15:14
Im Anhang habe ich mal grafisch dargestellt, was so Sache ist.

Die "Größe" eines Kästchens ist 4Byte, weil ein int 4Byte hat.

Und mein gcc spuckt bei deinem kurzen Testprogramm ein 40 40 aus.
So wie es sein soll. Also 40 Bytes sowohl für ptr als auch p.

[edit]
Hoppla. Grad sehe ich, dass mein pdf anstelle fünf Elemente in ptr2 und ptr3 sechs Elemente trägt. Das ist Mist! Einfach vorstellen, da seien nur fünf Kästchen neben den geschweiften Klammern ;).

awehrm
31-03-2006, 18:47
Das verstehe ich nicht ganz.
Bei int **ptr3[5]; müsste ich doch Fünf Elemente haben, welche wiederum auf Pointer zeigen oder net?
Warum hast du da 5x5 Elemente?
Bzw. wie kommt das Zustande?

anda_skoa
01-04-2006, 15:08
Man würde es besser sehen, wenn man eine besser Schreibweise nimmt :rolleyes:

Nachdem eine Deklaration im Grunde aus Typ gefolgt von Variablenname besteht, sieht man das Resultat besser, wenn man den Typ nicht mitten drinnen mit Leerzeichen trennt.

Also statt


int *a;

besser


int* a;


Also zumindest mir hilft das wesentlich bei solchen Fragen :)

Ciao,
_

L00NIX
04-04-2006, 12:43
Allerdings Pointer auf ein einzelnes Int und nicht Pointer auf ein Array!


Woran erkenne ich denn, ob ein int* auf ein einzelnes Integer oder ein dahinterliegendes Feld von int zeigt?



Nun ist meine Frage:
Was bewirkt dieser Code?



int *ptr[10];



Es wird ein Array mit 10 Elementen des Typs int* angelegt.




Mein Prof. sagte dann, wenn ich tatsächlich 10 Pointer auf einzelne Ints speichern will
müsste ich das Array folgendermaßen deklarieren:



int **ptr[10];



Macht keinen Sinn, was soll denn ein Zeiger auf einen Zeiger eines Zeigers sein?

Merke: Arraynamen sind bereits Zeiger!

int a[10];

-> a ist ein Zeiger und zeigt auf a[0].

int *a[10];

-> a ist ein Zeiger auf ein Feld mit Zeigern

int **a[10]

-> Blödsinn!

Möglich ist es, das Array dynamisch anzulegen, dann lässt man aber die [] weg:


int **a;

a = (int**) (malloc(ANZAHL * sizeof(int*)));


Hier mal ein komplettes Bsp:


#include <stdio.h>
#include <stdlib.h>

#define ANZAHL 10

int main()
{
int **meine_ints;
/*
int *meine_ints[ANZAHL];
*/
int *a;
int i;

/* allocate int*-Array */
meine_ints = (int**) (malloc(ANZAHL * sizeof(int*)));

printf ("Groesse des Arrays ist %i Byte\n", sizeof(meine_ints));

/* fill int*-Array */
for (i=0; i<ANZAHL; i++)
{
a = (int*) (malloc(1*sizeof(int)));
*a = 10 + i;
meine_ints[i] = a;
}

/* print int*-Array */
for (i=0; i<ANZAHL; i++)
{
printf ("%2i. Wert des Arrays ist %i\n", i+1, *meine_ints[i]);
}

return 0;
}

bischi
04-04-2006, 12:48
Also statt


int *a;

besser


int* a;



Also wir haben das gerade andersrum gelernt - und zwar mit folgender schlauen Begründung: Wenn du

int* a,b;
schreibst, so hast du das Gefühl, dass du zwei Pointer hast.

Falls dus aber so

int *a,b;
schreibst, ist klar, dass nur gerade a ein Pointer ist, b aber nicht.

MfG Bischi

L00NIX
04-04-2006, 13:05
Also wir haben das gerade andersrum gelernt - und zwar mit folgender schlauen Begründung: Wenn du

int* a,b;
schreibst, so hast du das Gefühl, dass du zwei Pointer hast.

Falls dus aber so

int *a,b;
schreibst, ist klar, dass nur gerade a ein Pointer ist, b aber nicht.


Ich finde beide Schreibweisen verwirrend und würde die Variablen lieber in zwei Zeilen aufteilen (pro Typ eine Zeile).