Zum Inhalt springen
Melde dich an, um diesem Inhalt zu folgen  

Pointer Zeiger

Empfohlene Beiträge

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.

2007921070_Bildschirmfoto2020-07-20um12_15_01.thumb.png.8662239442a89b0c4d35811d18fda5ef.png

Liebe Grüße,

Julian

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 von JustALurker
Typos und Formatierung

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 😁

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Deine Meinung

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich an , um mit Deinem Konto zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Melde dich an, um diesem Inhalt zu folgen  

Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung