<?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[Zeiger als Parameter von Funktionen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe da ein kleines Verständnisproblem was Zeiger als Parameter von Funktionen angeht.</p>
<p>Hier einmal 4 Prototypen und der Funktionsaufruf:</p>
<p>Beispiel1:</p>
<pre><code>void increment(int *intZeiger);
increment(&amp;value);
</code></pre>
<p>Das erscheint mir noch logisch. Beim Aufruf wird der Funktion die Speicheradresse von value übergeben. Diese wird dann in den Zeiger *intZeiger kopiert.</p>
<p>Beispiel2:</p>
<pre><code>void increment(int *intZeiger);
increment(valueZeiger);
</code></pre>
<p>valueZeiger ist hier ein Zeiger auf einen Integer, dessen Adresse wird beim Aufruf übergeben und anschließend in *intZeiger gespeichert. Soweit ist auch noch alles klar. Verwirrend finde ich, dass valueZeiger ja die Speicheradresse meint und *intZeiger den Wert, welcher gespeichert wurde. Auch wenn das * verwirrend ist, muss ja klar sein, dass es sich um einen Zeiger handelt.</p>
<p>Beispiel3:</p>
<pre><code>void increment(int &amp;intParameter);
increment(value);
</code></pre>
<p>Hier wird bei Aufruf der Integer übergeben. Was hier beim Aufruf wohin kopiert ist mir ein Rätsel. Für mich sieht es so aus, als würde der Intwert von value in eine Adresse kopiert werden (wegen dem Ampersand).</p>
<p>Beispiel4:</p>
<pre><code>void increment(int **intZeiger);
increment(&amp;valueZeiger);
</code></pre>
<p>Was hier geschieht ist mir ein totales Rätsel. Die Adresse eines Zeigers wird in den Zeiger auf einen Zeiger gespeichert?!</p>
<p>Mein Problem: Beispiel 3 und Beispiel 4 kann ich mir nicht wirklich erklären. Könnte mir vllt. jemand helfen und mir sagen, was da auf dem Stack los ist? Ich komme eigtl. aus dem Bereich Java, daher habe ich recht wenig bis keine Erfahrungen mit Zeigern.</p>
<p>Als Anhang Poste ich noch einmal alle Programme.</p>
<pre><code>Beispiel 1:

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int *intZeiger)
{
  (*intZeiger)++;
}

int main(int argc, char *argv[])
{
    int value = 1;
    increment(&amp;value);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}

Beispiel 2:

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int *intZeiger)
{
  (*intZeiger)++;
}

int main(int argc, char *argv[])
{
    int value = 1;

    int *valueZeiger = 0;
    valueZeiger = &amp;value;

    increment(valueZeiger);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}

Beispiel 3: 

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int &amp;intZeiger)
{
  intZeiger++;
}

int main(int argc, char *argv[])
{
    int value = 1;

    increment(value);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}

Beispiel 3:

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int **intZeiger)
{
  (**intZeiger)++;
}

