<?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[Frage zu Zeigern]]></title><description><![CDATA[<p>Hier ist erstmal der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    virtual void Speak() const {cout &lt;&lt; &quot;Tier spricht\n&quot;;}

    private:
    int itsAge;
};

class Dog : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Hund bellt\n&quot;;}
};

class Cat : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Katze miaut\n&quot;;}
};

class Pig : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Schwein oinkt\n&quot;;}
};

class Duck : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Ente quackt\n&quot;;}
};

int main()
{
    Mammal *array[4];
    Mammal *temp;
    for (int i=0; i&lt;4; i++)
    {
        int save;
        cout &lt;&lt; &quot;1 Hund 2 Katze 3 Schwein 4 Ente\n&quot;;
        cin &gt;&gt; save;
        switch(save)
        {
            case 1:
            temp=new Dog;
            break;
            case 2:
            temp=new Cat;
            break;
            case 3:
            temp=new Pig;
            break;
            case 4:
            temp=new Duck;
            break;
        }
        array[i]=temp;
    }

    return 0;
}
</code></pre>
<p><strong>1.</strong><br />
In Zeile 61 steht &quot;array[i]=temp;&quot;, also es funktioniert auch blendend, doch irgendwie komm ich bei Zeigern immer durcheinander und frage mich jetzt auch schon wieder warum das eigentlich funktioniert.<br />
&quot;array&quot; ist doch ein Zeiger, und temp ist doch ein Zeiger, richtig?<br />
Und nun will ich dem einem Manmal Zeiger (array) was übergebn. Was übergeb ich hier den eigentlich? Übergeb ich hier den Inhalt von &quot;temp&quot; oder übergeb ich die Adresse von &quot;temp&quot;? Eigentlich übergebe ich doch die Adresse, weil &quot;temp&quot; ohne &quot;*&quot; --&gt; Adress oder?<br />
So aber ich hab mal früehr gelernt das die Klammern &quot;[ ]&quot; den jeweiligen Zeiger dereferenzieren, also übergebe ich jeztt dem dereferenzierten Zeiger array[i] eine Adresse. Mh aber das kann doch nicht gehen oder? Aber es geht.<br />
Also irgendwie bin ich wieder verwirrt, kanns mir jemand erklären?</p>
<p><strong>2.</strong><br />
Müsste ich eigentlich nicht nach jedem neuen Schleifen durchlauf &quot;delete temp&quot; machen? Weil sonst entstehen doch Speicherlücken oder? Aber das ist halt ein Buchbeispiel und ich vertrau dem mal? Wenn man nicht deleten muss dann erklärt mir doch bitte warum, meiner Meinung nach muss man deleten.</p>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/185458/frage-zu-zeigern</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 04:41:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/185458.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 25 Jun 2007 20:09:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Zeigern on Mon, 25 Jun 2007 20:09:29 GMT]]></title><description><![CDATA[<p>Hier ist erstmal der Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Mammal
{
    public:
    virtual void Speak() const {cout &lt;&lt; &quot;Tier spricht\n&quot;;}

    private:
    int itsAge;
};

class Dog : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Hund bellt\n&quot;;}
};

class Cat : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Katze miaut\n&quot;;}
};

class Pig : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Schwein oinkt\n&quot;;}
};

class Duck : public Mammal
{
    public:
    void Speak() const {cout &lt;&lt; &quot;Ente quackt\n&quot;;}
};

