Hi, was ist der Unterschied zwischen int *a; und int **a; ?? Und was ist daran verschachtelt? Dankeschön
Gast
#2253652
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...
Gast
#2253655
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
Gast
#2253670
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 | |
2 | |
3 | |
4 | |
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 | |
wird lediglich Platz für einen Pointer auf einen anderen Pointer belegt. Der zeigt so erst mal irgendwo hin. Erst durch
1 | |
2 | |
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.
Gast
#2255474
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 | |
2 | |
3 | |
4 | |
5 | |
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.
Gast
#2255802
Wenn du vorher korrekt den Speicher allokierst. Kannst du mit *a auf eindimensionale Arrays und mit **a auf zweidimensionale Arrays zugreifen.
Gast
#2256279
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?
Gast
#2257060
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.