julsos Geschrieben 20. Juli 2020 Teilen Geschrieben 20. Juli 2020 Hallo zusammen, ist jemand so nett und kann mir vielleicht erklären, weshalb diese Werte ausgegeben werden? Ich hab mal einen Screenshot von der Lösung gemacht. Verstehe im Grunde was ein Pointer macht, das Thema ist trotzdem noch noch nicht so ganz klar für mich. Hoffe mir kann das jemand beantworten, sodass ich auch die weiteren Aufgaben verstehe. Liebe Grüße, Julian Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 20. Juli 2020 Teilen Geschrieben 20. Juli 2020 Vielleicht muss man da ein bisschen weiter ausholen. Zeiger sind Variablen, die als Wert die Speicheradresse einer anderen Variable enthalten. Ein Array hingegen ist die Speicheradresse auf das erste Element des Arrays. Ein Array wird als ganzer Block im Speicher allokiert. feld1 und feld2 sind nun Arrays. Also eine Adresse. Das kannst du auch sehen, wenn du cout << feld1; ausführst. Dann wird eine Adresse ausgegeben. Um die Adresse des nächsten Elementes auszuweisen, kannst du cout << feld1 + 1; schreiben. Du wirst feststellen, dass die Adresse um 4 Bytes (bzw. 8 Bytes; je nach Compiler) höher ist, als die Adresse von feld1. Das liegt eben daran, dass ein Array, wie schon erwähnt, als ganzen Block im Speicher liegt. Da wird angeben müssen, welchen Datentyp das Array speichert, weiß das Programm nun, ab welcher Adresse das nächste Element anfängt. In unserem Fall 4/8 Bytes, da ein Integer 4/8 Bytes groß ist. In der Zeile 8 wird jetzt nun ein Array von int-Zeigern (also Adressen) erzeugt und besitzt zwei Elemente (int* ipf[2]), nämlich die Adressen von feld1 und feld2. In Zeile 9 wird die Adresse von feld1 gespeichert. In Zeile 10 wird zunächst der zweite Wert aus dem Array genommen. Das entspricht der Adresse von feld2 und holen uns dann mit dem Stern den Wert aus dieser Adresse: 29. Dann wird der Wert noch mit 1 addiert und ausgewiesen wird dann die 30. In Zeile 11 wird der erste Wert aus dem Array genommen. Also die Adresse von feld1 und mit dem Wert von der Variable ip substrahiert. Der Wert von ip ist ebenfalls die Adresse von feld1. Aber Achtung: Es wird nicht 13 - 13 gerechnet, sondern Adresse - Adresse. Das kannst du nämlich sehen, wenn du die Zeilen cout << ipf[0] << endl; cout << ip << endl; ausführst. Dop4miN und julsos reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
JustALurker Geschrieben 20. Juli 2020 Teilen Geschrieben 20. Juli 2020 (bearbeitet) Am einfachsten lassen sich solche Code Ausschnitte in kleinen Konsolenanwendungen testen in denen man einen Haltepunkt setzt und dann Zeile für Zeile die Variablen prüft wie diese sich Verändern. In Zeile 6 und 7 werden die beiden Arrays vom Typ Integer erstellt und mit den entsprechenden Werten initialisiert. In Zeile 8 wird nun ein Zeiger auf ein Array mit der Größe 2 vom Typen Integer definiert und mit den beiden Adressen von feld1 und feld2 initalisiert. ipf[] beinhaltet nun also 2 Adressen und diese sind die von feld1 und feld2. Die Adressen von einem Array zeigen immer auf das erste Element im Array also z. B: Zitat ipf[0] = 0x00aff7d4; // Entspricht der Adresse vom ersten Element also 13 ipf[1] = 0x00aff7bc; // Entspricht der Adresse vom ersten Element also 29 Zeile 9 ist ein weiterer Zeiger auf eine Integer Variable die, die gleiche Adresse erhält wie feld1 also: Zitat ip = 0x00aff7d4; Zeile 10 dereferenziert ipf[1] und addiert dann noch den Wert 1 dazu. ipf[1] entspricht der Adresse des Arrays feld2 bzw. dessen ersten Element also 29. Und 29 + 1 sind eben 30, was die Ausgabe auch nochmal bestätigt. In der letzten interessanten Zeile wird die Adresse ipf[0], welche dem ersten Element von feld1 entspricht also 13, subtrahiert mit der Adresse auf die ip zeigt, welche sich aus Zeile 9 ergibt, es zeigen also beide auf die gleiche Adresse, also 13 - 13 = 0. Was mich an der Aufgabe etwas überrascht hat war, das man in der Zeile 11: Zitat cout << ipf[0] - ip << endl; keine Sterne angeben musste um die Adresse wieder zu dereferenzieren, also eigentlich hätte ich es so erwartet, was zum gleichen Output führt: Zitat cout << *ipf[0] - *ip << endl; möglicherweise wird die Ausgabe wohl direkt als Wert ausgegeben wenn man mit zwei Adressen Rechenoperationen durchführt, hier bin ich mir aber nicht sicher. Bearbeitet 20. Juli 2020 von JustALurker Typos und Formatierung Dop4miN und julsos reagierten darauf 2 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
julsos Geschrieben 20. Juli 2020 Autor Teilen Geschrieben 20. Juli 2020 Ihr seid beide der Hammer! vielen vielen dank für diese sehr ausführlichen Erklärungen, jetzt check ich bestimmt auch alle weiteren Aufgaben zu dem Thema 🤗 Ihr habt euch übrigens gut mit den Erklärungen ergänzt muss ich sagen 😁 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.