<?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[Arrays, Zeiger und Funktionen]]></title><description><![CDATA[<p>Hallo.<br />
Ich habe ein Verständnisproblem, da C++ für mich eine unerklärliche Sache macht (hat aber bestimmt seinen Grund).<br />
Ich habe das untere Programm geschrieben und möchte jetzt einfach im Programm &quot;normale&quot; den Zeiger auf das Array &quot;c&quot; übergeben. Erstmal das Programm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;conio.h&gt;

int * normale( int vektor[2] )
{
	int c[2]; // Definiere das Array
	int *p=&amp;c[0]; // Definiere den Zeiger auf das erste Element des Arrays

	c[0] = vektor[0] - vektor[1];
	c[1] = vektor[0] * vektor[1];

	return &amp;c[0];
	return p;	
}

int main()
{
	int y[2] = {7, 2};
	int i;
	int *zeiger;

	zeiger = normale(y);
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;

	zeiger = normale(y);
	zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;

	getch();

	return 0;
}
</code></pre>
<p>Und mein Problem tritt hier auf:</p>
<pre><code class="language-cpp">zeiger = normale(y);
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;

	zeiger = normale(y);
	zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
</code></pre>
<p>Ich hole mir den Zeiger von der Funktion. Die erste Ausgabe gibt mir das richtige heraus. Doch die zweite Ausgabe ergibt schon etwas anderes, was ich nicht verstehe. Ich bearbeite den Zeiger doch gar nicht, und dieser ruft was anderes auf?</p>
<p>Wenn ich</p>
<pre><code class="language-cpp">zeiger = normale(y);
	std::cout &lt;&lt; zeiger &lt;&lt; std::endl;
	std::cout &lt;&lt; zeiger &lt;&lt; std::endl;
</code></pre>
<p>aufrufe, also die Adresse ausgebe, kommt die selbe heraus. Wieso aber wird dann mit &quot;*zeiger&quot; jeweils ein anderer Inhalt ausgegeben??</p>
<p>Und zuletzt: wenn ich nun den Zeiger auf das nächste Feld im Array zeigen lassen möchte, mache ich es ja so wie</p>
<pre><code class="language-cpp">zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
</code></pre>
<p>Nur, dann zeigt er auch nicht auf das richtige Element, sondern auf irgendeinen Quatsch. Ich muss, bevor ich den Zeiger erhöhe, zuerst</p>
<pre><code class="language-cpp">zeiger = normale(y);
	zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
</code></pre>
<p>machen, dem Zeiger also nochmal neu definieren. Wieso? Ich habe doch seit der ersten Definitions des Zeigers durch die Funktion nicht geändert, und das Array musste im selben Speicher sein. Eine Vermutung von mir: Liegt es am Stack? Kenne mich da nicht so gut aus.</p>
<p>Vielen Dank für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309441/arrays-zeiger-und-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 16:36:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309441.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Oct 2012 06:23:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 06:23:54 GMT]]></title><description><![CDATA[<p>Hallo.<br />
Ich habe ein Verständnisproblem, da C++ für mich eine unerklärliche Sache macht (hat aber bestimmt seinen Grund).<br />
Ich habe das untere Programm geschrieben und möchte jetzt einfach im Programm &quot;normale&quot; den Zeiger auf das Array &quot;c&quot; übergeben. Erstmal das Programm:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;conio.h&gt;

int * normale( int vektor[2] )
{
	int c[2]; // Definiere das Array
	int *p=&amp;c[0]; // Definiere den Zeiger auf das erste Element des Arrays

	c[0] = vektor[0] - vektor[1];
	c[1] = vektor[0] * vektor[1];

	return &amp;c[0];
	return p;	
}

int main()
{
	int y[2] = {7, 2};
	int i;
	int *zeiger;

	zeiger = normale(y);
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;

	zeiger = normale(y);
	zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;

	getch();

	return 0;
}
</code></pre>
<p>Und mein Problem tritt hier auf:</p>
<pre><code class="language-cpp">zeiger = normale(y);
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;

	zeiger = normale(y);
	zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
</code></pre>
<p>Ich hole mir den Zeiger von der Funktion. Die erste Ausgabe gibt mir das richtige heraus. Doch die zweite Ausgabe ergibt schon etwas anderes, was ich nicht verstehe. Ich bearbeite den Zeiger doch gar nicht, und dieser ruft was anderes auf?</p>
<p>Wenn ich</p>
<pre><code class="language-cpp">zeiger = normale(y);
	std::cout &lt;&lt; zeiger &lt;&lt; std::endl;
	std::cout &lt;&lt; zeiger &lt;&lt; std::endl;
</code></pre>
<p>aufrufe, also die Adresse ausgebe, kommt die selbe heraus. Wieso aber wird dann mit &quot;*zeiger&quot; jeweils ein anderer Inhalt ausgegeben??</p>
<p>Und zuletzt: wenn ich nun den Zeiger auf das nächste Feld im Array zeigen lassen möchte, mache ich es ja so wie</p>
<pre><code class="language-cpp">zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
</code></pre>
<p>Nur, dann zeigt er auch nicht auf das richtige Element, sondern auf irgendeinen Quatsch. Ich muss, bevor ich den Zeiger erhöhe, zuerst</p>
<pre><code class="language-cpp">zeiger = normale(y);
	zeiger++;
	std::cout &lt;&lt; *zeiger &lt;&lt; std::endl;
</code></pre>
<p>machen, dem Zeiger also nochmal neu definieren. Wieso? Ich habe doch seit der ersten Definitions des Zeigers durch die Funktion nicht geändert, und das Array musste im selben Speicher sein. Eine Vermutung von mir: Liegt es am Stack? Kenne mich da nicht so gut aus.</p>
<p>Vielen Dank für die Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263073</guid><dc:creator><![CDATA[RobertB]]></dc:creator><pubDate>Tue, 23 Oct 2012 06:23:54 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 06:45:01 GMT]]></title><description><![CDATA[<p>Nach Verlassen von <em>normale</em>, wird <em>int c[2]</em> zerstört. Du greifst auf Speicher zu der Dir nicht mehr gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263078</guid><dc:creator><![CDATA[fsdff]]></dc:creator><pubDate>Tue, 23 Oct 2012 06:45:01 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 06:54:06 GMT]]></title><description><![CDATA[<p>Mit c[2] meinst das ganze Array?<br />
Weil, auf c[0] kann ich zugreifen, nur auf c[1] nicht. Dass kann ich erst, wenn ich nochmal den Zeiger neu definiere.<br />
Und wie kann man das besser lösen? Ich möchte eben ein array in einer Funktion ausgeben. Dachte, das geht nur über den Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263083</guid><dc:creator><![CDATA[RobertB]]></dc:creator><pubDate>Tue, 23 Oct 2012 06:54:06 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 07:03:33 GMT]]></title><description><![CDATA[<p>Kauf dir ein gutes Grundlagenbuch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263087</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 23 Oct 2012 07:03:33 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 07:04:19 GMT]]></title><description><![CDATA[<p>Wenn du ein Array per Funktion ausgeben willst, dann uebergib das Array und mach als zweiten Parameter die Anzahl der Elemente. Oder nutz gleich <code>std::array</code> .</p>
<p>Ach ja, das c[0] richtig ist und c[1] nicht muss nichts ungewoehnliches heissen. Der Standard garantiert fuer nix, wenn man in Speicher rumwerkelt, der einem nicht gehoert.</p>
<p>Und zu deinem Code: Was bezweckst du mit 2 <code>return</code> -Anweisungen nacheinander?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263089</guid><dc:creator><![CDATA[Jonas OSDever]]></dc:creator><pubDate>Tue, 23 Oct 2012 07:04:19 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 07:14:22 GMT]]></title><description><![CDATA[<p>Das mit den 2 return-Anweisungen war ein vertipper. Aber das mit dem std::array bzw. std::vector muss ich jetzt wohl suchen, wie das geht. Danke aber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263092</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263092</guid><dc:creator><![CDATA[RobertB]]></dc:creator><pubDate>Tue, 23 Oct 2012 07:14:22 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 07:21:10 GMT]]></title><description><![CDATA[<p>Aber, wie übergebe ich jetzt einer Funktion einen Vektor?<br />
Möchte das mit irgendwie mit</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
std::vector&lt;float&gt; Vektorname;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2263094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263094</guid><dc:creator><![CDATA[RobertB]]></dc:creator><pubDate>Tue, 23 Oct 2012 07:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 07:27:00 GMT]]></title><description><![CDATA[<p>RobertB schrieb:</p>
<blockquote>
<p>Aber, wie übergebe ich jetzt einer Funktion einen Vektor?</p>
</blockquote>
<p>so, wie jeden anderen Typ auch --&gt; Grundlagenbuch</p>
<p>Wenn du nur lesen willst, übergibst du den vector idealerweise als const-reference. Wenn du ihn in der Funktion füllen möchtest, dann als non-const Reference. Alternativ kannst du ihn auch in der Funktion erstellen und dann zurückgeben (per value).</p>
<p>RobertB schrieb:</p>
<blockquote>
<p>Möchte das mit irgendwie mit</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
std::vector&lt;float&gt; Vektorname;
</code></pre>
</blockquote>
<p>soweit gar nicht schlecht, mit diesen Zeilen hast du dir schonmal einen (leeren) std::vector erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263095</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Tue, 23 Oct 2012 07:27:00 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 08:03:36 GMT]]></title><description><![CDATA[<p>daddy_felix schrieb:</p>
<blockquote>
<p>Wenn du nur lesen willst, übergibst du den vector idealerweise als const-reference. Wenn du ihn in der Funktion füllen möchtest, dann als non-const Reference. Alternativ kannst du ihn auch in der Funktion erstellen und dann zurückgeben (per value).</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Möchte noch anmerken: Ersteres nennt sich call-by-reference, letzteres call-by-value. Dass der TE auch das richtige googelt. <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/2263108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263108</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 23 Oct 2012 08:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to Arrays, Zeiger und Funktionen on Tue, 23 Oct 2012 09:31:08 GMT]]></title><description><![CDATA[<p>Passender Thread.</p>
<p>Sniped <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2263138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2263138</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Tue, 23 Oct 2012 09:31:08 GMT</pubDate></item></channel></rss>