int main(int argc, char *argv[])
{
    int value = 1;

    int *valueZeiger = 0;
    valueZeiger = &amp;value;

    increment(&amp;valueZeiger);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Vielen Dank !</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/314131/zeiger-als-parameter-von-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 15:51:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314131.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 21 Feb 2013 14:38:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 14:38:05 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe da ein kleines Verständnisproblem was Zeiger als Parameter von Funktionen angeht.</p>
<p>Hier einmal 4 Prototypen und der Funktionsaufruf:</p>
<p>Beispiel1:</p>
<pre><code>void increment(int *intZeiger);
increment(&amp;value);
</code></pre>
<p>Das erscheint mir noch logisch. Beim Aufruf wird der Funktion die Speicheradresse von value übergeben. Diese wird dann in den Zeiger *intZeiger kopiert.</p>
<p>Beispiel2:</p>
<pre><code>void increment(int *intZeiger);
increment(valueZeiger);
</code></pre>
<p>valueZeiger ist hier ein Zeiger auf einen Integer, dessen Adresse wird beim Aufruf übergeben und anschließend in *intZeiger gespeichert. Soweit ist auch noch alles klar. Verwirrend finde ich, dass valueZeiger ja die Speicheradresse meint und *intZeiger den Wert, welcher gespeichert wurde. Auch wenn das * verwirrend ist, muss ja klar sein, dass es sich um einen Zeiger handelt.</p>
<p>Beispiel3:</p>
<pre><code>void increment(int &amp;intParameter);
increment(value);
</code></pre>
<p>Hier wird bei Aufruf der Integer übergeben. Was hier beim Aufruf wohin kopiert ist mir ein Rätsel. Für mich sieht es so aus, als würde der Intwert von value in eine Adresse kopiert werden (wegen dem Ampersand).</p>
<p>Beispiel4:</p>
<pre><code>void increment(int **intZeiger);
increment(&amp;valueZeiger);
</code></pre>
<p>Was hier geschieht ist mir ein totales Rätsel. Die Adresse eines Zeigers wird in den Zeiger auf einen Zeiger gespeichert?!</p>
<p>Mein Problem: Beispiel 3 und Beispiel 4 kann ich mir nicht wirklich erklären. Könnte mir vllt. jemand helfen und mir sagen, was da auf dem Stack los ist? Ich komme eigtl. aus dem Bereich Java, daher habe ich recht wenig bis keine Erfahrungen mit Zeigern.</p>
<p>Als Anhang Poste ich noch einmal alle Programme.</p>
<pre><code>Beispiel 1:

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int *intZeiger)
{
  (*intZeiger)++;
}

int main(int argc, char *argv[])
{
    int value = 1;
    increment(&amp;value);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}

Beispiel 2:

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int *intZeiger)
{
  (*intZeiger)++;
}

int main(int argc, char *argv[])
{
    int value = 1;

    int *valueZeiger = 0;
    valueZeiger = &amp;value;

    increment(valueZeiger);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}

Beispiel 3: 

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int &amp;intZeiger)
{
  intZeiger++;
}

int main(int argc, char *argv[])
{
    int value = 1;

    increment(value);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}

Beispiel 3:

#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void increment(int **intZeiger)
{
  (**intZeiger)++;
}

