<?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[Verständnisfrage zu Pointern]]></title><description><![CDATA[<p>Hallo,</p>
<p>es geht um folgenden Code</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

void foo(int **pPointer2)
{
    int Zahl=2;
    *pPointer2=&amp;Zahl;
}

int main()
{
    int Zahl2=0;
    int *pPointer1;
    pPointer1 =&amp;Zahl2;

    foo(&amp;pPointer1);
    cout &lt;&lt; &quot;Zahl: &quot; &lt;&lt; *pPointer1 &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>Hier mal mein Gedankengang zu dem was ich gemacht habe:</p>
<p>Ich erzeuge einen Pointer und setze ihn auf die Adresse von Zahl2.<br />
Jetzt übergebe ich die Adresse auf die der Pointer zeigt an foo().<br />
Diese erzeugt einen Doppelpointer **pPointer2 und setzt diesen auf die übergebene Adresse.<br />
Nun biege ich den Inhalt von pPointer2 (also den inneren Zeiger) auf die Adresse von Zahl2 um. Damit zeigt pPointer2 letztendlich auf die Adresse von Zahl2.</p>
<p>Wieso biegt es nun auch pPointer1 auf Zahl2 um? Diesen hab ich doch gar nicht verändert? Ich habe doch lediglich die Adresse des Pointers kopiert und der andere pPointer2 zeigt nun halt auch noch auf diese Adresse.</p>
<p>Vielen Dank für Eure Antworten</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/333215/verständnisfrage-zu-pointern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 04:07:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333215.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Jun 2015 20:23:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 20:23:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>es geht um folgenden Code</p>
<pre><code>#include &lt;iostream&gt;

using namespace std;

void foo(int **pPointer2)
{
    int Zahl=2;
    *pPointer2=&amp;Zahl;
}

int main()
{
    int Zahl2=0;
    int *pPointer1;
    pPointer1 =&amp;Zahl2;

    foo(&amp;pPointer1);
    cout &lt;&lt; &quot;Zahl: &quot; &lt;&lt; *pPointer1 &lt;&lt; endl;

    return 0;
}
</code></pre>
<p>Hier mal mein Gedankengang zu dem was ich gemacht habe:</p>
<p>Ich erzeuge einen Pointer und setze ihn auf die Adresse von Zahl2.<br />
Jetzt übergebe ich die Adresse auf die der Pointer zeigt an foo().<br />
Diese erzeugt einen Doppelpointer **pPointer2 und setzt diesen auf die übergebene Adresse.<br />
Nun biege ich den Inhalt von pPointer2 (also den inneren Zeiger) auf die Adresse von Zahl2 um. Damit zeigt pPointer2 letztendlich auf die Adresse von Zahl2.</p>
<p>Wieso biegt es nun auch pPointer1 auf Zahl2 um? Diesen hab ich doch gar nicht verändert? Ich habe doch lediglich die Adresse des Pointers kopiert und der andere pPointer2 zeigt nun halt auch noch auf diese Adresse.</p>
<p>Vielen Dank für Eure Antworten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457136</guid><dc:creator><![CDATA[bacon]]></dc:creator><pubDate>Thu, 18 Jun 2015 20:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 20:44:16 GMT]]></title><description><![CDATA[<p>bacon schrieb:</p>
<blockquote>
<p>Jetzt übergebe ich die Adresse auf die der Pointer zeigt an foo().<br />
Diese erzeugt einen Doppelpointer **pPointer2 und setzt diesen auf die übergebene Adresse.</p>
</blockquote>
<p>Nein, du übergibst die Adresse des Pointers. Da wird nichts &quot;erzeugt&quot;. Dann veränderst du den Pointer und machst ihn mit der Zuweisung einer lokalen Adresse außerhalb der Funktion ungültig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457141</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457141</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 18 Jun 2015 20:44:16 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 21:23:46 GMT]]></title><description><![CDATA[<p>Das hab ich verstanden. Ich sehe nur immernoch nicht den Zusammenhang wieso *pPointer1 eine 2 (aus foo() ) ausgibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457144</guid><dc:creator><![CDATA[bacon]]></dc:creator><pubDate>Thu, 18 Jun 2015 21:23:46 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 21:32:56 GMT]]></title><description><![CDATA[<p>bacon schrieb:</p>
<blockquote>
<p>Das hab ich verstanden.</p>
</blockquote>
<p>steht im Widerspruch zu</p>
<blockquote>
<p>Ich sehe nur immernoch nicht den Zusammenhang wieso *pPointer1 eine 2 (aus foo() ) ausgibt.</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2457145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457145</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 18 Jun 2015 21:32:56 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 22:15:29 GMT]]></title><description><![CDATA[<p>bacon schrieb:</p>
<blockquote>
<p>Ich sehe nur immernoch nicht den Zusammenhang wieso *pPointer1 eine 2 (aus foo() ) ausgibt.</p>
</blockquote>
<p>Naja du hast deinen Pointer in der foo() Funktion überschrieben und so geändert, dass er auf eine lokale Variable zeitgt. Damit ist der Pointer in der main() Funktion eigentlich ungültig. Zufällig steht da jetzt immer noch die 2 aus deiner Funktion. Es könnte aber auch schon etwas anderes dort stehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457146</guid><dc:creator><![CDATA[sebi707]]></dc:creator><pubDate>Thu, 18 Jun 2015 22:15:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 22:37:04 GMT]]></title><description><![CDATA[<p>Kannst du mir vielleicht erklären wie genau ich den Pointer überschrieben hab? Ich kann das irgendwie nicht nachvollziehen.</p>
<p>So sieht das für mich gerade aus(Pfeile symbolisieren nen Pointer)</p>
<p>pPointer2 vor Zeile 8:</p>
<p>-&gt;-&gt;&amp;pPointer1 ( = -&gt;-&gt;&amp;Zahl2 )</p>
<p>nach Zeile 8:</p>
<p>-&gt;-&gt;&amp;Zahl</p>
<p>pPointer1 die ganze Zeit:</p>
<p>-&gt;&amp;Zahl2</p>
<p>Wo liegt mein Denkfehler?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457147</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457147</guid><dc:creator><![CDATA[bacon]]></dc:creator><pubDate>Thu, 18 Jun 2015 22:37:04 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 22:45:08 GMT]]></title><description><![CDATA[<p>Vor Zeile 8:</p>
<p>pointer2 -&gt; pPointer1 -&gt; Zahl2</p>
<p>Nach Zeile 8:</p>
<p>pointer 2 -&gt; pPointer1 -&gt; Zahl</p>
<p>Was du verstehen musst ist, dass dein 'int **pointer2' ein pointer auf ein pointer auf ein int ist und durch den funktionsaufruf mit <em>foo(&amp;pPointer1);</em> zeigt dieser nunmal auf pPointer1.</p>
<p>Zeile 8 ändert nun das <strong>ziel</strong> von pointer2 (*pointer2 = pointer2 dereferenziert) was nunmal pPointer1 ist auf die <strong>Adresse</strong> von Zahl (&amp;Zahl = Adresse von)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457148</guid><dc:creator><![CDATA[tkausl]]></dc:creator><pubDate>Thu, 18 Jun 2015 22:45:08 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Thu, 18 Jun 2015 23:01:47 GMT]]></title><description><![CDATA[<p>Vielen Dank, jetzt hats klick gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457149</guid><dc:creator><![CDATA[bacon]]></dc:creator><pubDate>Thu, 18 Jun 2015 23:01:47 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Fri, 19 Jun 2015 08:08:56 GMT]]></title><description><![CDATA[<p>Und noch was, was du gleich verstehen solltest:</p>
<p>Lifecycles:</p>
<p>Das Deine Ausgabe 2 anzeigt, ist quasi nur &quot;Glück&quot;.</p>
<pre><code>void foo(int **pPointer2)
{
    int Zahl=2;
    *pPointer2=&amp;Zahl;
}
</code></pre>
<p>int Zahl=2; erzeugt dir eine <strong>lokale</strong> Variable aufn Stack<br />
*pPointer2=&amp;Zahl; Du schreibst die <strong>Adresse</strong> der Variablen an die Adresse die dir dein Pointer Paramater gibt. AKA du gibts sie nach außen.<br />
} Du verläßt den scope der funktion, aka alle lokalen variablen der funktion werden ungültig, freigegeben ... d.h. die runtime kann den Speicher weiterverwenden / überschreiben ....</p>
<p>Wie gasagt, das da &quot;noch&quot; 2 drinne steht ist Glück. Wenn dein programm mehr machen würde, würde die runtime den speicher wieder verwenden und dann könnt irgendwas drinnstehen -&gt; undefiniertes verhalten. Und sowas lieben Entwickler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Für Lern- und Verständnisszwecke ist diese Pointer-Orgie ganz ok <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="🙂"
    /><br />
Aber &quot;normal&quot; arbeitest in C++ mehr mit Referenzen und &quot;verpackte&quot; pointer.<br />
Nur wenn C-Api's bedienen musst, musst dich oft mit pointer of pointer auseinandersetzen.</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457165</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Fri, 19 Jun 2015 08:08:56 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Fri, 19 Jun 2015 08:20:33 GMT]]></title><description><![CDATA[<p>Danke,ja das Beispiel ist schlecht gewählt. In meinem richtigen Programm zeigt der Pointer auf den Heap. Habs hier nur mal so zur Vereinfachung gemacht.</p>
<p>Ich weiß jetzt auch was ich genau nicht verstanden habe:</p>
<p>Ich habe immer gedacht wenn ich einen Doppelpointer definiere, dann ist dieser an sich schon ein zweiteiliges Gebilde(also Pointer auf Pointer). Aber er ist tatsächlich nur ein Teil dieses Gebilde, nämlich der erste Pointer. Danach muss eben noch der zweite Pointer (pPointer1) kommen.<br />
Deswegen war ich so verwirtt, dass ich über den Dereferenzierungsoperator auf pPointer1 zugreife.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2457168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457168</guid><dc:creator><![CDATA[bacon]]></dc:creator><pubDate>Fri, 19 Jun 2015 08:20:33 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Fri, 19 Jun 2015 08:24:15 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Wie gasagt, das da &quot;noch&quot; 2 drinne steht ist Glück. Wenn dein programm mehr machen würde, würde die runtime den speicher wieder verwenden und dann könnt irgendwas drinnstehen -&gt; undefiniertes verhalten. Und sowas lieben Entwickler <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p>Nicht nur das. Schon wenn man nur foo alleine betrachtet ist schon klar, dass jedweder spätere Zugriff über den übergebenen Zeiger auf die lokale Variable undefiniert sein wird. Ein cleverer Compiler kann und wird das sehen und bei entsprechenden Optimierungseinstellungen den ganzen Inhalt der Funktion weg optimieren. Das einzig beobachtbare Verhalten der Funktion wäre schließlich solch ein undefinierter Zugriff, sofern er denn erfolgt. Nichts zu tun ist eine besonders effiziente Art, sich undefiniert zu verhalten.</p>
<p>Es besteht dann also nicht nur die Gefahr, dass die 2 zwischendurch überschrieben wird: Die 2 ist überhaupt nie da!</p>
<p>(Und natürlich würde Arcoths selbstentwickelter Compiler an der Stelle Code zur Festplattenformatierung einfügen, bloß um zu zeigen, dass dies auch konformes Verhalten ist <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/2457170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2457170</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Fri, 19 Jun 2015 08:24:15 GMT</pubDate></item></channel></rss>