<?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[Speicherort mit Zeigern verändern]]></title><description><![CDATA[<p>Hey, ich bin gerade bei den Zeigern in meinem C++ angekommen und bin auf folgenden Code im Buch gestoßen:</p>
<pre><code class="language-cpp">// Listing 11.5 Zeigt die Übergabe als Referenz
 #include &lt;iostream&gt;

 void swap(int *x, int *y);
 // Das &quot;*&quot; besagt, dass die Funktion Zeiger erwartet.
 int main()
 {
     int x = 5, y = 10;

     std::cout &lt;&lt; &quot;Main. Vor Vertauschung, x: &quot; &lt;&lt; x
                                 &lt;&lt; &quot; y: &quot; &lt;&lt; y &lt;&lt; &quot;\n&quot;;
     swap(&amp;x,&amp;y);
     std::cout &lt;&lt; &quot;Main. Nach Vertauschung, x: &quot; &lt;&lt; x
                                &lt;&lt; &quot; y: &quot; &lt;&lt; y &lt;&lt; &quot;\n&quot;;
     return 0;
 }

 void swap (int *px, int *py)
 {
      int temp;

      std::cout &lt;&lt; &quot;Swap. Vor Vertauschung, *px: &quot; &lt;&lt; *px
                                  &lt;&lt; &quot; *py: &quot; &lt;&lt; *py &lt;&lt; &quot;\n&quot;;

      temp = *px;
      *px = *py;
      *py = temp;

      std::cout &lt;&lt; &quot;Swap. Nach Vertauschung, *px: &quot; &lt;&lt; *px
                                 &lt;&lt; &quot; *py: &quot; &lt;&lt; *py &lt;&lt; &quot;\n&quot;;
 }
</code></pre>
<p>Dieses Programm vertauscht ja die Werte X und Y über die Funktion swap(), indem die HeapStandpunkte von X und Y mit &amp;X und Y&amp; an die swap() weitergegeben. Dort werden aber lediglich die Argumente Vertauscht und nicht die tatsächlichen HeapStandpunkte.</p>
<p>Ich habe in folgender Modifizierten Datei versucht die HeapStandorte auf die die Pointer px und py in swap() verweisen, zu verändern. Dies ist mir aber nur in der Funktion swap() gelungen und anschließend nicht mehr in der Funktion main().</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

 void swap(int *x, int *y);

 int main()
 {
     int x = 5, y = 10;

     std::cout &lt;&lt; &quot;Main. Vor Vertauschung, x: &quot; &lt;&lt; &amp;x
                                 &lt;&lt; &quot; y: &quot; &lt;&lt; &amp;y &lt;&lt; &quot;\n&quot;;
     swap(&amp;x,&amp;y);
     std::cout &lt;&lt; &quot;Main. Nach Vertauschung, x: &quot; &lt;&lt; &amp;x
                                &lt;&lt; &quot; y: &quot; &lt;&lt; &amp;y &lt;&lt; &quot;\n&quot;;
     return 0;
 }

 void swap (int *px, int *py)
 {
      int *temp = new int;

      std::cout &lt;&lt; &quot;Swap. Vor Vertauschung, *px: &quot; &lt;&lt; px
                                  &lt;&lt; &quot; *py: &quot; &lt;&lt; py &lt;&lt; &quot;\n&quot;;

      temp = px;
      px = py;
      py = temp;

      std::cout &lt;&lt; &quot;Swap. Nach Vertauschung, *px: &quot; &lt;&lt; px
                                 &lt;&lt; &quot; *py: &quot; &lt;&lt; py &lt;&lt; &quot;\n&quot;;
 }
</code></pre>
<p>Kann man diese Standorte denn irgendwie verändern?</p>
<p>Gruß Dominik,</p>
<p>PS: Sorry für meine lückenhafte Fachsprache, falls ich Fehler mache bitte korrigieren, ist mir wichtig!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279891/speicherort-mit-zeigern-verändern</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 08:05:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279891.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 05 Jan 2011 17:13:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 17:16:56 GMT]]></title><description><![CDATA[<p>Hey, ich bin gerade bei den Zeigern in meinem C++ angekommen und bin auf folgenden Code im Buch gestoßen:</p>
<pre><code class="language-cpp">// Listing 11.5 Zeigt die Übergabe als Referenz
 #include &lt;iostream&gt;

 void swap(int *x, int *y);
 // Das &quot;*&quot; besagt, dass die Funktion Zeiger erwartet.
 int main()
 {
     int x = 5, y = 10;

     std::cout &lt;&lt; &quot;Main. Vor Vertauschung, x: &quot; &lt;&lt; x
                                 &lt;&lt; &quot; y: &quot; &lt;&lt; y &lt;&lt; &quot;\n&quot;;
     swap(&amp;x,&amp;y);
     std::cout &lt;&lt; &quot;Main. Nach Vertauschung, x: &quot; &lt;&lt; x
                                &lt;&lt; &quot; y: &quot; &lt;&lt; y &lt;&lt; &quot;\n&quot;;
     return 0;
 }

 void swap (int *px, int *py)
 {
      int temp;

      std::cout &lt;&lt; &quot;Swap. Vor Vertauschung, *px: &quot; &lt;&lt; *px
                                  &lt;&lt; &quot; *py: &quot; &lt;&lt; *py &lt;&lt; &quot;\n&quot;;

      temp = *px;
      *px = *py;
      *py = temp;

      std::cout &lt;&lt; &quot;Swap. Nach Vertauschung, *px: &quot; &lt;&lt; *px
                                 &lt;&lt; &quot; *py: &quot; &lt;&lt; *py &lt;&lt; &quot;\n&quot;;
 }
</code></pre>
<p>Dieses Programm vertauscht ja die Werte X und Y über die Funktion swap(), indem die HeapStandpunkte von X und Y mit &amp;X und Y&amp; an die swap() weitergegeben. Dort werden aber lediglich die Argumente Vertauscht und nicht die tatsächlichen HeapStandpunkte.</p>
<p>Ich habe in folgender Modifizierten Datei versucht die HeapStandorte auf die die Pointer px und py in swap() verweisen, zu verändern. Dies ist mir aber nur in der Funktion swap() gelungen und anschließend nicht mehr in der Funktion main().</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

 void swap(int *x, int *y);

 int main()
 {
     int x = 5, y = 10;

     std::cout &lt;&lt; &quot;Main. Vor Vertauschung, x: &quot; &lt;&lt; &amp;x
                                 &lt;&lt; &quot; y: &quot; &lt;&lt; &amp;y &lt;&lt; &quot;\n&quot;;
     swap(&amp;x,&amp;y);
     std::cout &lt;&lt; &quot;Main. Nach Vertauschung, x: &quot; &lt;&lt; &amp;x
                                &lt;&lt; &quot; y: &quot; &lt;&lt; &amp;y &lt;&lt; &quot;\n&quot;;
     return 0;
 }

 void swap (int *px, int *py)
 {
      int *temp = new int;

      std::cout &lt;&lt; &quot;Swap. Vor Vertauschung, *px: &quot; &lt;&lt; px
                                  &lt;&lt; &quot; *py: &quot; &lt;&lt; py &lt;&lt; &quot;\n&quot;;

      temp = px;
      px = py;
      py = temp;

      std::cout &lt;&lt; &quot;Swap. Nach Vertauschung, *px: &quot; &lt;&lt; px
                                 &lt;&lt; &quot; *py: &quot; &lt;&lt; py &lt;&lt; &quot;\n&quot;;
 }
</code></pre>
<p>Kann man diese Standorte denn irgendwie verändern?</p>
<p>Gruß Dominik,</p>
<p>PS: Sorry für meine lückenhafte Fachsprache, falls ich Fehler mache bitte korrigieren, ist mir wichtig!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002809</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002809</guid><dc:creator><![CDATA[Kanikkl]]></dc:creator><pubDate>Wed, 05 Jan 2011 17:16:56 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 17:28:23 GMT]]></title><description><![CDATA[<p>Nein kann man nicht. Es geht nur so wie du es oben gemacht hast.</p>
<p>mfg Calk</p>
<p>Edit: Sag statt Heapstandorte lieber Speicherorte der Variablen, das verstehen dann auch die weniger Gebildeten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002814</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002814</guid><dc:creator><![CDATA[Calk]]></dc:creator><pubDate>Wed, 05 Jan 2011 17:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 17:34:12 GMT]]></title><description><![CDATA[<p>Calk schrieb:</p>
<blockquote>
<p>...<br />
Edit: Sag statt Heapstandorte lieber Speicherorte der Variablen, das verstehen dann auch die weniger Gebildeten...</p>
</blockquote>
<p>:D:D Okayy, ich merk mir aber beides <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>/close</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002824</guid><dc:creator><![CDATA[Kanikkl]]></dc:creator><pubDate>Wed, 05 Jan 2011 17:34:12 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 17:57:42 GMT]]></title><description><![CDATA[<p>Man kann die Zeiger durchaus verändern, wenn man bei swap statt Zeiger Referenzen auf Zeiger übergibgt.</p>
<pre><code class="language-cpp">void swap(int *&amp;x, int *&amp;y);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2002833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002833</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Jan 2011 17:57:42 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 18:02:23 GMT]]></title><description><![CDATA[<p>Gut, aber wofür braucht man so etwas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002838</guid><dc:creator><![CDATA[Calk]]></dc:creator><pubDate>Wed, 05 Jan 2011 18:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 18:29:26 GMT]]></title><description><![CDATA[<p>Calk schrieb:</p>
<blockquote>
<p>Gut, aber wofür braucht man so etwas?</p>
</blockquote>
<p>Warum sollte eine swap Funktion nicht auch zwei Zeiger tauschen können.<br />
Orginal nimmt man hier aber eher ein template.<br />
oder meinst du Referenzen auf Zeiger im Allgemeinen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002848</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Wed, 05 Jan 2011 18:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 18:55:58 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1387">@Braunstein</a>: Allerdings kann man eine solche Funktion dann nicht mehr als</p>
<pre><code class="language-cpp">swap(&amp;x, &amp;y)
</code></pre>
<p>aufrufen - temporäre Ausdrücke können nur an konstante Referenzen gebunden werden, was ja auch logisch ist.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25133">@Kanikkl</a>: Deine modifizierte Version leckt Speicher, temp wird nie aufgeräumt. Übrigens haben x und y in main keinen &quot;Heapstandort&quot;, weil es sich um Stackvariablen handelt. px und py in swap zeigen dementsprechend auch nicht in den Heap, sondern in den Stack.</p>
<p>Während Speicherverwaltung auf dem Heap eine einigermaßen komplizierte Sache ist, geschieht bei Stackvariablen (in Bezug auf Speicherverwaltung; Kon- und Destruktoren werden natürlich auch ausgeführt) nicht viel mehr, als bei einem Funktionsaufruf den Stackrahmen etwas nach unten und beim Verlassen der Funktion wieder nach oben zu verschieben. x und y bezeichnen dann jeweils ein paar Byte im neu erschlossenen Speicher, und es gibt keinerlei Zeiger, die vertauscht werden könnten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002862</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002862</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 05 Jan 2011 18:55:58 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 19:05:00 GMT]]></title><description><![CDATA[<p>Zum thema Leakn, ja man müsste temp noch deleten, wenn ich das richtig in Erinnerung habe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
<p>Wie gesagt, das war nur ein Beispiel ausm Buch und ich dachte, das müsste doch auch noch anders gehen :P. Ich bin einfach nur stark begeistert von der Materie und zieh mir das bis zum Umfallen rein <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>So oder so, ist das nur ein Beispiel für den Einsatz von Zeigern, bzw von Referenzen und wozu man die braucht, habe ich später im Kapitel kennen gelernt. Da Funktionen nur einen Wert ausgeben können, benutzt man Referenzen, um diese an die Funktion zu übergeben und in ihnen ein Argument zu speichern. Damit kann man mehrere Argumente durch eine Funktion an die aufrufende Funktion übergeben.<br />
-&gt; Das wurde jetzt aber erst später im Kapitel erklärt.</p>
<p>Jedenfalls danke für eure Geduld <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002865</guid><dc:creator><![CDATA[Kanikkl]]></dc:creator><pubDate>Wed, 05 Jan 2011 19:05:00 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 19:37:47 GMT]]></title><description><![CDATA[<p>Du brauchst jein <code>new int</code> machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002883</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 05 Jan 2011 19:37:47 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 19:55:24 GMT]]></title><description><![CDATA[<p>Ah okay, also einfach &quot;int *temp; &quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002892</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002892</guid><dc:creator><![CDATA[Kanikkl]]></dc:creator><pubDate>Wed, 05 Jan 2011 19:55:24 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Wed, 05 Jan 2011 19:58:23 GMT]]></title><description><![CDATA[<p>Ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2002893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2002893</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 05 Jan 2011 19:58:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Thu, 06 Jan 2011 09:52:34 GMT]]></title><description><![CDATA[<p>Eigentlich braucht man überhaupt keine Zeiger, wenn man zwei Werte vertauschen möchte sind zwei Parameter Pflicht, daher finde ich die Verwendung von Referenzen hier deutlich sinnvoller. Vielleicht wurden Referenzen im Buch noch nicht behandelt, hier ist aber trotzdem die Lösung (im Bewusstsein, dass std::swap bereits existiert):</p>
<pre><code class="language-cpp">void swap( int&amp; op1, int &amp;op2 )
{
   int tmp = op1;
   op1 = op2;
   op2 = tmp;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2003049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003049</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Thu, 06 Jan 2011 09:52:34 GMT</pubDate></item><item><title><![CDATA[Reply to Speicherort mit Zeigern verändern on Thu, 06 Jan 2011 14:55:37 GMT]]></title><description><![CDATA[<p>Kanikkl schrieb:</p>
<blockquote>
<p>Dieses Programm vertauscht ja die Werte X und Y über die Funktion swap(), indem die HeapStandpunkte von X und Y mit &amp;X und Y&amp; an die swap() weitergegeben. Dort werden aber lediglich die Argumente Vertauscht und nicht die tatsächlichen HeapStandpunkte.</p>
</blockquote>
<p>&quot;HeapStandpunkte&quot;, tolles Wort ... <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>Unter einem Heapstandpunkt stelle ich mir die Adresse des Prozessorheaps unter Windows vor, so wie:</p>
<pre><code class="language-cpp">#include &lt;windows.h&gt;
#include &lt;iostream&gt;
using std::cout;

int main()
{
    cout&lt;&lt;&quot;Der Heap des Programms liegt bei: &quot;&lt;&lt;GetProcessHeap()&lt;&lt;'\n';
    return 0;
}
</code></pre>
<p>Tatsächlich redet man aber eher von Adressen ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Zu deinem Problem: Wenn man Zeiger übergibt, muss man sich erst mal klarmachen, was Zeiger überhaupt sind. Zeiger sind ganz normale Variablen. Theoretisch könnte man durch einen Cast jeden Zeiger in eine <code>unsigned __int32</code> - oder (wenn der Prozess 64 Bit unterstützt) <code>unsigned __int64</code> -Variable packen - auch Funktionszeiger (habe ich selbst mal gemacht, weil eine Scriptsprache keine Zeiger kannte, aber, wenn die Adressen bekannt sind, Funktionen im Speicher aufrufen konnte). Dadurch untergräbst du allerdings die Typensicherheit des Compilers ...</p>
<p>Zeiger sind Variablen. Ihre Werte können allerdings als Adressen interpretiert werden, und diese Adressen beinhalten unter Umständen wichtige Daten. Worauf ein Zeiger zeigt, weiß er selbst nicht, das tut nur der Compiler, der dafür sorgt, dass man nicht unachtsam den Zeiger ändert. Daher kann ein Zeiger die Adresse eines Objekts beinhalten, welches auf dem Stack liegt - aber auch auf Elemente auf dem Heap.</p>
<p>Parameterübergabe bedeutet, dass das angegebene Objekt kopiert (!) wird und an die aufgerufene Funktion übergeben wird - das passiert bei allen Objekten, die man übergibt, auch bei Zeigern (außer bei Referenzen, glaube ich, aber die verwende ich nie, daher kann ich wenig über DIE sagen).</p>
<p>Folgendes Beispiel:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using std::cout;

void CopyPointer(int*Pointer)
{
    cout&lt;&lt;&quot;Der Wert des Objektes: &quot;&lt;&lt;*Pointer&lt;&lt;'\n';
    cout&lt;&lt;&quot;Der Wert des Zeigers (Adresse des gesicherten Objekts): &quot;&lt;&lt;Pointer&lt;&lt;'\n';
    cout&lt;&lt;&quot;Die Adresse des Zeigers: &quot;&lt;&lt;&amp;Pointer&lt;&lt;&quot;\n\n&quot;;
}

int main()
{
    int First=5,*Second=&amp;First,*Third=new int(10);

    cout&lt;&lt;&quot;Der Wert des Objektes: &quot;&lt;&lt;First&lt;&lt;'\n';
    cout&lt;&lt;&quot;Der Wert des Zeigers (Adresse des gesicherten Objekts): &quot;&lt;&lt;&amp;First&lt;&lt;&quot;\n\n&quot;;

    cout&lt;&lt;&quot;Der Wert des Objektes: &quot;&lt;&lt;*Second&lt;&lt;'\n';
    cout&lt;&lt;&quot;Der Wert des Zeigers (Adresse des gesicherten Objekts): &quot;&lt;&lt;Second&lt;&lt;'\n';
    cout&lt;&lt;&quot;Die Adresse des Zeigers: &quot;&lt;&lt;&amp;Second&lt;&lt;&quot;\n\n&quot;;

    cout&lt;&lt;&quot;Der Wert des Objektes: &quot;&lt;&lt;*Third&lt;&lt;'\n';
    cout&lt;&lt;&quot;Der Wert des Zeigers (Adresse des gesicherten Objekts): &quot;&lt;&lt;Third&lt;&lt;'\n';
    cout&lt;&lt;&quot;Die Adresse des Zeigers: &quot;&lt;&lt;&amp;Third&lt;&lt;&quot;\n\n&quot;;

    CopyPointer(&amp;First);//Adresse der Variablen.
    CopyPointer(Second);//Wert des Zeigers, entspricht der Adresse von First.
    CopyPointer(Third);//Adresse des Objektes auf dem Heap.

    delete Third;//Zeigt auf Speicher auf dem Heap ...
    return 0;
}
</code></pre>
<p>In beiden Funktionen bleiben die Werte der dereferenzierten Objekte und die Werte der Zeiger gleich, aber die Adressen der Zeiger selbst sind in <code>main</code> und <code>CopyPointer</code> unterschiedliche. Die Objekte, auf die die Zeiger zeigen, bleiben die selben und werden NICHT kopiert, aber die Zeiger selbst werden kopiert. Daher kann man in <code>CopyPointer</code>  <code>Pointer</code> alles zuweisen, was man will, auf den Zeiger in <code>main</code> hat das keine Auswirkungen (es sei denn, man manipuliert das Objekt, auf das die Zeiger verweisen, aber selbst dann bleibt der Zeiger auf dieses Objekt fixiert).</p>
<p>Wenn man also die Werte der Zeiger ändern will, sodass auch <code>main</code> davon weiß, braucht man Referenzen auf Zeiger (habe ich zumindest in Erinnerung):</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using std::cout;

void swap(int*&amp;X,int*&amp;Y)//Oder '&amp;*'? Ich versuche normalerweise, Referenzen so weit wie möglich zu vermeiden ...
{
    int*Temp;

    std::cout&lt;&lt;&quot;swap - vor Vertauschung: *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - vor Vertauschung: X: &quot;&lt;&lt;X&lt;&lt;&quot;, Y: &quot;&lt;&lt;Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - vor Vertauschung: &amp;X: &quot;&lt;&lt;&amp;X&lt;&lt;&quot;, &amp;Y: &quot;&lt;&lt;&amp;Y&lt;&lt;&quot;\n\n&quot;;

    Temp=X;
    X=Y;
    Y=Temp;

    std::cout&lt;&lt;&quot;swap - nach Vertauschung: *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - nach Vertauschung: X: &quot;&lt;&lt;X&lt;&lt;&quot;, Y: &quot;&lt;&lt;Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - nach Vertauschung: &amp;X: &quot;&lt;&lt;&amp;X&lt;&lt;&quot;, &amp;Y: &quot;&lt;&lt;&amp;Y&lt;&lt;&quot;\n\n&quot;;
}

int main()
{
    //X und Y brauchen wir auf dem Heap, da wir richtige Zeiger übergeben
    //müssen. Funktionen, die Referenzen verwenden, brauchen ein Objekt, auf
    //das sie sich mit einer Adresse beziehen können, und ein temporär
    //übergebenes Objekt reicht da nicht, wir brauchen Speicher ...
    int*X=new int(5),*Y=new int(10);

    std::cout&lt;&lt;&quot;main - vor Vertauschung. *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - vor Vertauschung. X: &quot;&lt;&lt;X&lt;&lt;&quot;, Y: &quot;&lt;&lt;Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - vor Vertauschung. &amp;X: &quot;&lt;&lt;&amp;X&lt;&lt;&quot;, &amp;Y: &quot;&lt;&lt;&amp;Y&lt;&lt;&quot;\n\n&quot;;

    //Jetzt übergeben wir eine Referenz auf die Werte der Zeiger ...
    //Das ist jetzt schon ziemlich komplexes C++ ...
    swap(X,Y);//Übergibt die Adressen als Referenzen. Alles, was wir den Zeigern in swap machen, hat Auswirkungen auf die Zeiger in main ...

    std::cout&lt;&lt;&quot;main - nach Vertauschung. *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - nach Vertauschung. X: &quot;&lt;&lt;X&lt;&lt;&quot;, Y: &quot;&lt;&lt;Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - nach Vertauschung. &amp;X: &quot;&lt;&lt;&amp;X&lt;&lt;&quot;, &amp;Y: &quot;&lt;&lt;&amp;Y&lt;&lt;&quot;\n\n&quot;;
    return 0;
}
</code></pre>
<p>Ich habe es nicht ausprobiert oder kompiliert, aber es sollte so funktionieren. Vielleicht ein oder zwei Rechtschreibfehler oder das &quot;<em>&amp;&quot; in &quot;&amp;</em>&quot; ändern, aber das Grundgerüst steht.</p>
<p>Hierbei übergibt man die Adressen der Objekte als Referenzen - wenn man diese ändert, ändert sich auch das Original. Aber moment mal, während ich das schreibe, fällt mir ein, dass das Ganze auch mit Zeigern auf Zeiger funktioniert ...</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
using std::cout;

void swap(int**X,int**Y)
{
    int*Temp;

    //ACHTUNG: X ist ein Zeiger auf unsere Zeiger in main, X in swap gleicht
    //also der Adresse von X in main ... ziemlich komplex eben.

    std::cout&lt;&lt;&quot;swap - vor Vertauschung: **X: &quot;&lt;&lt;**X&lt;&lt;&quot;, **Y: &quot;&lt;&lt;**Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - vor Vertauschung: *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - vor Vertauschung: &amp;(*X): &quot;&lt;&lt;&amp;(*X)&lt;&lt;&quot;, &amp;(*Y): &quot;&lt;&lt;&amp;(*Y)&lt;&lt;&quot;\n\n&quot;;

    *Temp=*X;
    *X=*Y;
    *Y=*Temp;

    std::cout&lt;&lt;&quot;swap - nach Vertauschung: **X: &quot;&lt;&lt;**X&lt;&lt;&quot;, **Y: &quot;&lt;&lt;**Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - nach Vertauschung: *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;swap - nach Vertauschung: &amp;(*X): &quot;&lt;&lt;&amp;(*X)&lt;&lt;&quot;, &amp;(*Y): &quot;&lt;&lt;&amp;(*Y)&lt;&lt;&quot;\n\n&quot;;
}

int main()
{
    int*X=new int(5),*Y=new int(10);

    std::cout&lt;&lt;&quot;main - vor Vertauschung. *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - vor Vertauschung. X: &quot;&lt;&lt;X&lt;&lt;&quot;, Y: &quot;&lt;&lt;Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - vor Vertauschung. &amp;X: &quot;&lt;&lt;&amp;X&lt;&lt;&quot;, &amp;Y: &quot;&lt;&lt;&amp;Y&lt;&lt;&quot;\n\n&quot;;

    //Jetzt übergeben wir die Adressen der Zeiger, also Zeiger auf Zeiger ...
    //Das ist noch komplexer, zumindest von der Syntax her ...
    swap(&amp;X,&amp;Y);

    std::cout&lt;&lt;&quot;main - nach Vertauschung. *X: &quot;&lt;&lt;*X&lt;&lt;&quot;, *Y: &quot;&lt;&lt;*Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - nach Vertauschung. X: &quot;&lt;&lt;X&lt;&lt;&quot;, Y: &quot;&lt;&lt;Y&lt;&lt;'\n';
    std::cout&lt;&lt;&quot;main - nach Vertauschung. &amp;X: &quot;&lt;&lt;&amp;X&lt;&lt;&quot;, &amp;Y: &quot;&lt;&lt;&amp;Y&lt;&lt;&quot;\n\n&quot;;
    return 0;
}
</code></pre>
<p>Hierbei werden die Adressen der Zeiger (nicht die Werte) übergeben. Dadurch werden die Adressen der Zeiger nicht kopiert, und Manipulationen betreffen auch das Original. Allerdings wirst du es nicht schaffen, einen Zeiger auf X in <code>main</code> zu erstellen und ihn dann in <code>swap</code> zu manipulieren, dafür brauchst du Zeiger auf Zeiger auf Zeiger ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Mir egal, welche Version du verwendest, beide sollten funktionieren. Ich hoffe nur, ich konnte helfen ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2003179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2003179</guid><dc:creator><![CDATA[Der aus dem Westen ...]]></dc:creator><pubDate>Thu, 06 Jan 2011 14:55:37 GMT</pubDate></item></channel></rss>