int main(int argc, char *argv[])
{
    int value = 1;

    int *valueZeiger = 0;
    valueZeiger = &amp;value;

    increment(&amp;valueZeiger);
    cout &lt;&lt; &quot;Value: &quot; &lt;&lt; value &lt;&lt; endl;
    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Vielen Dank !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300625</guid><dc:creator><![CDATA[mawilab]]></dc:creator><pubDate>Thu, 21 Feb 2013 14:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 14:54:24 GMT]]></title><description><![CDATA[<p>mawilab schrieb:</p>
<blockquote>
<p>Verwirrend finde ich, dass valueZeiger ja die Speicheradresse meint und *intZeiger den Wert, welcher gespeichert wurde.</p>
</blockquote>
<p>Das ist komplizierter, als es sich anhört. Tatsächlich geht es immer darum, wie du die Bytes, auf die diese Zeiger zeigen, interpretierst. Daher sind Zeiger-Casts, sprich Casts, die den Typ auf <strong>den</strong> der Zeiger zeigt ändern, sehr gefährlich. Das kann schnell zum Programmabsturz führen.</p>
<p>mawilab schrieb:</p>
<blockquote>
<p>Auch wenn das * verwirrend ist, muss ja klar sein, dass es sich um einen Zeiger handelt.</p>
</blockquote>
<p>Du redest jetzt von der Dereferenzierung, und nicht von der Deklaration, oder? Aber was ist daran verwirrend?</p>
<p>mawilab schrieb:</p>
<blockquote>
<p>Beispiel3:</p>
<pre><code>void increment(int &amp;intParameter);
increment(value);
</code></pre>
<p>Hier wird bei Aufruf der Integer übergeben. Was hier beim Aufruf wohin kopiert ist mir ein Rätsel. Für mich sieht es so aus, als würde der Intwert von value in eine Adresse kopiert werden (wegen dem Ampersand).</p>
</blockquote>
<p>Nein. Das Ampersand, so wie es hier benutzt wird, macht aus <code>intParameter</code> eine <strong>Referenz</strong>, das hat mit Zeigern direkt nichts zu tun.</p>
<p>mawilab schrieb:</p>
<blockquote>
<p>Beispiel4:</p>
<pre><code>void increment(int **intZeiger);
increment(&amp;valueZeiger);
</code></pre>
<p>Was hier geschieht ist mir ein totales Rätsel. Die Adresse eines Zeigers wird in den Zeiger auf einen Zeiger gespeichert?!</p>
</blockquote>
<p>Ja... ^^</p>
<p>mawilab schrieb:</p>
<blockquote>
<p>Mein Problem: Beispiel 3 und Beispiel 4 kann ich mir nicht wirklich erklären. Könnte mir vllt. jemand helfen und mir sagen, was da auf dem Stack los ist? Ich komme eigtl. aus dem Bereich Java, daher habe ich recht wenig bis keine Erfahrungen mit Zeigern.</p>
</blockquote>
<p><strong>Das erklärt alles.</strong> <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>Rohe Zeiger wirst du in C++ fast nie finden. Gerade mehrfache Indirektion wird in C++ eigentlich gar nicht verwendet. Das ist eine C-Sache; mehrfache Indirektion wurde da für mehrdimensionale Arrays verwendet. In C++ gibt es dafür viel bessere Lösungen.</p>
<p>Trotzdem ist es natürlich gut, bzw. wichtig Zeigerarithmetik zu verstehen.<br />
Aber das du nicht weißt, was Referenzen sind ist kritisch. Da empfehle ich dir ein <a href="http://www.c-plusplus.net/forum/310212" rel="nofollow">Grundlagenbuch</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300631</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 21 Feb 2013 14:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 14:50:23 GMT]]></title><description><![CDATA[<p>Zu Beispiel 3:<br />
Die Funktion erwartet eine Referenz auf einen int.<br />
Referenzen sind wie Zeiger, nur braucht man für den Wertzugriff nicht den *-Operator, sondern kann einfach den Namen der Variablen verwenden (wie bei normalen ints auch).<br />
Zur Übergabe muss man auch nicht die Adresse einer Variable angeben, sondern der Name reicht. Das ist zum einfacherern Übergeben Call by Reference.</p>
<p>Zu Beispiel 4:<br />
int *zeiger, ist ein Zeiger auf int.<br />
int **zeiger, ist ein Zeiger, der auf einen Zeiger zeigt, der auf ein int zeigt.<br />
int ***zeiger, ist ein Zeiger, der auf einen Zeiger zeigt, der auf einen Zeiger zeigt, der auf einen int zeigt.<br />
int *zeiger = &amp;wert, initalisiert einen Zeiger mit der Adresse von wert.<br />
int *zeigeraufzeiger = &amp;zeiger, initialisiert einen Zeiger auf einen Zeiger mit der Adresse von zeiger.<br />
int *zeigeraufzeigeraufezeiger,...<br />
Übergeben wird einfach nur die Adresse eines Zeigers an einen solchen Zeiger.<br />
*zeiger = 5, greift auf den Wert von zeiger zu.<br />
*zeigeraufzeiger = ..., greift auf den Wert eines Zeigers auf einen Zeiger zu.<br />
*(*zeigeraufzeiger) = ..., greift auf den Wert zu auf den der zeigeraufzeiger zeigt (also auf einen zeiger), auf das Ergebnis wird wiederum * angewandt und man greift auf den Wert des zeigers, auf den zeigeraufzeiger zeigt zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300633</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 21 Feb 2013 14:50:23 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 14:56:01 GMT]]></title><description><![CDATA[<blockquote>
<p><code>int *zeigeraufzeiger = &amp;zeiger</code></p>
</blockquote>
<p>Hast du da nicht ein Sternchen vergessen, und beim nächsten Beispiel auch zwei? <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2300636</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300636</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 21 Feb 2013 14:56:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 15:04:16 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Referenzen sind wie Zeiger</p>
</blockquote>
<p>Ganz so einfach ist es auch nicht ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300642</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 21 Feb 2013 15:04:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 15:09:41 GMT]]></title><description><![CDATA[<p>Belli schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Referenzen sind wie Zeiger</p>
</blockquote>
<p>Ganz so einfach ist es auch nicht ...</p>
</blockquote>
<p>Oh Mist, hab ich übersehen.<br />
Das ist natürlich Blödsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300645</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 21 Feb 2013 15:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 15:13:59 GMT]]></title><description><![CDATA[<p>Ich bin beruhigt, dass Du das noch mal bestätigst ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300648</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Thu, 21 Feb 2013 15:13:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 15:35:27 GMT]]></title><description><![CDATA[<p>Danke schonmal für die Antworten <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>
<p>Ich arbeite mich gerade durch ein Grundlagenbuch durch. Dabei haben sich diese Fragen ergeben, besonders der Zeiger auf einen Zeiger. In einer Musterlösung zu einer Aufgabe wird dieser verwendet, aber vorher und nacher nicht richtig erklärt. Da steht nur, dass der doppelstern benötigt wird, damit die Änderung innerhalb der Funktion auf die Variable durschlägt. So oder so ähnlich stand es da. Den Abschnitt zu den Parametern (zwei seiten weiter vorne) habe ich mir gerade noch einmal durchgelesen.</p>
<p>Ok 1, 2 und 3 habe ich nun verstanden denke ich.</p>
<p>Beispiel 4 hat sich in meinem Kopf auch entknotet. Ich finde es aber immernoch verwirrend.</p>
<p>Daraus ergibt sich eine neue Frage die zum Teil ja schon beantwortet wurde: Wo brauchst man das bzw. wo finden die Beispiele Anwendung. Es führen ja alle zum selben Ergebnis, warum sollte man welche Variante verwenden und warum nicht.</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300659</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300659</guid><dc:creator><![CDATA[mawilab]]></dc:creator><pubDate>Thu, 21 Feb 2013 15:35:27 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 15:45:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich arbeite mich gerade durch ein Grundlagenbuch durch. Dabei haben sich diese Fragen ergeben, besonders der Zeiger auf einen Zeiger. In einer Musterlösung zu einer Aufgabe wird dieser verwendet, aber vorher und nach[h]er nicht richtig erklärt.</p>
</blockquote>
<p>oO</p>
<p>Ich glaube mittlerweile müssten wir mal eine Bücherverbrennung für Programmierfachliteratur organisieren.</p>
<blockquote>
<p>Daraus ergibt sich eine neue Frage die zum Teil ja schon beantwortet wurde: Wo brauchst man das bzw. wo finden die Beispiele Anwendung. Es führen ja alle zum selben Ergebnis, warum sollte man welche Variante verwenden und warum nicht.</p>
</blockquote>
<p>Rohe Zeiger sollten gänzlich vermieden werden. Es heißt nicht, dass man in der Praxis keinen Gebrauch davon macht. Im Gegenteil. Aber man benutzt Referenzen eher als Standard, und Zeiger nur wenn man dazu gezwungen wird.</p>
<p>P.S.: call-by-value ist auch immer eine Möglichkeit <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="😉"
    /> aber es kommt eben drauf an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300661</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 21 Feb 2013 15:45:33 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 16:00:19 GMT]]></title><description><![CDATA[<p>mawilab schrieb:</p>
<blockquote>
<p>Beispiel 4 hat sich in meinem Kopf auch entknotet. Ich finde es aber immernoch verwirrend.</p>
</blockquote>
<pre><code class="language-cpp">void f(){
    int   value               = 1;   
    int*  value_zeiger        = &amp;value;
    int** value_zeiger_zeiger = &amp;value_zeiger;
}

/*
  +-----+        +--------------+            +---------------------+
  |value|        | value_zeiger |            | value_zeiger_zeiger |
  +-----+        +--------------+            +---------------------+
  | int | &lt;------|     int*     | &lt;----------|        int**        |
  +-----+        +--------------+            +---------------------+
  |  1  |        |    &amp;value    |            |     &amp;value_zeiger   |
  +-----+        +--------------+            +---------------------+
*/
void increment(int** ppi){
  /* ppi ist eine Kopie des Funktionsarguments
  /  z.B. bei increment(value_zeiger_zeiger):
     +-------------------+
     |      ppi          |
     +-------------------+
     |      int**        |
     +-------------------+
     |   &amp;value_zeiger   |
     +-------------------+
}
</code></pre>
<p>Wofür man das braucht?<br />
Jedesmal, wenn Du den Wert einer Variable (dritte Zeile in der Grafik oben) in einer Funktion ändern willst. Allerdings sind dafür Referenzen kompakter und weniger fehlerträchtig</p>
<pre><code class="language-cpp">void bieg_zeiger_um(int*&amp; p, int* pp){
  p=pp;
}

void bieg_zeiger_um(int** p, int* pp){
  if(p != nullptr)
    *p=pp;
}

void g(){
 int a = 0;
 int b = 1;
 int* p = &amp;a;
 bieg_zeiger_um(p, &amp;b);  // hin...
 bieg_zeiger_um(&amp;p, &amp;a); // und her...
}
</code></pre>
<p>Ich muss weg: die lokale Hausbrauerei wartet! <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/2300669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300669</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 21 Feb 2013 16:00:19 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 16:12:04 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28547">@Sone</a>, Belli:<br />
Mir ist schon klar, dass Referenzen nicht wie Zeiger sind.<br />
Da die Verwendung in diesem Zweck ähnlich ist, wollte ich den TE nicht weiter verwirren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300678</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 21 Feb 2013 16:12:04 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 16:20:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Wofür man das braucht?<br />
Jedesmal, wenn Du den Wert einer Variable (dritte Zeile in der Grafik oben) in einer Funktion ändern willst. Allerdings sind dafür Referenzen kompakter und weniger fehlerträchtig</p>
</blockquote>
<p>Aber das funktioniert doch auch so wie im Beispiel 1 oder 2. Warum also so umständlich?</p>
<p>Schade, dass ich schon auf Seite 173 bin und noch nie die Bezeichnung &quot;Rohe Zeiger&quot; gehört habe, scheint wichtig zu sein. Ich werde mir merken Referenzen zu verwenden, welchen bislang zwei Seite gewidmet wurden. Naja es folgen ja noch ein paar Seiten evtl. wird ja noch einiges erklärt, sonst stelle ich mein Exemplar gern der erwähnten Verbrennung zur Verfügung!</p>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300684</guid><dc:creator><![CDATA[mawilab]]></dc:creator><pubDate>Thu, 21 Feb 2013 16:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 16:40:43 GMT]]></title><description><![CDATA[<p>Kannste schon dyn. Speicherreservierung?<br />
Wenn notwendig, dann das ganze in einen std::unique_ptr packen oder in einen std::auto_ptr, falls dein Compiler kein C++11 unterstützt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300694</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 21 Feb 2013 16:40:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 18:21:29 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Rohe Zeiger wirst du in C++ fast nie finden. Gerade mehrfache Indirektion wird in C++ eigentlich gar nicht verwendet. Das ist eine C-Sache; mehrfache Indirektion wurde da für mehrdimensionale Arrays verwendet. In C++ gibt es dafür viel bessere Lösungen.</p>
</blockquote>
<p>Warum soll so ein Schwachsinn (Doppelzeiger für Arrays) in C auf einmal akzeptabel sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300728</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300728</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 21 Feb 2013 18:21:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 20:00:56 GMT]]></title><description><![CDATA[<p>Mehrdimensionale Arrays gehen nicht anders?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300792</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300792</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Thu, 21 Feb 2013 20:00:56 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 21:34:07 GMT]]></title><description><![CDATA[<p>mawilab schrieb:</p>
<blockquote>
<blockquote>
<p>Wofür man das braucht?<br />
Jedesmal, wenn Du den Wert einer Variable (dritte Zeile in der Grafik oben) in einer Funktion ändern willst. Allerdings sind dafür Referenzen kompakter und weniger fehlerträchtig</p>
</blockquote>
<p>Aber das funktioniert doch auch so wie im Beispiel 1 oder 2. Warum also so umständlich?</p>
</blockquote>
<p>Die Beispiele sind natuerlich gekuenstelt. Aber der Groschen ist gefallen?!</p>
<p>Einfache Aufgabe:<br />
Eine bestimmte Bakterienkultur verdoppelt sich jeden Zyklus.<br />
Schreib mir doch bitte eine(zwei) Funktion, die die &quot;population&quot; jeweils verdoppelt, so dass das folgende Programm 16 ausgibt.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main(){
  int population=1;
  for(int i=0; i&lt;4; ++i)
    /* hier */
  std::cout &lt;&lt; population &lt;&lt; '\n';
}
</code></pre>
<p>Du wirst merken, dass Du entweder Zeiger, oder Referenzen brauchst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300827</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Thu, 21 Feb 2013 21:34:07 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Thu, 21 Feb 2013 22:15:15 GMT]]></title><description><![CDATA[<p>Ok, hier die erste Lösug ohne zeiger oder Referenz die 16 Aaugibt:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

int verdoppel(int population)
{
  return population * 2;
}

int main(int argc, char *argv[])
{
  int population=1;
  for(int i=0; i&lt;4; ++i)

  population = verdoppel(population);

  std::cout &lt;&lt; population &lt;&lt; '\n';
  system(&quot;PAUSE&quot;);
  return EXIT_SUCCESS;
}
</code></pre>
<p>Bischen gemein, da ich es mit dem Rückgabewert gemacht habe <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>
<p>Nun zu der zweiten Lösung:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void verdoppel(int *popZeiger)
{
  *popZeiger = *popZeiger * 2;
}

int main(int argc, char *argv[])
{
  int population=1;
  int *popZeiger = 0;
  popZeiger = &amp;population;

  for(int i=0; i&lt;4; ++i)

  verdoppel(popZeiger);

  std::cout &lt;&lt; population &lt;&lt; '\n';
  system(&quot;PAUSE&quot;);
  return EXIT_SUCCESS;
}
</code></pre>
<p>Das ist eigtl. klar, die Frage ist warum man es so machen sollte:</p>
<pre><code>#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

void verdoppel(int **popZeiger)
{
  **popZeiger = **popZeiger * 2;
}

int main(int argc, char *argv[])
{
  int population=1;
  int *popZeiger = 0;
  popZeiger = &amp;population;

  for(int i=0; i&lt;4; ++i)

  verdoppel(&amp;popZeiger);

  std::cout &lt;&lt; population &lt;&lt; '\n';
  system(&quot;PAUSE&quot;);
  return EXIT_SUCCESS;
}
</code></pre>
<p>Also mit einem Zeiger auf einen Zeiger <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>
<p>LG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300837</guid><dc:creator><![CDATA[mawilab]]></dc:creator><pubDate>Thu, 21 Feb 2013 22:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 06:14:03 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Rohe Zeiger wirst du in C++ fast nie finden. Gerade mehrfache Indirektion wird in C++ eigentlich gar nicht verwendet. Das ist eine C-Sache; mehrfache Indirektion wurde da für mehrdimensionale Arrays verwendet. In C++ gibt es dafür viel bessere Lösungen.</p>
</blockquote>
<p>Warum soll so ein Schwachsinn (Doppelzeiger für Arrays) in C auf einmal akzeptabel sein?</p>
</blockquote>
<p>Na, für <strong>dynamische mehrdimensionale Arrays</strong> bleibt dir in C doch nichts übrig?</p>
<p>Sry, ich bin kein Cler <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="😃"
    /> aber wie denn sonst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300883</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 22 Feb 2013 06:14:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 09:39:42 GMT]]></title><description><![CDATA[<p>mawilab schrieb:</p>
<blockquote>
<p>Bischen gemein, da ich es mit dem Rückgabewert gemacht habe <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>
</blockquote>
<p>Naja, gemein ist das nicht, und jeder hier würde die Funktion auch genau so schreiben. Das ist in Java so und in C++ nicht anders.</p>
<p>mawilab schrieb:</p>
<blockquote>
<p>Nun zu der zweiten Lösung:</p>
<pre><code>void verdoppel(int *popZeiger)
{
  *popZeiger = *popZeiger * 2;
}
</code></pre>
</blockquote>
<p>Ja. Das war eine Lösung, die ich mir vorgestellt habe: Du willst den Wert von <code>population</code> ändern, also musst Du einen Zeiger auf <code>population</code> benutzen.</p>
<p>mawilab schrieb:</p>
<blockquote>
<p>Das ist eigtl. klar, die Frage ist warum man es so machen sollte:</p>
<pre><code>void verdoppel(int **popZeiger)
{
  **popZeiger = **popZeiger * 2;
}
</code></pre>
<p>Also mit einem Zeiger auf einen Zeiger <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>
</blockquote>
<p>Gibt keinen Grund. Zeiger auf Zeiger sind eher selten. Wie Sone schon angemerkt hat kommen sie bei mehrdimensionalen (ragged) Arrays vor. Manchmal wird argv so deklariert:</p>
<pre><code class="language-cpp">int main(int argc, char** argv){
  // argv[0] bis argv[argc-1] enthalten die Kommandozeilenparameter
}
</code></pre>
<p>Aber um beim Beispiel mit <code>verdoppel</code> zu bleiben: Du brauchst keinen <code>int**</code> um einen <code>int</code> zu ändern - das ist einfach unnötig kompliziert. Siehe mein früheres Beispiel mit <code>bieg_zeiger_um()</code> - da war ein Zeiger auf Zeiger &quot;nötig&quot;.</p>
<p>Um die Referenz hast Du Dich gedrückt - dabei ist das noch &quot;die natürlichste&quot; Art, <code>verdoppel</code> in C++ zu schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300919</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Fri, 22 Feb 2013 09:39:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 11:37:03 GMT]]></title><description><![CDATA[<p>Doppelzeiger &quot;braucht&quot; man in C auch noch, wenn man eine Funktion hat, die einen Zeiger auf ein gültiges Objekt erzeugen soll.</p>
<pre><code class="language-cpp">err_code_t create_some_type_obj(some_type ** p)
{
  some_type * zeiger_auf_gueltiges_some_type_objekt = malloc(...);
  *zeiger_auf_gueltiges_some_type_objekt = irgendwelche_daten;
  //ggf. mehr zeugs
  *p = zeiger_auf_gueltiges_some_type_objekt;
}

//...

some_type * p = 0;
err_code_t err = create_some_type_obj(&amp;p); //hier wird ein some_type Objekt erzeugt
//wenn bei create_some_type_obj alles gut gegangen ist, zeigt p nun nicht mehr auf 0, sondern auf ein gueltiges Objekt
</code></pre>
<p>Ich finde das zwar nicht schön, und würde sofern möglich, mit Rückgabewerten arbeiten, aber in vielen C-APIs sieht man sowas. In C++ braucht man das aber nicht mehr. Da kann man Referenzen benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2300978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2300978</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 22 Feb 2013 11:37:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 13:21:42 GMT]]></title><description><![CDATA[<blockquote>
<p>Rohe Zeiger sollten gänzlich vermieden werden. Es heißt nicht, dass man in der Praxis keinen Gebrauch davon macht. Im Gegenteil. Aber man benutzt Referenzen eher als Standard, und Zeiger nur wenn man dazu gezwungen wird.</p>
</blockquote>
<p>Finde ich nicht. Ich benutze Zeiger sehr gerne wenn ich verdeutlichen möchte dass nur eine Referenz und kein Wert gespeichert wird, weil das mit der C++-Referenzen-Syntax leicht untergehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301003</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 22 Feb 2013 13:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 13:38:41 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>Rohe Zeiger sollten gänzlich vermieden werden. Es heißt nicht, dass man in der Praxis keinen Gebrauch davon macht. Im Gegenteil. Aber man benutzt Referenzen eher als Standard, und Zeiger nur wenn man dazu gezwungen wird.</p>
</blockquote>
<p>Finde ich nicht. Ich benutze Zeiger sehr gerne wenn ich verdeutlichen möchte dass nur eine Referenz und kein Wert gespeichert wird, weil das mit der C++-Referenzen-Syntax leicht untergehen kann.</p>
</blockquote>
<p>Und wobei sind Dir da bis jetzt Probleme entstanden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301013</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301013</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Fri, 22 Feb 2013 13:38:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 13:43:57 GMT]]></title><description><![CDATA[<p>Vermutlich da nicht, abgesehen davon, dass man ein Ampersand mehr braucht und der DAU da aus Versehen einen nullptr übergeben kann.<br />
Das Problem ist eher bei dynamischer Speicherallozierung, dass das u.U. Speicherlecks enstehen können.</p>
<pre><code>foo *f = new foo;
f-&gt;bar();
delete foo;
</code></pre>
<p>Sieht zwar gut aus, aber was machen, wenn bar() wirft?</p>
<pre><code>foo *f = new foo;
try
{
    f-&gt;bar();
}
catch(...)
{
    delete f;
    throw;
}
delete f;
</code></pre>
<p>Ein std::unique_ptr, erledigt das Löschen automatisch.<br />
Anderer Fall:</p>
<pre><code>foo::foo()
: bar1(new bar), bar2(new bar2) {}
</code></pre>
<p>Was machen wenn die Allokierung von bar2 fehlschlägt?<br />
bar1 verbleibt im Speicher.<br />
Und noch viele änliche Situationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301015</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 22 Feb 2013 13:43:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 13:45:25 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>Rohe Zeiger sollten gänzlich vermieden werden. Es heißt nicht, dass man in der Praxis keinen Gebrauch davon macht. Im Gegenteil. Aber man benutzt Referenzen eher als Standard, und Zeiger nur wenn man dazu gezwungen wird.</p>
</blockquote>
<p>Finde ich nicht. Ich benutze Zeiger sehr gerne wenn ich verdeutlichen möchte dass nur eine Referenz und kein Wert gespeichert wird, weil das mit der C++-Referenzen-Syntax leicht untergehen kann.</p>
</blockquote>
<p>Und wobei sind Dir da bis jetzt Probleme entstanden?</p>
</blockquote>
<p>Naja, ich habe beispielsweise eine Klasse, die aus Performancegründen Strings nicht selbst speichert, die gehören in einen Stringpool.</p>
<p>Sieht bei mir so aus:</p>
<pre><code>class Foo
{
private:
    std::string const&amp; bar;

public:
    Foo(std::string const* bar)
        : bar(*bar)
    { }
};
</code></pre>
<p>Den String per Referenz entgegenzunehmen könnte je nach Benutzer meines Codes zu dem Irrtum führen, hier würde ein String kopiert (was meistens auch zu erwarten ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301017</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301017</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 22 Feb 2013 13:45:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 13:45:26 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>Rohe Zeiger sollten gänzlich vermieden werden. Es heißt nicht, dass man in der Praxis keinen Gebrauch davon macht. Im Gegenteil. Aber man benutzt Referenzen eher als Standard, und Zeiger nur wenn man dazu gezwungen wird.</p>
</blockquote>
<p>Finde ich nicht. Ich benutze Zeiger sehr gerne wenn ich verdeutlichen möchte dass nur eine Referenz und kein Wert gespeichert wird, weil das mit der C++-Referenzen-Syntax leicht untergehen kann.</p>
</blockquote>
<p>Und das kompensiert die Nachteile, die Zeiger mit sich bringen? Glaube ich nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301018</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 22 Feb 2013 13:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger als Parameter von Funktionen on Fri, 22 Feb 2013 13:46:44 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<blockquote>
<p>Rohe Zeiger sollten gänzlich vermieden werden. Es heißt nicht, dass man in der Praxis keinen Gebrauch davon macht. Im Gegenteil. Aber man benutzt Referenzen eher als Standard, und Zeiger nur wenn man dazu gezwungen wird.</p>
</blockquote>
<p>Finde ich nicht. Ich benutze Zeiger sehr gerne wenn ich verdeutlichen möchte dass nur eine Referenz und kein Wert gespeichert wird, weil das mit der C++-Referenzen-Syntax leicht untergehen kann.</p>
</blockquote>
<p>Und das kompensiert die Nachteile, die Zeiger mit sich bringen? Glaube ich nicht.</p>
</blockquote>
<p>Welche Nachteile bitte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301020</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Fri, 22 Feb 2013 13:46:44 GMT</pubDate></item></channel></rss>