<?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[Pointer und Reference]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgenden Quelltext erstellt:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class Tier {
      public:
              string name;

      public:

             Tier() {}

             Tier (string n) : name (n) {}

             //Methoden
            void datenausgeben() {
                  cout &lt;&lt; &quot;name: &quot; &lt;&lt; name &lt;&lt; endl;
                  }

};

class Saeugetier : public Tier {
      private:
              float anzahlBeine;

      public:
             Saeugetier() {}

             Saeugetier(float anzahl, string n) : anzahlBeine(anzahl), Tier(n) {};    

             void datenausgeben1() {
                  datenausgeben();
                  cout &lt;&lt; anzahlBeine;
                  }   
};

class Testen {

  public:
         //&amp;s beinhaltet den Speicherbereich
         bool pruef (Saeugetier &amp;s) {

              cout &lt;&lt; &amp;s &lt;&lt; endl;
              s.name =&quot;Rind&quot;;

              //HIER SOLL ERMITTELT WERDEN, OB s BEREITS EXISTIERT?
              //IST DAS KORREKT?
              if (&amp;s != 0)
              return true;
              }    

};

int main(int argc, char *argv[])
{
 bool flag = false;

 Testen *test = new Testen();

 Saeugetier *s1[10];
 s1[0] = new Saeugetier(4,&quot;Hase&quot;);
 s1[0]-&gt;datenausgeben1();

 //WAS PASSIERT HIER GENAU???
 flag = test-&gt;pruef(*s1[0]);
  s1[0]-&gt;datenausgeben1();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Ich verstehe das mit den Zeigern und Referenzen noch nicht.</p>
<p>Was übergebe ich denn in der Anweisung</p>
<pre><code class="language-cpp">flag = test-&gt;pruef(*s1[0]);
</code></pre>
<p>genau?<br />
Hier wird doch ein Zeiger übergeben? Dieser Zeiger verweißt auf den Speicherbereich von s1[0], oder?</p>
<p>Erhält dann die Methode</p>
<pre><code class="language-cpp">bool pruef (Saeugetier &amp;s)
</code></pre>
<p>nur den Speicherbereich übergeben?</p>
<p>Ist dass dann immer so, wenn ich mit &quot;*&quot; eine Methode aufrufe, dass dann im Methodenkopf der Adressoperator &quot;&amp;&quot; stehen muss?</p>
<p>Danke!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285377/pointer-und-reference</link><generator>RSS for Node</generator><lastBuildDate>Thu, 16 Apr 2026 00:37:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285377.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 Apr 2011 10:23:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 10:23:44 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe folgenden Quelltext erstellt:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

class Tier {
      public:
              string name;

      public:

             Tier() {}

             Tier (string n) : name (n) {}

             //Methoden
            void datenausgeben() {
                  cout &lt;&lt; &quot;name: &quot; &lt;&lt; name &lt;&lt; endl;
                  }

};

class Saeugetier : public Tier {
      private:
              float anzahlBeine;

      public:
             Saeugetier() {}

             Saeugetier(float anzahl, string n) : anzahlBeine(anzahl), Tier(n) {};    

             void datenausgeben1() {
                  datenausgeben();
                  cout &lt;&lt; anzahlBeine;
                  }   
};

class Testen {

  public:
         //&amp;s beinhaltet den Speicherbereich
         bool pruef (Saeugetier &amp;s) {

              cout &lt;&lt; &amp;s &lt;&lt; endl;
              s.name =&quot;Rind&quot;;

              //HIER SOLL ERMITTELT WERDEN, OB s BEREITS EXISTIERT?
              //IST DAS KORREKT?
              if (&amp;s != 0)
              return true;
              }    

};

int main(int argc, char *argv[])
{
 bool flag = false;

 Testen *test = new Testen();

 Saeugetier *s1[10];
 s1[0] = new Saeugetier(4,&quot;Hase&quot;);
 s1[0]-&gt;datenausgeben1();

 //WAS PASSIERT HIER GENAU???
 flag = test-&gt;pruef(*s1[0]);
  s1[0]-&gt;datenausgeben1();

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Ich verstehe das mit den Zeigern und Referenzen noch nicht.</p>
<p>Was übergebe ich denn in der Anweisung</p>
<pre><code class="language-cpp">flag = test-&gt;pruef(*s1[0]);
</code></pre>
<p>genau?<br />
Hier wird doch ein Zeiger übergeben? Dieser Zeiger verweißt auf den Speicherbereich von s1[0], oder?</p>
<p>Erhält dann die Methode</p>
<pre><code class="language-cpp">bool pruef (Saeugetier &amp;s)
</code></pre>
<p>nur den Speicherbereich übergeben?</p>
<p>Ist dass dann immer so, wenn ich mit &quot;*&quot; eine Methode aufrufe, dass dann im Methodenkopf der Adressoperator &quot;&amp;&quot; stehen muss?</p>
<p>Danke!</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051551</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Tue, 19 Apr 2011 10:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 10:28:12 GMT]]></title><description><![CDATA[<p>Kurze Zusammenfassung:</p>
<pre><code class="language-cpp">void foo1(int); //Kopie
void foo2(int&amp;);//Referenz
void foo3(int*);//Zeiger

int bar = 6;
foo1(bar);
foo2(bar);
foo3(&amp;bar);

int* pointer = &amp;bar;
foo1(*pointer);
foo2(*pointer);
foo3(pointer);

int&amp; ref = bar;
foo1(ref);
foo2(ref);
foo3(&amp;ref);
</code></pre>
<p>MfG, EOutOfResources</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051552</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Tue, 19 Apr 2011 10:28:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 10:38:04 GMT]]></title><description><![CDATA[<p><code>s1</code> ist ein Array von Zeigern. Mit <code>s1[0]</code> greifst du auf den ersten Zeiger zu, mit <code>*s1[0]</code> greifst du auf den ersten Zeiger zu und dereferenzierst ihn.</p>
<p><code>pruef</code> übernimmt eine Referenz auf ein <code>Saeugetier</code> -Objekt. Das heißt, dass die Referenz in deinem Beispiel auf <code>*s1[0]</code> (was ja ein dereferenzierter Zeiger, also ein völlig normales Objekt, ist) weißt und somit syntaktisch vollkommen in Ordnung ist.</p>
<p><code>s1[0]-&gt;datenausgeben1()</code> dereferenziert den Zeiger in <code>s1[0]</code> (es ist auch <code>(*s1[0]).datenausgeben1()</code> möglich, wenn die Syntax anschaulicher ist) und ruft die Methode <code>datenausgaben1()</code> auf.</p>
<p>Referenzen und Zeiger sind nicht das gleiche. Referenzen sind nur ein Alias, Zeiger jedoch beinhalten das komplette Objekt. <code>pruef</code> erhält keinen Speicherbereich, sondern ein Alias, und du übergibst keine Adresse, sondern ein Objekt. Deshalb übergibst du auch nicht <code>s1[0]</code> (Adresse), sondern <code>*s1[0]</code> (Objekt).</p>
<p>Nichts leichter als das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051561</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Tue, 19 Apr 2011 10:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 10:59:49 GMT]]></title><description><![CDATA[<p>Danke!</p>
<p>Wie kann man denn rausfinden ob schon ein Zeiger angelegt wurde?</p>
<p>So wie ich es mache, funktioniert es leider nicht, da ja &amp;s auf irgendetwas referenzieren muss, oder?</p>
<pre><code class="language-cpp">class Testen {

  public:
         //&amp;s beinhaltet den Speicherbereich
         bool pruef (Saeugetier &amp;s) {
              //WARUM WIRD HIER BEREITS EIN SPEICEHRBEREICH RESERVIERT??
              cout &lt;&lt; &quot;speicherbereich verweist auf:&quot; &lt;&lt; &amp;s;

              if (&amp;s == 0) {
              return true;
              }

              else 
              return false;

              }    

};

int main(int argc, char *argv[])
{
 bool flag = false;

 Testen *test = new Testen();
 Saeugetier *s1[10];

 for (int i = 0; i &lt; 10; i++) {

 flag = test-&gt;pruef(*s1[i]);

 if (flag == true) {

          s1[i] = new Saeugetier();

}
}

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051572</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Tue, 19 Apr 2011 10:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 11:22:25 GMT]]></title><description><![CDATA[<p>Tom83 schrieb:</p>
<blockquote>
<p>Wie kann man denn rausfinden ob schon ein Zeiger angelegt wurde?</p>
</blockquote>
<p>Das kann man nicht herausfinden. Du kannst nur testen, ob ein Pointer kein 0-Zeiger ist. Dazu musst du natürlich dein Array erst mal mit 0 initialisieren:</p>
<pre><code class="language-cpp">Saeugetier *s1[10] = {};
</code></pre>
<p>Anschließend kannst du dann prüfen:</p>
<pre><code class="language-cpp">bool pruef (Saeugetier *s) {
              cout &lt;&lt; &quot;speicherbereich verweist auf:&quot; &lt;&lt; (void*)s;

              if (s == 0) {
</code></pre>
<p>Die Funktion wird jetzt natürlich anders aufgerufen:</p>
<pre><code class="language-cpp">flag = test-&gt;pruef(s1[i]);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2051585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051585</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 19 Apr 2011 11:22:25 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 11:27:21 GMT]]></title><description><![CDATA[<p>Danke, genau das wollte ich <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>Allerdings, warum muss ich denn nun anders aufrufen und das Objekt selbst übergeben?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051590</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Tue, 19 Apr 2011 11:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 11:34:16 GMT]]></title><description><![CDATA[<p>Tom83 schrieb:</p>
<blockquote>
<p>Allerdings, warum muss ich denn nun anders aufrufen und das Objekt selbst übergeben?</p>
</blockquote>
<p>Du musst die Funktion anders aufrufen, weil du einen <strong>Zeiger</strong> auf das Objekt übergibst und diesen auf 0 prüfst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051594</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051594</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 19 Apr 2011 11:34:16 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 11:41:49 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Und bei &quot;*s1[i]&quot; würde ich dann das Obejekt selbst übergeben?<br />
Stimmt das? Dann leuchtet mir das ein <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>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051597</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Tue, 19 Apr 2011 11:41:49 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Tue, 19 Apr 2011 11:46:01 GMT]]></title><description><![CDATA[<p>Tom83 schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>Und bei &quot;*s1[i]&quot; würde ich dann das Obejekt selbst übergeben?<br />
Stimmt das? Dann leuchtet mir das ein <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>Gruß</p>
</blockquote>
<p>Genau. <code>s1[i]</code> die Adresse, <code>*s1[i]</code> das Objekt.</p>
<p>Wenn du das Ganze auch noch einer Funktion übergibst, die eine Referenz erwartet, dann wird ein Alias für das Objekt erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051600</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Tue, 19 Apr 2011 11:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 06:54:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich hab grad keinen Compiler da.</p>
<p>Kann ich ein komplettes Array mit Objekten als Argument an eine Methode in einer anderen Klasse übegeben, indem ich die Klammern weglasse?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051899</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Wed, 20 Apr 2011 06:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 07:37:27 GMT]]></title><description><![CDATA[<p>Tom83 schrieb:</p>
<blockquote>
<p>Kann ich ein komplettes Array mit Objekten als Argument an eine Methode in einer anderen Klasse übegeben, indem ich die Klammern weglasse?</p>
</blockquote>
<p>Nein. Arrays besitzen keine Kopiersemantik.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051913</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 20 Apr 2011 07:37:27 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 07:40:24 GMT]]></title><description><![CDATA[<p>Tom83 schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>ich hab grad keinen Compiler da.</p>
<p>Kann ich ein komplettes Array mit Objekten als Argument an eine Methode in einer anderen Klasse übegeben, indem ich die Klammern weglasse?</p>
<p>Viele Grüße</p>
</blockquote>
<p>Aber nur, wenn du den Index auch weglässt.</p>
<p>In der Funktion würde dann natürlich ein Array erwartet. Weil das Array aber viele Elemente aufweisen kann, wird keine tiefe, sondern eine flache Kopie erstellt, oder genauer: Die Funktion erhält lediglich einen Verweis auf das Array.</p>
<p>Jetzt wird es vor allem für Anfänger kompliziert: wenn du ein Array an eine Funktion gibst:</p>
<pre><code class="language-cpp">//Änderungen hier am Array betreffen auch das Original ...
void MyProc(char MyArray[]){...}

int main()
{
    char MyArray[10];
    MyProc(MyArray);
    return 0;
}
</code></pre>
<p>, kannst du im Funktionskopf das Array auch als Zeiger angeben - denn intern wird das Ganze eh in eine Adresse umgewandelt.</p>
<pre><code class="language-cpp">//Funktioniert auch so
void MyProc(char*MyArray){...}

int main()
{
    char MyArray[10];
    MyProc(MyArray);
    return 0;
}
</code></pre>
<p>Das heißt nicht, dass <code>MyArray</code> zu einem Zeiger wird - ein Array an sich ist fix, man kann ihm nichts zuweisen (wohl aber den Elementen):</p>
<pre><code class="language-cpp">//Geht nicht!
MyArray=OtherArray;
//Geht doch!
MyArray[1]=OtherArray[2];
</code></pre>
<p>Einem Zeiger kann man was zuweisen:</p>
<pre><code class="language-cpp">//Geht!
MyPointer=MyArray;
//Geht auch (wenn MyPointer was zugewiesen wurde)!
MyPointer[1]=MyArray[2];
</code></pre>
<p>Arrays und Zeiger sind nicht ein und dasselbe, auch wenn der Zugriff erschreckend ähnlich erfolgt.</p>
<p>Im Grunde ist es egal - ich weiß nicht, wie der Compiler reagiert, wenn du versuchst, einem Array in einer Funktion, in der es als Zeiger vertreten ist, etwas zuzuweisen, aber er sollte es abstrafen. Aber für die bessere Lesbarkeit solltest du immer zu <code>[]</code> , wenn du Speicher auf dem Stack, und zu <code>*</code> , wenn du Speicher auf dem Heap erwartest, verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051916</guid><dc:creator><![CDATA[Glühbirne]]></dc:creator><pubDate>Wed, 20 Apr 2011 07:40:24 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 09:04:44 GMT]]></title><description><![CDATA[<p>Das wichtigste dazu wurde aber noch nicht gesagt. Übergibt man ein Array an eine Funktion</p>
<pre><code class="language-cpp">void foo(char* arr);
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">void bar(char arr[]);
</code></pre>
<p>, dann geht die Information über die Länge des Arrays verloren! <a href="http://ideone.com/NBqtR" rel="nofollow">http://ideone.com/NBqtR</a></p>
<p>2 Möglichkeiten gibt es, um das Problem zu lösen:</p>
<p>1.)Eine Referenz auf das Array übergeben. Dies ist die unleserliche, komplizierte Variante: <a href="http://ideone.com/elCPx" rel="nofollow">http://ideone.com/elCPx</a></p>
<p>2.)Einen Container deiner Wahl nehmen, der Ersatz für ein Array heißt std::tr1::array (bzw std::array, wenn du unter C++0x bist). Findet sich im Header &lt;array&gt;.<br />
Verwendung: <a href="http://ideone.com/ArtD2" rel="nofollow">http://ideone.com/ArtD2</a></p>
<p>Wenn du einen dynamischen Container brauchst, dann ein std::vector.</p>
<p>Variante 2 ist eigentlich immer zu bevorzugen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2051954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2051954</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 20 Apr 2011 09:04:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 17:33:10 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe noch eine Frage:</p>
<p>Auf der ersten Seite stand ja folgendes (manni) hat das geschrieben:</p>
<blockquote>
<p>Tom83 schrieb:</p>
<p>Wie kann man denn rausfinden ob schon ein Zeiger angelegt wurde?</p>
<p>Das kann man nicht herausfinden. Du kannst nur testen, ob ein Pointer kein 0-Zeiger ist. Dazu musst du natürlich dein Array erst mal mit 0 initialisieren:<br />
C/C++ Code:<br />
Saeugetier *s1[10] = {};<br />
C/C++ Code:<br />
Saeugetier *s1[10] = {};<br />
C/C++ Code:<br />
Saeugetier *s1[10] = {};</p>
<p>Anschließend kannst du dann prüfen:<br />
C/C++ Code:<br />
bool pruef (Saeugetier <em>s) {<br />
cout &lt;&lt; &quot;speicherbereich verweist auf:&quot; &lt;&lt; (void</em>)s;</p>
<p>if (s == 0) {<br />
C/C++ Code:<br />
bool pruef (Saeugetier <em>s) {<br />
cout &lt;&lt; &quot;speicherbereich verweist auf:&quot; &lt;&lt; (void</em>)s;</p>
<p>if (s == 0) {<br />
C/C++ Code:<br />
bool pruef (Saeugetier <em>s) {<br />
cout &lt;&lt; &quot;speicherbereich verweist auf:&quot; &lt;&lt; (void</em>)s;</p>
<p>if (s == 0) {</p>
<p>Die Funktion wird jetzt natürlich anders aufgerufen:<br />
C/C++ Code:<br />
flag = test-&gt;pruef(s1[i]);<br />
C/C++ Code:<br />
flag = test-&gt;pruef(s1[i]);<br />
C/C++ Code:<br />
flag = test-&gt;pruef(s1[i]);</p>
</blockquote>
<p>Die Methode</p>
<pre><code class="language-cpp">bool pruef (Saeugetier *s)
</code></pre>
<p>funktioniert auch so:</p>
<pre><code class="language-cpp">bool pruef (Saeugetier s[])
</code></pre>
<p>Warum ist dass denn so? Meine Vermutung: Das Array ist ja an sich eh schon ein Zeiger?<br />
Wenn ich bool pruef (Saeugetier *s[]) eingebe, dann kommt die Fehlermeldung &quot;canot convert from int* to int**) (Das hat meine Vermutung erzeugt, dass hier das Array von sich aus standardmäßig als Zeiger dient und deshalb nicht extra als Zeiger deklariert werden muss?</p>
<p>Viele Grüße</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052186</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Wed, 20 Apr 2011 17:33:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 17:39:38 GMT]]></title><description><![CDATA[<p>Ein Array ist <strong>kein</strong> Zeiger. Allerdings wird der Array-Name in den meisten Situationen implizit in einen Zeiger auf das erste Array-Element umgewandelt.<br />
(und bei Funktionsparametern sind die Angaben <code>int *a</code> und <code>int a[]</code> tatsächlich äquivalent, allerdings nur in der äußersten Dimension)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052188</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052188</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Apr 2011 17:39:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 18:30:58 GMT]]></title><description><![CDATA[<p>Dankeschön!</p>
<p>Was passiert denn eigentlich bei</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;der Speicherbereich verweist auf&quot; &lt;&lt; (void*) s
</code></pre>
<p>die folgende Zeile bewirkt das gleiche:</p>
<pre><code class="language-cpp">cout &lt;&lt; &quot;der Speicherbereich verweist auf&quot; &lt;&lt; s
</code></pre>
<p>Ich hab zwar was von void - Zeigern gelesen, aber noch nicht so recht verstanden.<br />
bedeutet (void*) s hier evtl. dass mit dem Objekt s selbst gearbeitet wird, also eine andere Schreibweise für &quot;s&quot;?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052200</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Wed, 20 Apr 2011 18:30:58 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Wed, 20 Apr 2011 18:43:30 GMT]]></title><description><![CDATA[<p>(void*)s ist ein Cast im C-Stil, also eine Typ-Umwandlung. Das heißt, daß du den struct-Zeiger explizit in einen void-Zeiger (=Zeiger auf unstrukturierten Speicher) umwandelst. Bei der Variante <code>cout &lt;&lt; s;</code> hast du ebenfalls eine Typumwandlung, allerdings eine implizite.<br />
(bei der Struktur macht das keinen Unterschied, aber wenn du stattdessen ein <code>char *s</code> verwendest, unterscheiden sich die Ausgaben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052202</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052202</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 20 Apr 2011 18:43:30 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Thu, 21 Apr 2011 15:59:28 GMT]]></title><description><![CDATA[<p>Hi @ all,</p>
<p>ich habe den Thread durchgelesen und noch eine Frage zu dem ganzen Thema.</p>
<p>Ich habe folgende Zeilen geschrieben, und bitte euch diese zu kontrollieren ob das alles stimmt (vor allem die Kommentare)</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;
#include &lt;iostream&gt;

using namespace std;

 void kopie (int z) {
      cout &lt;&lt; &quot;FUNKTION kopie(int z) &quot; &lt;&lt;endl;
      //z hat eine eigene Adresse und ist nicht mit a verbunden
      cout &lt;&lt; &quot;Die Adresse von z:&quot; &lt;&lt; &amp;z &lt;&lt; endl;
      cout &lt;&lt; &quot;Der WErt von z: &quot; &lt;&lt; z &lt;&lt; endl &lt;&lt; endl&lt;&lt; endl &lt;&lt; endl;
      //eine Zuweisung bringt hier nichts, a bleibt unverändert!
      z = 99;
      }

 //Übergabe als Referenz
 void referenz (int &amp;x) {
      cout &lt;&lt; &quot;FUNKTION referenz (int &amp;x) &quot; &lt;&lt; endl;
      //die Adresse von y entspricht der von a, da mit einem
      //Alias gearbeitet wird????
      cout &lt;&lt; &quot;Die Adresse von x: &quot; &lt;&lt; &amp;x &lt;&lt; &quot;  entspricht der von a, da ein Alias von a&quot; &lt;&lt; endl;
      cout &lt;&lt; &quot;Der Wert von x:    &quot; &lt;&lt; x &lt;&lt; endl &lt;&lt; endl &lt;&lt;endl &lt;&lt; endl;
      //Änderungen würden sich hier direkt auf a auswirken!

      }

 void pointer (int &amp;y) {
      cout &lt;&lt; &quot;FUNKTION pointer (int &amp;y)&quot; &lt;&lt; endl;
      //y hat eine eigene Adresse, da ein dereferenzierter Zeiger übergeben wurde
      cout &lt;&lt; &quot;Die Adresse von y (&amp;y):&quot; &lt;&lt; &amp;y &lt;&lt;endl;
      cout &lt;&lt; &quot;Der Wert von  y (y)  :&quot; &lt;&lt; y &lt;&lt;endl &lt;&lt; endl&lt;&lt; endl &lt;&lt; endl;
      //Änderungen würden sich hier direkt auf b auswirken!

      }

int main(int argc, char *argv[])
{

    int a = 5;
    int b = 8;
    int *c = &amp;b;

    cout &lt;&lt; &quot;Die Adresse von a: &quot; &lt;&lt; &amp;a &lt;&lt; endl;
    cout &lt;&lt; &quot;Der Wert von a:    &quot; &lt;&lt; a &lt;&lt;endl &lt;&lt; endl;

    //hier wird die Zahl a übergeben (kein Pointer oder Referenz)???
    referenz(a);
    //hier wird die Zahl a übergeben (kein Point oder Referenz)??
    kopie(a);

    cout &lt;&lt; &quot;Die Adresse von    b  (&amp;b): &quot; &lt;&lt; &amp;b &lt;&lt; endl;
    cout &lt;&lt; &quot;Der Wert von       b   (b): &quot; &lt;&lt; b &lt;&lt; endl;
    cout &lt;&lt; &quot;Die Adresse von    c  (&amp;c): &quot; &lt;&lt; &amp;c &lt;&lt; endl;
    cout &lt;&lt; &quot;Der Wert von       c   (c): &quot; &lt;&lt; c &lt;&lt; &quot; (also die Adresse von b)&quot; &lt;&lt; endl;
    //der Zeiger *c wird nun dereferenziert
    cout &lt;&lt; &quot;Der Wert - verweis c  (*c): &quot; &lt;&lt; *c &lt;&lt; &quot; (also der Wert von b)&quot; &lt;&lt; endl &lt;&lt; endl;
    pointer(*c);

    ///////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////////////////////////////////////
    //NEUER Quellcodebereich///////////////////////////////////////////////////////////////////

    //Beispiel REFERENZEN
    int aa = 6;
    //Was weiße ich hier genau zu?? ??
    //das heißt ja ungegfähr &quot;die Adresse von bb entsprich aa (aber &quot;aa&quot; ist ja der Wert, oder??
    int &amp;bb = aa;

    //BEISPIEL ZEIGER
    int cc = 9;
    //Dem Zeiger *dd wird die Adresse von cc zugewiesen
    int *dd = &amp;cc;

    int ee = 11;

    cout &lt;&lt; &quot;bb&quot; &lt;&lt; bb &lt;&lt; endl;
    //die Referenz bb erhält den Wert von ee ...
    bb = ee; 
    //... da bb direkt auf aa verweist, nimmt aa den Wert von ee an.
    cout &lt;&lt; &quot;aa&quot; &lt;&lt; aa &lt;&lt; endl &lt;&lt; endl &lt;&lt; endl;

    //*dd liefert den dereferenzierten Wert
    cout &lt;&lt; &quot;cc&quot; &lt;&lt; cc &lt;&lt; endl;
    cout &lt;&lt; &quot;*dd&quot; &lt;&lt; *dd &lt;&lt; endl;

    //NUN VERWEIST dd AUF DIE ADRESSE VON &quot;ee&quot; 
    dd = &amp;ee;
    cout &lt;&lt; &quot;cc erneut&quot; &lt;&lt; cc &lt;&lt;endl;
    cout &lt;&lt; &quot;*dd erneut&quot; &lt;&lt; *dd &lt;&lt; endl;

    system(&quot;PAUSE&quot;);
    return EXIT_SUCCESS;
}
</code></pre>
<p>was ich noch nicht so ganz verstehe:</p>
<p>Was wird bei &quot;void referenz (int &amp;x)&quot; bzw. &quot;void pointer (int &amp;x)&quot; übergeben? Es handelt sich doch in beiden Fällen um Objekte bzw. int - Werte??</p>
<p>Tschau</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052592</guid><dc:creator><![CDATA[Mario2hoch6]]></dc:creator><pubDate>Thu, 21 Apr 2011 15:59:28 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Thu, 21 Apr 2011 16:31:25 GMT]]></title><description><![CDATA[<p><a href="http://ideone.com/wRmYi" rel="nofollow">http://ideone.com/wRmYi</a><br />
Wird es dadurch etwas klarer?<br />
Übrigens schreibt man im Normalfall int&amp; n, nicht int &amp;n, selbiges mit Zeigern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052603</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Thu, 21 Apr 2011 16:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Thu, 21 Apr 2011 17:09:00 GMT]]></title><description><![CDATA[<p>Mario2hoch6 schrieb:</p>
<blockquote>
<p>Was wird bei &quot;void referenz (int &amp;x)&quot; bzw. &quot;void pointer (int &amp;x)&quot; übergeben? Es handelt sich doch in beiden Fällen um Objekte bzw. int - Werte??</p>
</blockquote>
<p>Genau genommen übergibst du an beide Funktionen eine Referenz. Übergabe per Zeiger sieht ein wenig anders aus:</p>
<pre><code class="language-cpp">void pointer (int *y) {
      cout &lt;&lt; &quot;FUNKTION pointer (int *y)&quot; &lt;&lt; endl;
      //y hat eine eigene Adresse, da ein Zeiger übergeben wurde
      cout &lt;&lt; &quot;Die Adresse von y (&amp;y):&quot; &lt;&lt; &amp;y &lt;&lt;endl;
      //y enthält die Adresse einer übergebenen Variablen
      cout &lt;&lt; &quot;Der Wert von  y (y)  :&quot; &lt;&lt; y &lt;&lt;endl&lt;
      //y ist ein Pointer und zeigt auf eine Variable
      cout &lt;&lt; &quot;Der Wert hinter y (*y):&quot; &lt;&lt; *y &lt;&lt; endl&lt;&lt; endl &lt;&lt; endl;
      //Änderungen an *y würden sich hier direkt auf b auswirken!
}

//Aufruf per:
int a;
zeiger(&amp;a);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2052622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052622</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Apr 2011 17:09:00 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Thu, 21 Apr 2011 18:18:12 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>warum übergibst du hier</p>
<pre><code class="language-cpp">pointer(&amp;b)
</code></pre>
<p>(also die Adresse der Variabeln) ich hätte das so gemacht:</p>
<pre><code class="language-cpp">int b = 8;
    int* c = &amp;b;
    pointer(c);
</code></pre>
<p>c enthält ja auch die Adresse der Variablen b. Allerdings warum hast du hier keinen Zeiger mit &quot;int* c&quot; angelegt?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052640</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Thu, 21 Apr 2011 18:18:12 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Thu, 21 Apr 2011 18:22:30 GMT]]></title><description><![CDATA[<p>Tom83 schrieb:</p>
<blockquote>
<p>Hi,</p>
<p>warum übergibst du hier</p>
<pre><code class="language-cpp">pointer(&amp;b)
</code></pre>
<p>(also die Adresse der Variabeln) ich hätte das so gemacht:</p>
<pre><code class="language-cpp">int b = 8;
    int* c = &amp;b;
    pointer(c);
</code></pre>
<p>c enthält ja auch die Adresse der Variablen b. Allerdings warum hast du hier keinen Zeiger mit &quot;int* c&quot; angelegt?</p>
<p>Viele Grüße</p>
</blockquote>
<p>Weil es nicht notwendig ist. Der Parameter (d.h. die Adresse von b) wird sowieso in den Stack-Bereich der Funktion kopiert, da ist es nicht notwendig, noch eine eigene Variable dafür anzulegen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052642</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 21 Apr 2011 18:22:30 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Fri, 22 Apr 2011 09:06:21 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wie schauts dann aus, wenn ich so ein Konstrukt habe:</p>
<pre><code class="language-cpp">//call by VALUE     
  void test3 (int q) {
       q = 77777;
       cout &lt;&lt; &quot; BEI q steht folgendes &quot; &lt;&lt; q &lt;&lt; endl;
       }

    int s =99;
    int *r = &amp;s;
    test3(*r);
    cout &lt;&lt; &quot;Der Wert von *r :&quot; &lt;&lt; *r &lt;&lt; endl;
    cout &lt;&lt; &quot;Der wert von s:  &quot; &lt;&lt; s &lt;&lt; endl;
</code></pre>
<p>Nennt man das dass call by Value, oder hat das einen anderen Namen, weil ich einen derefferenzierten Zeiger übergebe?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052818</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Fri, 22 Apr 2011 09:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Fri, 22 Apr 2011 09:17:23 GMT]]></title><description><![CDATA[<p>Das ist call by value, weil die Funktion einen Wert übergeben bekommt. Woher dieser Wert stammt, ist für den Aufruftyp unerheblich.</p>
<p>Rein technisch gesehen ist auch die Zeiger-Variante &quot;call by value&quot; (allerdings mit einem &quot;int*&quot; Wert), semantisch wurde sie in C verwendet, um &quot;call by reference&quot; Semantik nachzubilden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052829</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 22 Apr 2011 09:17:23 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Fri, 22 Apr 2011 11:06:47 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Danke!</p>
<p>Ich hab mich jetzt mal an das Thema Zeiger auf Zeiger rangewagt:</p>
<pre><code class="language-cpp">int s =99;
    int *r = &amp;s;
    int **zeigeraufzeiger;
    int ***zeigeraufzeigeraufzeiger;

    zeigeraufzeiger = &amp;r;
    zeigeraufzeigeraufzeiger = &amp;zeigeraufzeiger;

    cout &lt;&lt; &quot;Adresse von s (&amp;s)                                &quot; &lt;&lt; &amp;s &lt;&lt;endl;
    cout &lt;&lt; &quot;Wert des Zeigers r (r)                            &quot; &lt;&lt; r &lt;&lt; endl;
    cout &lt;&lt; &quot;Adresse des Zeiger r (&amp;r)                         &quot; &lt;&lt; &amp;r &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des zeigeraufzeiger (z...)                   &quot; &lt;&lt; zeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Adresse des zeigersaufzeiger (&amp;z...)              &quot; &lt;&lt; &amp;zeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des zeigeraufzeigeraufzeiger (z...)          &quot; &lt;&lt; zeigeraufzeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Adresse des zeigeraufzeigeraufzeiger (&amp;z...)      &quot; &lt;&lt; &amp;zeigeraufzeigeraufzeiger &lt;&lt; endl &lt;&lt;endl &lt;&lt; endl;

    cout &lt;&lt; &quot;Wert von s                                                            &quot; &lt;&lt; s &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des Zeigers r                                  (*r)              &quot; &lt;&lt; *r &lt;&lt; endl;

    cout &lt;&lt; &quot;zeigeraufzeiger (z...) &quot; &lt;&lt; zeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des Zeigers zeigeraufzeiger (*zei...) (wert von r)                &quot; &lt;&lt;*zeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des Zeigers zeigeraufzeiger (**zei...) (wert von s)               &quot; &lt;&lt; **zeigeraufzeiger &lt;&lt; endl &lt;&lt;endl;

    cout &lt;&lt; &quot;zeigeraufzeiger (z...) &quot; &lt;&lt; zeigeraufzeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert Zeiger zeigeraufzeigeraufzeiger (*z...)(wert von zeigeraufzeiger) &quot; &lt;&lt; *zeigeraufzeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des Zeigers zeigeraufzeigeraufzeiger (**z...) (Wert von r)        &quot; &lt;&lt; **zeigeraufzeigeraufzeiger &lt;&lt; endl;
    cout &lt;&lt; &quot;Wert des Zeigers zeigeraufzeigeraufzeiger (***z..) (Wert von s)        &quot; &lt;&lt; ***zeigeraufzeigeraufzeiger &lt;&lt; endl;
</code></pre>
<p>Stimmen meine Angaben so?</p>
<p>Viele Grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052891</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052891</guid><dc:creator><![CDATA[Tom83]]></dc:creator><pubDate>Fri, 22 Apr 2011 11:06:47 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer und Reference on Fri, 22 Apr 2011 15:08:48 GMT]]></title><description><![CDATA[<p>Nicht ganz.<br />
Zeile 18: Ziel des Zeigers<br />
Zeile 22: Ziel des Zeigers<br />
Zeile 23: Ziel des Zieles des Zeigers</p>
<p>Zeile 27: Ziel des Zeigers<br />
Zeile 28: Ziel des Zieles des Zeigers<br />
Zeile 29: Ziel des Zieles des Zieles des Zeigers</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2052991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2052991</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 22 Apr 2011 15:08:48 GMT</pubDate></item></channel></rss>