int main()
{
    Mammal *array[4];
    Mammal *temp;
    for (int i=0; i&lt;4; i++)
    {
        int save;
        cout &lt;&lt; &quot;1 Hund 2 Katze 3 Schwein 4 Ente\n&quot;;
        cin &gt;&gt; save;
        switch(save)
        {
            case 1:
            temp=new Dog;
            break;
            case 2:
            temp=new Cat;
            break;
            case 3:
            temp=new Pig;
            break;
            case 4:
            temp=new Duck;
            break;
        }
        array[i]=temp;
    }

    return 0;
}
</code></pre>
<p><strong>1.</strong><br />
In Zeile 61 steht &quot;array[i]=temp;&quot;, also es funktioniert auch blendend, doch irgendwie komm ich bei Zeigern immer durcheinander und frage mich jetzt auch schon wieder warum das eigentlich funktioniert.<br />
&quot;array&quot; ist doch ein Zeiger, und temp ist doch ein Zeiger, richtig?<br />
Und nun will ich dem einem Manmal Zeiger (array) was übergebn. Was übergeb ich hier den eigentlich? Übergeb ich hier den Inhalt von &quot;temp&quot; oder übergeb ich die Adresse von &quot;temp&quot;? Eigentlich übergebe ich doch die Adresse, weil &quot;temp&quot; ohne &quot;*&quot; --&gt; Adress oder?<br />
So aber ich hab mal früehr gelernt das die Klammern &quot;[ ]&quot; den jeweiligen Zeiger dereferenzieren, also übergebe ich jeztt dem dereferenzierten Zeiger array[i] eine Adresse. Mh aber das kann doch nicht gehen oder? Aber es geht.<br />
Also irgendwie bin ich wieder verwirrt, kanns mir jemand erklären?</p>
<p><strong>2.</strong><br />
Müsste ich eigentlich nicht nach jedem neuen Schleifen durchlauf &quot;delete temp&quot; machen? Weil sonst entstehen doch Speicherlücken oder? Aber das ist halt ein Buchbeispiel und ich vertrau dem mal? Wenn man nicht deleten muss dann erklärt mir doch bitte warum, meiner Meinung nach muss man deleten.</p>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313640</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313640</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Mon, 25 Jun 2007 20:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Mon, 25 Jun 2007 20:24:20 GMT]]></title><description><![CDATA[<p>Stromberg schrieb:</p>
<blockquote>
<p>&quot;array&quot; ist doch ein Zeiger, und temp ist doch ein Zeiger, richtig?</p>
</blockquote>
<p>Falsch. &quot;array&quot; ist ein Feld von Zeigern! Das ist der Unterschied. Und damit ist auch klar, dass der Code geht: Du weist *einem* der Zeiger aus dem Array den Zeiger 'temp' zu -- kein Problem.</p>
<blockquote>
<p>Müsste ich eigentlich nicht nach jedem neuen Schleifen durchlauf &quot;delete temp&quot; machen?</p>
</blockquote>
<p>Das wäre wahrscheinlich keine so gute Idee, denn dann könntest Du auf das so erzeugte Objekt ja nicht mehr zugreifen, das ist aber ja höchstwahrscheinlich noch irgendwo im Code beabsichtigt (und in dem Array stünde dann ja ein ungültiger Zeiger, also ein Zeiger, der auf nicht reservierten Speicher zeigt).</p>
<p>Allerdings stimmt es schon: wenn die Objekte nicht mehr gebraucht werden, sollten sie freigegeben werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313652</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 25 Jun 2007 20:24:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Mon, 25 Jun 2007 20:27:22 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Mammal *array[4]; //lies: array ist ein Array (größe 4) von Zeigern auf Mammal.
Mammal *temp; //lies: temp ist ein Zeiger auf Mammal.
</code></pre>
<p><code>array[0]</code> ist das erste element des arrays. da das array ein array von zeigern auf Mammal ist, ist das erste element von array ein zeiger auf Mammal. klar bis jetzt?</p>
<p><code>array[i]</code> ist das i-te element des arrays. und das i-te element eines arrays von zeigern auf Mammal ist... ein zeiger auf Mammal!</p>
<p><code>array[i] = temp</code> temp ist ein zeiger auf Mammal. <code>array[i]</code> ist ein zeiger Mammal. du weist hier also einem zeiger auf Mammal einen zeiger auf Mammal zu. was ist ein zeiger auf Mammal? eine variable, die die adresse eines Mammals beinhaltet. array[i] beinhaltet jetzt also die adresse eines Mammal, nämlich jenes Mammals, dessen adresse auch in temp steht.</p>
<blockquote>
<p>Und nun will ich dem einem Manmal Zeiger (array) was übergebn. Was übergeb ich hier den eigentlich?</p>
</blockquote>
<p>du übergibst hier gar nichts, du weist zu.</p>
<blockquote>
<p>Übergeb ich hier den Inhalt von &quot;temp&quot; oder übergeb ich die Adresse von &quot;temp&quot;? Eigentlich übergebe ich doch die Adresse, weil &quot;temp&quot; ohne &quot;*&quot; --&gt; Adress oder?</p>
</blockquote>
<p>ein zeiger auf X ist eine variable, die eine adresse (eines X-objektes) beinhaltet. eine varibale hat selbst eine adresse, d.h. ein zeiger hat ebenfalls eine adresse. weiter gedacht: ein da ein &quot;zeiger auf X&quot; selbst eine adresse hat, kann man diese adresse auch wo speichern: in einem zeiger auf einne &quot;zeiger auf X&quot;. so in etwa kannst du dir <code>array</code> vorstellen.</p>
<blockquote>
<p>So aber ich hab mal früehr gelernt das die Klammern &quot;[ ]&quot; den jeweiligen Zeiger dereferenzieren, also übergebe ich jeztt dem dereferenzierten Zeiger array[i] eine Adresse. Mh aber das kann doch nicht gehen oder? Aber es geht.</p>
</blockquote>
<p>du dereferenzierst den zeiger ja tatsächlich. nur ist array kein einfacher zeiger, sondern ein zeiger auf (in diesem fall) mehrere zeiger (nämlich 4) auf Mammal.</p>
<p>du hast am schluss also in deinem array vier zeiger, die auf vier verschiedene Mammals zeigen gespeichert.</p>
<blockquote>
<p>Müsste ich eigentlich nicht nach jedem neuen Schleifen durchlauf &quot;delete temp&quot; machen? Weil sonst entstehen doch Speicherlücken oder? Aber das ist halt ein Buchbeispiel und ich vertrau dem mal? Wenn man nicht deleten muss dann erklärt mir doch bitte warum, meiner Meinung nach muss man deleten.</p>
</blockquote>
<p>deleten kannst du dann mit</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 4; ++i) delete array[i];
</code></pre>
<p>wahrscheinlich solltest du dir aber einfach nochmal das kapitel in deinem buch durchlesen, das kann dir das sicher viel besser erklären als 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>die C++ FAQ hier bietet AFAIR auch einen beitrag zu zeigern.</p>
<p>/edit: shit, zu spät <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/1313655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313655</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Mon, 25 Jun 2007 20:27:22 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Mon, 25 Jun 2007 20:55:08 GMT]]></title><description><![CDATA[<p>statt jedes element einzeln zu deleten,warum nicht einfach</p>
<pre><code class="language-cpp">delete[] array;
</code></pre>
<p>nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313674</guid><dc:creator><![CDATA[abend]]></dc:creator><pubDate>Mon, 25 Jun 2007 20:55:08 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Mon, 25 Jun 2007 20:57:13 GMT]]></title><description><![CDATA[<p>abend schrieb:</p>
<blockquote>
<p>statt jedes element einzeln zu deleten,warum nicht einfach</p>
<pre><code class="language-cpp">delete[] array;
</code></pre>
<p>nehmen?</p>
</blockquote>
<p>Weil das nicht klappt?! 'delete[]' ruft nicht für jedes Element eines Felds 'delete' auf sondern es zerstört ein dynamisches Feld (klappt hier also von vornherein nicht) und ruft evtl. für jedes Element noch einen Destruktor auf.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1313676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1313676</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 25 Jun 2007 20:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Tue, 26 Jun 2007 14:29:40 GMT]]></title><description><![CDATA[<p>Also ich habs mit den Zeigern jetzt glaub schon gecket.</p>
<pre><code class="language-cpp">int value[5]; //value[1-4] ist eine Variable in die man int Zahlenwerte reinschreiben kann.
int *array[5]; //array[1-4] ist eine Variable in die man Adressen von int Variablen reinschreiben kann.
int *p; //p ist eine Variable in die man eine Adresse von einer int Variable reinschreiben kann.
array[0]=&amp;value[0]; //array[0] ist nicht dereferenziert; array[0] nimmt die Adresse von value[0] auf.
int p=&amp;value[0]; //p ist nicht dereferenziert; p nimmt die Adresse von value[0] auf.
cout &lt;&lt; *array[0] &lt;&lt; endl; //array[0] ist dereferenziert; array[0] gibt den Inhalt von value[0] aus.
cout &lt;&lt; *p &lt;&lt; endl; //p ist dereferenziert; p gibt den Inhalt von value[0] aus.
</code></pre>
<p>Das was &quot;abend&quot; da aufgerufen hat war doch so gemeint, das hier geht nicht:</p>
<pre><code class="language-cpp">array[0]=new int;
array[1]=new int;
array[2]=new int;
array[3]=new int;
delete []array;
</code></pre>
<p>Aber das hier würde doch gehen, wenn ein Zeiger auf ein großes Feld zeigt?</p>
<pre><code class="language-cpp">array[0]=new int[5000];
array[1]=new int[5000];
array[2]=new int[5000];
array[3]=new int[5000];
delete []array[0];
delete []array[1];
delete []array[2];
delete []array[3];
</code></pre>
<p>Dankeschön schon mal im Voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314075</guid><dc:creator><![CDATA[Stromberg]]></dc:creator><pubDate>Tue, 26 Jun 2007 14:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Tue, 26 Jun 2007 14:33:05 GMT]]></title><description><![CDATA[<p>perfekt <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/1314078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314078</guid><dc:creator><![CDATA[queer_boy]]></dc:creator><pubDate>Tue, 26 Jun 2007 14:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Tue, 26 Jun 2007 15:08:06 GMT]]></title><description><![CDATA[<p>Fast es ist jedesmal array 0-4 und nicht 1-4, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314095</guid><dc:creator><![CDATA[Shinja]]></dc:creator><pubDate>Tue, 26 Jun 2007 15:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Zeigern on Tue, 26 Jun 2007 15:13:55 GMT]]></title><description><![CDATA[<p>Shinja schrieb:</p>
<blockquote>
<p>Fast es ist jedesmal array 0-4 und nicht 1-4, oder?</p>
</blockquote>
<p>Ja.</p>
<p>Den Arrays werden in der Form:<br />
typ[anzahl]<br />
geschrieben, und der Bereich ist dann 0..(anzahl-1)</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1314099</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1314099</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 26 Jun 2007 15:13:55 GMT</pubDate></item></channel></rss>