Hi, was ist der Unterschied zwischen int *a; und int **a; ?? Und was ist daran verschachtelt? Dankeschön
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...
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.
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?
es ist fast wie Geocaching .. es werden Dinge im Gelände versteckt, die einen Hinweis auf das nächste Ziel beinhalten. Gruss klaus
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.
Ok, das habe ich verstanden. Muss ich vorher *a deklarieren, oder wird das automatisch deklariert, wenn ich **a deklariere? Danke
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
Also speichere ich einfach nur die Adresse von einem Pointer in einem anderen Pointer. Ok, sehr gut, dankeschön :)
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.
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); |
Sven H. schrieb: > Da wird erst etwas drin gespeichert, wenn du etwas zuweißt. Kann man auch etwas zuschwarzen?
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.
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.
Wenn du vorher korrekt den Speicher allokierst. Kannst du mit *a auf eindimensionale Arrays und mit **a auf zweidimensionale Arrays zugreifen.
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
> Oder einfacher: [Satz in Englisch]
wieso wird denn der Sachverhalt einfacher, wenn du den in Englisch
hinschreibst?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.