Forum: PC-Programmierung Pointer verschachteln, was ist das?


von Mike M. (mikeii)


Lesenswert?

Hi,

was ist der Unterschied zwischen int *a; und int **a; ??

Und was ist daran verschachtelt?

Dankeschön

von nocheinGast (Gast)


Lesenswert?

Naja... das erste ist ein Pointer, der dereferenziert wird. Du greifst 
also auf den Inhalt der Speicherzelle zu, auf die er zeigt.
Das zweite ist ein Pointer auf einen Pointer, der zwei Mal 
dereferenziert wird. Du greifst also auf das zu, worauf der Pointer 
zeigt, auf den der eigentlich Pointer a zeigt... a -> anderer Pointer -> 
inhalt...

von nocheinGast (Gast)


Lesenswert?

Hoppla, tut mir leid, dereferenziert wird da momentan gar nichts, ich 
hab das aus irgendeinem Grund falsch gelesen. Ich hoffe, du weißt 
trotzdem, was ich meine.

von Mike M. (mikeii)


Lesenswert?

Also nicht so ganz.

Der Pointer **a zeigt also auf den Pointer *a oder wie?

Ich raffs nicht so recht was mir das bringt?
Ich kann damit die Adresse rausfinden, wo die Adresse meiner Variable 
gespeichert ist?

von Klaus D. (kolisson)


Lesenswert?

es ist fast wie Geocaching
.. es werden Dinge im Gelände versteckt, die einen Hinweis
auf das nächste Ziel beinhalten.

Gruss klaus

von pointer (Gast)


Lesenswert?

Mike Mike schrieb:
> int *a;
deklariert einen Zeiger auf einen integer


Mike Mike schrieb:
>int **a;
deklariert einen Zeiger auf einen Zeiger, der auf einen integer zeigt.

von Mike M. (mikeii)


Lesenswert?

Ok, das habe ich verstanden. Muss ich vorher *a deklarieren, oder wird 
das automatisch deklariert, wenn ich **a deklariere?

Danke

von Arc N. (arc)


Lesenswert?

Mike Mike schrieb:
> Ok, das habe ich verstanden. Muss ich vorher *a deklarieren, oder wird
> das automatisch deklariert, wenn ich **a deklariere?
>
> Danke

Da wird nichts automatisch deklariert.
Beispiel: Mögliches Speicherlayout (alles 32-Bit) für
int a = 123456;
int *aP = &a;
int **aPP = &aP;
1
Adresse Inhalt     Var
2
0       123456     a
3
4       0          aP
4
8       4          aPP
und &aPP wäre 8

von Mike M. (mikeii)


Lesenswert?

Also speichere ich einfach nur die Adresse von einem Pointer in einem 
anderen Pointer.
Ok, sehr gut, dankeschön :)

von Sven H. (dsb_sven)


Lesenswert?

Da wird erst etwas drin gespeichert, wenn du etwas zuweißt. Nur durch
1
**a

wird lediglich Platz für einen Pointer auf einen anderen Pointer belegt. 
Der zeigt so erst mal irgendwo hin. Erst durch
1
*b;
2
**a = &b

wird festgelegt, dass a auf b zeigt. b zeigt in dem Beispiel genauso 
irgendwo hin, wo a im oberen Beispiel zeigt.

Ohne Zuweisung ist einfach nicht definiert, was in der Variable steht, 
sprich, in diesem Fall, wo hin gezeigt wird.

von DirkB (Gast)


Lesenswert?

Schau dir mal die Funktion strtol() an. Da gibt es als zweiten Parameter 
den char **endptr.
endptr zeigt auf die Stelle, an der strtol nicht mehr weiter kommt.
Damit strtol den Wert von endptr ändern kann, muss es wissen wo der 
Zeiger selber ist.
1
long l;
2
char *pc, t[] = "12345abc";
3
4
l = strtol(t,&pc,10);
5
printf("Wert = %ld, Endptr: %s\n", l, pc);

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sven H. schrieb:
> Da wird erst etwas drin gespeichert, wenn du etwas zuweißt.

Kann man auch etwas zuschwarzen?

von Sven H. (dsb_sven)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Sven H. schrieb:
>> Da wird erst etwas drin gespeichert, wenn du etwas zuweißt.
>
> Kann man auch etwas zuschwarzen?

Wer Rechtscheibfehler findet, kann sie behalten.

von Udo S. (urschmitt)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Kann man auch etwas zuschwarzen
Also wenn schon dann zuschwartzen :-)

Sven H. schrieb:
> Wer Rechtscheibfehler findet, kann sie behalten.
immer cool bleiben, das war ein nett gemeinter Hinweis auf einen 
eklatanten Rechtschreibfehler, das ist Grundschulniveau Klasse 3. Damit 
könntest du dich mal ernsthaft blamieren, also ärgere dich nicht sondern 
lerne daraus.

von Decius (Gast)


Lesenswert?

Wenn du vorher korrekt den Speicher allokierst. Kannst du mit *a auf 
eindimensionale Arrays und mit **a auf zweidimensionale Arrays 
zugreifen.

von &parameter (Gast)


Lesenswert?

DirkB schrieb:
> Damit strtol den Wert von endptr ändern kann, muss es wissen wo der
> Zeiger selber ist.

Oder einfacher: to modify a function parameter call it by reference ... 
not by value

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> Oder einfacher: [Satz in Englisch]

wieso wird denn der Sachverhalt einfacher, wenn du den in Englisch 
hinschreibst?

von DirkB (Gast)


Lesenswert?

Vermutung:
Ich habe das speziell für Zeiger geschrieben um dem TO zu zeigen, wofür 
man ein Doppelzeiger gebrauchen kann.

Der englische Satz gilt allgemein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.