<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst]]]></title><description><![CDATA[<p>Hallo, ich befinde mich momentan in der Prüfungsvorbereitung zu einer C++ Klausur, es geht darum, Quelltexte zu verstehen und dies dadurch zu zeigen, die korrekten Bildschirmausgaben bzw. Inhalte von Variablen angeben zu können.</p>
<p>Nun bin ich auf folgende Aufgabe gestoßen und habe ein Problem beim Nachvollziehen, ich hab sie mehrfach durch den Compiler laufen lassen und schrittweise die Veränderungen beobachtet, doch ab der 5. Zuweisung komme ich nicht wirklich weiter und bitte deshalb euch um Rat.</p>
<blockquote>
<p>Aufgabenstellung: Bestimmen Sie den Wert für jede Variable (s.u.), nachdem folgende Code-Fragemente ausgeführt wurden. Folgende Annahmen sollen gelten:</p>
<p>- Eine Integer-Zahl belegt 4 Bytes.<br />
- Die Variable m wird unter der Adresse 0x3fffd00 im Hauptspeicher gespeichert.</p>
</blockquote>
<pre><code>int m = 44;

	int *p = &amp;m;

	int &amp;r = m;

	int n = (*p)++;

	int *q = p - 1;

	r =  --(*p) + 1;

	++*q;
</code></pre>
<p>Gesucht sind:</p>
<p>Inhalt Variable n:<br />
Inhalt Variable &amp;m:<br />
Inhalt Variable *p:<br />
Inhalt Variable r:<br />
Inhalt Variable *q:</p>
<p>Nun zu meinem Lösungsvorschlag:</p>
<p>Inhalt Variable n: 44 - Da in der Zuweisung int n = (*p)++; (*p) postinkrementiert wird und somit n den &quot;alten&quot; Wert zugewiesen bekommt.<br />
Inhalt Variable &amp;m: - Die Adresse aus der Aufgabenstellung.<br />
Inhalt Variable *p: - 45 da (p) postinkrementiert wurde.<br />
Inhalt Variable r: - Hier bin ich mir unsicher ob die Zuweisung mit r überhaupt Auswirkungen hat<br />
Inhalt Variable *q: - Hier bin ich mir unsicher, ob ich überhaupt eine Aussage über den Inhalt von Variable *q treffen kann.</p>
<p>Für Tipps, Ratschläge und Erklärungen schon mal ein Dankeschön und ein schönes Wochenende <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/322887/fragen-bezüglich-aufgabe-zu-pointer-und-adressen-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Jul 2026 14:39:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/322887.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 10 Jan 2014 18:48:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 22:08:37 GMT]]></title><description><![CDATA[<p>Hallo, ich befinde mich momentan in der Prüfungsvorbereitung zu einer C++ Klausur, es geht darum, Quelltexte zu verstehen und dies dadurch zu zeigen, die korrekten Bildschirmausgaben bzw. Inhalte von Variablen angeben zu können.</p>
<p>Nun bin ich auf folgende Aufgabe gestoßen und habe ein Problem beim Nachvollziehen, ich hab sie mehrfach durch den Compiler laufen lassen und schrittweise die Veränderungen beobachtet, doch ab der 5. Zuweisung komme ich nicht wirklich weiter und bitte deshalb euch um Rat.</p>
<blockquote>
<p>Aufgabenstellung: Bestimmen Sie den Wert für jede Variable (s.u.), nachdem folgende Code-Fragemente ausgeführt wurden. Folgende Annahmen sollen gelten:</p>
<p>- Eine Integer-Zahl belegt 4 Bytes.<br />
- Die Variable m wird unter der Adresse 0x3fffd00 im Hauptspeicher gespeichert.</p>
</blockquote>
<pre><code>int m = 44;

	int *p = &amp;m;

	int &amp;r = m;

	int n = (*p)++;

	int *q = p - 1;

	r =  --(*p) + 1;

	++*q;
</code></pre>
<p>Gesucht sind:</p>
<p>Inhalt Variable n:<br />
Inhalt Variable &amp;m:<br />
Inhalt Variable *p:<br />
Inhalt Variable r:<br />
Inhalt Variable *q:</p>
<p>Nun zu meinem Lösungsvorschlag:</p>
<p>Inhalt Variable n: 44 - Da in der Zuweisung int n = (*p)++; (*p) postinkrementiert wird und somit n den &quot;alten&quot; Wert zugewiesen bekommt.<br />
Inhalt Variable &amp;m: - Die Adresse aus der Aufgabenstellung.<br />
Inhalt Variable *p: - 45 da (p) postinkrementiert wurde.<br />
Inhalt Variable r: - Hier bin ich mir unsicher ob die Zuweisung mit r überhaupt Auswirkungen hat<br />
Inhalt Variable *q: - Hier bin ich mir unsicher, ob ich überhaupt eine Aussage über den Inhalt von Variable *q treffen kann.</p>
<p>Für Tipps, Ratschläge und Erklärungen schon mal ein Dankeschön und ein schönes Wochenende <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376520</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376520</guid><dc:creator><![CDATA[Raw]]></dc:creator><pubDate>Fri, 10 Jan 2014 22:08:37 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 18:56:40 GMT]]></title><description><![CDATA[<p>Der Tricky Teil des ganzen ist diese Zeile:<br />
r = --(*p) + 1;</p>
<p>meditiere darueber nochmal ordentlich. Und denke daran, dass r eine Referenz auf m ist.</p>
<p>Die Zeile<br />
++*q;<br />
ist auch fies. Denk hierbei ein die Operator Precedence: <a href="http://en.cppreference.com/w/cpp/language/operator_precedence" rel="nofollow">http://en.cppreference.com/w/cpp/language/operator_precedence</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376522</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376522</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 10 Jan 2014 18:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:09:45 GMT]]></title><description><![CDATA[<p>Raw schrieb:</p>
<blockquote>
<blockquote>
<p>Aufgabenstellung: Bestimmen Sie den Wert für jede Variable (s.u.), nachdem folgende Code-Fragemente ausgeführt wurden. Folgende Annahmen sollen gelten:</p>
<p>- Eine Integer-Zahl belegt 4 Bytes.<br />
- Die Variable m wird unter der Adresse 0x3fffd00 im Hauptspeicher gespeichert.</p>
</blockquote>
<pre><code>int m = 44;

	int *p = &amp;m;

	int &amp;r = m;

	int n = (*p)++;

	int *q = p - 1;

	r =  --(*p) + 1;

	++*q;
</code></pre>
<p>Gesucht sind:</p>
<p>Inhalt Variable n:<br />
Inhalt Variable &amp;m:<br />
Inhalt Variable *p:<br />
Inhalt Variable r:<br />
Inhalt Variable *q:</p>
</blockquote>
<p>&amp;m, *p, *q sind keine Variablen. Die Variablen heißen m, p und q. Gefragt ist anscheinend aber jeweils nach den Werten der genannten Ausdrücke.</p>
<blockquote>
<p>Inhalt Variable n: 44 - Da in der Zuweisung int n = (*p)++; (*p) postinkrementiert wird und somit n den &quot;alten&quot; Wert zugewiesen bekommt.</p>
</blockquote>
<p>Richtig.</p>
<blockquote>
<p>Inhalt Variable &amp;m: - Die Adresse aus der Aufgabenstellung.</p>
</blockquote>
<p>Der Wert des Ausdruckes &amp;m ist die genannte Adresse, ja.</p>
<blockquote>
<p>Inhalt Variable *p: - 45 da (p) postinkrementiert wurde.</p>
</blockquote>
<p>*p wird am Ende auch nochmal dekrementiert.</p>
<blockquote>
<p>Inhalt Variable r: - Hier bin ich mir unsicher ob die Zuweisung mit r überhaupt Auswirkungen hat</p>
</blockquote>
<p>Tatsächlich hat die Zuweisung undefiniertes Verhalten, weil r und p beide auf m zeigen und somit dieselbe Speicherstelle zwischen zwei Sequenzpunkten mehrfach modifiziert wird. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<blockquote>
<p>Inhalt Variable *q: - Hier bin ich mir unsicher, ob ich überhaupt eine Aussage über den Inhalt von Variable *q treffen kann.</p>
</blockquote>
<p>Genau, kann man nicht. Das ist wieder undefiniertes Verhalten.</p>
<blockquote>
<p>Die Zeile<br />
++*q;<br />
ist auch fies. Denk hierbei ein die Operator Precedence</p>
</blockquote>
<p>Das ist nicht fies und hat auch nichts mit der Operator Precedence zu tun. Wenn der Geist von Dennis Ritchie aus dem Jenseits erscheint und die Operatorenrangfolge zufällig durchpermutiert hat der obige Ausdruck immer noch dieselbe Bedeutung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376524</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:09:45 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:22:29 GMT]]></title><description><![CDATA[<blockquote>
<p>*p wird am Ende auch nochmal dekrementiert.</p>
</blockquote>
<p>Ja, an der Stelle: r = --(*p) + 1. Aber sorgt +1 nicht dafür, dass der Effekt der Dekrementierung aufgehoben wird und p den ursprünglichen Wert erlangt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376530</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376530</guid><dc:creator><![CDATA[Raw]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:22:29 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:27:09 GMT]]></title><description><![CDATA[<p>Wie gesagt, diese Anweisung hat undefiniertes Verhalten, weil nicht klar ist, in welcher Reihenfolge die Zuweisung an r und die Dekrementierung stattfinden. Man kann nicht sinnvoll sagen, was die Werte der Variablen danach sind. Strenggenommen sind sogar alle Aussagen über die Werte der Variablen *davor* dadurch Makulatur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376531</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:27:09 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:31:54 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung. Für den Fall dass kein UB auftritt hab ich das ganze nochmal im Compiler getestet und deine Aussage stimmt, das Ergebnis das ich angesprochen habe wird nur der Variable zugeordnet, die diesen Ausdruck enthält.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376532</guid><dc:creator><![CDATA[Raw]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:31:54 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:39:17 GMT]]></title><description><![CDATA[<p>Raw schrieb:</p>
<blockquote>
<p>Danke für die Erklärung. Für den Fall dass kein UB auftritt hab ich das ganze nochmal im Compiler getestet und deine Aussage stimmt, das Ergebnis das ich angesprochen habe wird nur der Variable zugeordnet, die diesen Ausdruck enthält.</p>
</blockquote>
<p>UB tritt in jedem Fall auf, der Compiler ist nur so nett, keinen Code einzufügen, der deine Festplatte formatiert, sondern versucht etwas daraus zu machen.<br />
Nett von dem Compiler, wäre aber in jedem Fall standardkonform.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376536</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:39:17 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:40:08 GMT]]></title><description><![CDATA[<p>Raw schrieb:</p>
<blockquote>
<p>Für den Fall dass kein UB auftritt</p>
</blockquote>
<p>Was soll das bedeuten? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> UB ist die Situation, dass der Sprachstandard keine Aussage welcher Art auch immer über das Verhalten eines Programms macht. Das kann per Definition nicht &quot;auftreten&quot;, insbesondere kann man ein Programm, dass undefiniertes Verhalten enthält, nicht darauf testen, ob das Verhalten undefiniert ist.</p>
<p>Man sagt trotzdem schlampigerweise, dass UB &quot;auftritt&quot;, meint damit aber, dass eine Situation eintritt, in der das Programm UB hat. Das ist in deinem Programm aber nicht so, das UB tritt in diesem Sinne immer auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376537</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:40:08 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:53:34 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Die Zeile<br />
++*q;<br />
ist auch fies. Denk hierbei ein die Operator Precedence: <a href="http://en.cppreference.com/w/cpp/language/operator_precedence" rel="nofollow">http://en.cppreference.com/w/cpp/language/operator_precedence</a></p>
</blockquote>
<p>Die q-Sache ist auch ganz klar UB (mehrfach).</p>
<p>Die Initialisierung von q ist schon UB, weil man keine Zeiger auf Sachen erzeugen darf die's gar nicht gibt. (Ausgenommen der &quot;one past last&quot; Regel natürlich, &quot;one before first&quot; Regel wäre mir aber keine bekannt. Und sogar die &quot;one past last&quot; Regel bezieht sich soweit ich weiss nur auf Arrays.)</p>
<p>Aber selbst wenn man davon ausgeht dass es noch OK wäre Zeiger zu erzeugen die eine unsinnige Adresse enthalten...<br />
Und wir davon ausgehen dass ((p - 1) + 1) wieder p ergibt, selbst wenn es vor p gar nichts gibt...</p>
<p>Selbst dann ist <code>++*q;</code> doch UB -- oder hab ich da was falsch verstanden?</p>
<p>Wie haben hier zwei Prefix Operatoren (Rechts -&gt; Links Assozivität!). Also wird erst <code>*q</code> ausgewertet. Und auf das Ergebnis von <code>*q</code> dann <code>++</code> angewendet.<br />
Also <code>++(*q)</code></p>
<p>Und das ist ja wohl eindeutig Unsinn, da wir ein Objekt das nicht existiert (&quot;one before m&quot;) ja wohl nicht inkrementieren können.</p>
<p>----</p>
<p>Ich denke der Ersteller dieser Übung hat sich hier selbst mehrere Eier gelegt.<br />
Und das <code>++*q;</code> Ei vermutlich deswegen, weil <code>*q++</code> nicht das selbe ist wie <code>(*q)++</code> -- und ihn das zu der irrigen Annahme verleitet hat dass es bei <code>++*q</code> und <code>++(*q)</code> ähnlich wäre.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376543</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:53:34 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 19:58:26 GMT]]></title><description><![CDATA[<p>Vielleicht will der Aufgabenersteller darauf hinaus, dass die Variablen auf dem Stack absteigend angelegt werden, so dass q auf p zeigt. Das ist natürlich hochgradig von allen möglichen Annahmen abhängig und dürfte in der Praxis bei optimierenden Compiler praktisch nie stimmen, aber vor 25 Jahren mochte der eine oder andere manchmal so gedacht haben, und mancher vielleicht heute noch.</p>
<p>(Ändert alles natürlich nichts am UB.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376544</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Fri, 10 Jan 2014 19:58:26 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 20:01:39 GMT]]></title><description><![CDATA[<p>Ich glaube dass der Aufgabensteller leider - wie so viele Lehrer - nicht weiss wovon er spricht.<br />
Worauf er hinaus will ist dann schwer zu erraten.</p>
<p>Ob er jetzt irrerweise glaubt dass (p - 1) immer auf n zeigt, oder irrerweise glaubt dass das ++ in ++*q vor dem * ausgefürht wird ... man weiss es nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376548</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376548</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 10 Jan 2014 20:01:39 GMT</pubDate></item><item><title><![CDATA[Reply to Fragen bezüglich Aufgabe zu Pointer und Adressen[gelöst] on Fri, 10 Jan 2014 22:08:12 GMT]]></title><description><![CDATA[<p>Vielen Dank für die ganzen Erklärungen, das hat mir einiges an Kopfzerbrechen erspart, schönes Wochenende noch! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2376579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2376579</guid><dc:creator><![CDATA[Raw]]></dc:creator><pubDate>Fri, 10 Jan 2014 22:08:12 GMT</pubDate></item></channel></rss>