<?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[[C++] Vektoren und deren Übergabe an Funktionen]]></title><description><![CDATA[<p>Hi!</p>
<p>ich habe einige relativ allgemeine Fragen zu Vektoren und deren Nutzung in C++. Das Thema kommt zwar relativ oft auf, aber ich habe bis heute keine wirkliche Lösung zu meinen Fragen gefunden.</p>
<p>1. Eindimensionaler Vektor<br />
Gehe ich richtig in der Annahme, dass ein eindimensionaler Vektor im Arbeitsspeicher nur ein zusammenhängender Block der Werte ist. Beispiel</p>
<pre><code class="language-cpp">int vektor[3]={1,2,3};
</code></pre>
<p>sollte im Speicher</p>
<blockquote>
<p>|1|2|3|</p>
</blockquote>
<p>sein. Es wird somit keine Adresse im Arbeitsspeicher gespeichert, also kein Zeiger auf das erste Element angelegt. Der Name vektor wird vom Compiler aber in eine Adresse (evtl. inclusive Offset übersetzt).</p>
<p>Soweit so richtig ?</p>
<p>2. Aufruf eine Eindimensionalen Vektors</p>
<pre><code class="language-cpp">void funktion(int *ptr, int elemente)
{
    ptr[2]=... //und soweiter und sofort
}
</code></pre>
<p>Beim Aufruf der Funktion wird einfach die Adresse übergeben. Die Adresse wird in dem Zeiger ptr gespeichert. Anschließend wird zur Adresse wegen ptr[2] einfach 8 byte für 2 int dazugezählt. Somit gibt es jetzt im Unterschied zu oben im Speicher einen Zeiger.</p>
<p>Richtig?</p>
<p>3. Mehrdimensionales Array</p>
<pre><code class="language-cpp">vektor[2][3]= { {1,2,3}, {4,5,6} };
</code></pre>
<p>Bei mehrdimensionalen Vektoren existiert zum eindimensionalen Vektor aus 1. auser den Unterschiedlichen Zahlen im Arbeitsspeicher kein Unterschied.<br />
Also:<br />
|1|2|3|4|5|6|</p>
<p>Richtig?</p>
<p>4. Übergabe von 2-dimensionalem Vektor</p>
<pre><code class="language-cpp">void funktion2(int array[][3])
{
    array[1][1]=... /und soweiter und sofort
}
</code></pre>
<p>Meine Frage ist nun aber, wo im Gegensatz zu 2. der Zeiger geblieben ist. Beim Aufruf wird wieder die Adresse mit dem ersten Element übergeben. Aber warum habe ich im Gegensatz zu 1. jetzt nicht wieder einen Zeiger, wie z.B.</p>
<pre><code class="language-cpp">void funktion2(int *ptr)
{
    ptr[1][1]=... /und soweiter und sofort
}
</code></pre>
<p>oder sogar einen Array von Zeigern wie z.B.</p>
<pre><code class="language-cpp">void funktion2(int *ptr[3])
{
    //jeder Zeiger zeigt auf eine Zeile oder Spalte
}
</code></pre>
<p>Was passiert denn nun mit der Adresse, die am Funktionsaufruf übergeben wird? Wird die in einem Zeiger im Speicher gespeichert? Und wie viele Zeiger gibt es bei 2-dimensionalen Arrays? 1 oder 2 oder 4?</p>
<p>Ich hoffe ihr könnt ein bischen Licht ins Dunkel bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/308197/c-vektoren-und-deren-übergabe-an-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 00:23:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/308197.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 17 Sep 2012 16:36:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 16:36:03 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>ich habe einige relativ allgemeine Fragen zu Vektoren und deren Nutzung in C++. Das Thema kommt zwar relativ oft auf, aber ich habe bis heute keine wirkliche Lösung zu meinen Fragen gefunden.</p>
<p>1. Eindimensionaler Vektor<br />
Gehe ich richtig in der Annahme, dass ein eindimensionaler Vektor im Arbeitsspeicher nur ein zusammenhängender Block der Werte ist. Beispiel</p>
<pre><code class="language-cpp">int vektor[3]={1,2,3};
</code></pre>
<p>sollte im Speicher</p>
<blockquote>
<p>|1|2|3|</p>
</blockquote>
<p>sein. Es wird somit keine Adresse im Arbeitsspeicher gespeichert, also kein Zeiger auf das erste Element angelegt. Der Name vektor wird vom Compiler aber in eine Adresse (evtl. inclusive Offset übersetzt).</p>
<p>Soweit so richtig ?</p>
<p>2. Aufruf eine Eindimensionalen Vektors</p>
<pre><code class="language-cpp">void funktion(int *ptr, int elemente)
{
    ptr[2]=... //und soweiter und sofort
}
</code></pre>
<p>Beim Aufruf der Funktion wird einfach die Adresse übergeben. Die Adresse wird in dem Zeiger ptr gespeichert. Anschließend wird zur Adresse wegen ptr[2] einfach 8 byte für 2 int dazugezählt. Somit gibt es jetzt im Unterschied zu oben im Speicher einen Zeiger.</p>
<p>Richtig?</p>
<p>3. Mehrdimensionales Array</p>
<pre><code class="language-cpp">vektor[2][3]= { {1,2,3}, {4,5,6} };
</code></pre>
<p>Bei mehrdimensionalen Vektoren existiert zum eindimensionalen Vektor aus 1. auser den Unterschiedlichen Zahlen im Arbeitsspeicher kein Unterschied.<br />
Also:<br />
|1|2|3|4|5|6|</p>
<p>Richtig?</p>
<p>4. Übergabe von 2-dimensionalem Vektor</p>
<pre><code class="language-cpp">void funktion2(int array[][3])
{
    array[1][1]=... /und soweiter und sofort
}
</code></pre>
<p>Meine Frage ist nun aber, wo im Gegensatz zu 2. der Zeiger geblieben ist. Beim Aufruf wird wieder die Adresse mit dem ersten Element übergeben. Aber warum habe ich im Gegensatz zu 1. jetzt nicht wieder einen Zeiger, wie z.B.</p>
<pre><code class="language-cpp">void funktion2(int *ptr)
{
    ptr[1][1]=... /und soweiter und sofort
}
</code></pre>
<p>oder sogar einen Array von Zeigern wie z.B.</p>
<pre><code class="language-cpp">void funktion2(int *ptr[3])
{
    //jeder Zeiger zeigt auf eine Zeile oder Spalte
}
</code></pre>
<p>Was passiert denn nun mit der Adresse, die am Funktionsaufruf übergeben wird? Wird die in einem Zeiger im Speicher gespeichert? Und wie viele Zeiger gibt es bei 2-dimensionalen Arrays? 1 oder 2 oder 4?</p>
<p>Ich hoffe ihr könnt ein bischen Licht ins Dunkel bringen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252043</guid><dc:creator><![CDATA[anon99]]></dc:creator><pubDate>Mon, 17 Sep 2012 16:36:03 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 17:32:22 GMT]]></title><description><![CDATA[<p>Edit: Ach, er meinte nichts mit <code>std::vector</code> . Das hat mich verwirrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252049</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 17 Sep 2012 17:32:22 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 17:27:28 GMT]]></title><description><![CDATA[<p>anon99 schrieb:</p>
<blockquote>
<p>1. Eindimensionaler Vektor<br />
Gehe ich richtig in der Annahme, dass ein eindimensionaler Vektor im Arbeitsspeicher nur ein zusammenhängender Block der Werte ist. Beispiel</p>
<pre><code class="language-cpp">int vektor[3]={1,2,3};
</code></pre>
<p>sollte im Speicher</p>
<blockquote>
<p>|1|2|3|</p>
</blockquote>
</blockquote>
<p>Richtig.</p>
<p>anon99 schrieb:</p>
<blockquote>
<p>2. Aufruf eine Eindimensionalen Vektors</p>
<pre><code class="language-cpp">void funktion(int *ptr, int elemente)
{
    ptr[2]=... //und soweiter und sofort
}
</code></pre>
<p>Beim Aufruf der Funktion wird einfach die Adresse übergeben. Die Adresse wird in dem Zeiger ptr gespeichert. Anschließend wird zur Adresse wegen ptr[2] einfach 8 byte für 2 int dazugezählt.</p>
</blockquote>
<p>Richtig. Bei der Übergabe an eine Funktion zerfällt das Array in einen Zeiger auf das erste Element des Arrays. Jain. Ob es 8 Bytes sind, ist systemabhängig, darauf kannst du dich nicht verlassen. Es gibt bestimmt auch Systeme, wo es 2*2Bytes sind.</p>
<p>anon99 schrieb:</p>
<blockquote>
<p>3. Mehrdimensionales Array</p>
<pre><code class="language-cpp">vektor[2][3]= { {1,2,3}, {4,5,6} };
</code></pre>
<p>Bei mehrdimensionalen Vektoren existiert zum eindimensionalen Vektor aus 1. auser den Unterschiedlichen Zahlen im Arbeitsspeicher kein Unterschied.<br />
Also:<br />
|1|2|3|4|5|6|</p>
</blockquote>
<p>Richtig.</p>
<p>anon99 schrieb:</p>
<blockquote>
<p>4. Übergabe von 2-dimensionalem Vektor</p>
<pre><code class="language-cpp">void funktion2(int array[][3])
{
    array[1][1]=... /und soweiter und sofort
}
</code></pre>
<p>Meine Frage ist nun aber, wo im Gegensatz zu 2. der Zeiger geblieben ist. Beim Aufruf wird wieder die Adresse mit dem ersten Element übergeben.</p>
</blockquote>
<p>Richtig. Auch hier hast du ein array-to-pointer decay. Deine Schreibweise ist nur unglücklich gewählt:</p>
<pre><code class="language-cpp">void funktion2(int (*p)[3])
{
    p[1][1];
}
</code></pre>
<p>p is a pointer to an array of 3 ints.</p>
<p>anon99 schrieb:</p>
<blockquote>
<p>Aber warum habe ich im Gegensatz zu 1. jetzt nicht wieder einen Zeiger, wie z.B.</p>
<pre><code class="language-cpp">void funktion2(int *ptr)
{
    ptr[1][1]=... /und soweiter und sofort
}
</code></pre>
<p>oder sogar einen Array von Zeigern wie z.B.</p>
<pre><code class="language-cpp">void funktion2(int *ptr[3])
{
    //jeder Zeiger zeigt auf eine Zeile oder Spalte
}
</code></pre>
<p>Was passiert denn nun mit der Adresse, die am Funktionsaufruf übergeben wird? Wird die in einem Zeiger im Speicher gespeichert? Und wie viele Zeiger gibt es bei 2-dimensionalen Arrays? 1 oder 2 oder 4?</p>
</blockquote>
<p>Du bekommst bei der Übergabe eines Arrays eine Funktion immer <strong>einen</strong> Zeiger auf das erste Element des Arrays:</p>
<pre><code class="language-cpp">void funktion2(int (*p)[3][4][5][6])
{
    p[1][2][3][4][5];
}
</code></pre>
<p>p is <strong>a</strong> pointer to an array of 3 arrays of 4 arrays of 5 arrays of 6 ints.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252059</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 17 Sep 2012 17:27:28 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 17:30:25 GMT]]></title><description><![CDATA[<p>danke, die C++ Schreibweise mit array[][3] hat mich ein bisschen verwirrt. Ich habe nicht kapiert, dass das eine Schreibweise für Zeiger auf einen Array ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252061</guid><dc:creator><![CDATA[anon99]]></dc:creator><pubDate>Mon, 17 Sep 2012 17:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 17:33:44 GMT]]></title><description><![CDATA[<p>anon99 schrieb:</p>
<blockquote>
<p>danke, die C++ Schreibweise mit array[][3] hat mich ein bisschen verwirrt. Ich habe nicht kapiert, dass das eine Schreibweise für Zeiger auf einen Array ist.</p>
</blockquote>
<p>Nein, das ist es auch nicht! Wenn du</p>
<pre><code class="language-cpp">int array[][3] = {...
</code></pre>
<p>schreibst, lässt du die Größe der ersten Dimension deduzieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252063</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Mon, 17 Sep 2012 17:33:44 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 17:38:49 GMT]]></title><description><![CDATA[<p>anon99 schrieb:</p>
<blockquote>
<p>danke, die C++ Schreibweise mit array[][3] hat mich ein bisschen verwirrt. Ich habe nicht kapiert, dass das eine Schreibweise für Zeiger auf einen Array ist.</p>
</blockquote>
<p>Aber Vorsicht. Das ist nur bei der Übergabe an eine Funktion so. Du kannst nicht einfach überall [][] durch (*)[] ersetzen, weil ein Array kein zeiger ist und umgekehrt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252069</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252069</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Mon, 17 Sep 2012 17:38:49 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Mon, 17 Sep 2012 18:04:41 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Nein, das ist es auch nicht! Wenn du</p>
<pre><code class="language-cpp">int array[][3] = {...
</code></pre>
<p>schreibst, lässt du die Größe der ersten Dimension deduzieren.</p>
</blockquote>
<p>was um alles in der Welt muss ich unter deduzieren verstehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252081</guid><dc:creator><![CDATA[anon99]]></dc:creator><pubDate>Mon, 17 Sep 2012 18:04:41 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Tue, 18 Sep 2012 11:17:00 GMT]]></title><description><![CDATA[<p>anon99 schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Nein, das ist es auch nicht! Wenn du</p>
<pre><code class="language-cpp">int array[][3] = {...
</code></pre>
<p>schreibst, lässt du die Größe der ersten Dimension deduzieren.</p>
</blockquote>
<p>was um alles in der Welt muss ich unter deduzieren verstehen?</p>
</blockquote>
<p>Sone wollte dir damit sagen, dass du die die Größe der ersten Dimension hier nicht angeben musst, da sie der Compiler selbst berechnen kann, also überlassen wir es doch dem Compiler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252285</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 18 Sep 2012 11:17:00 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Tue, 18 Sep 2012 16:06:12 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>anon99 schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<p>Nein, das ist es auch nicht! Wenn du</p>
<pre><code class="language-cpp">int array[][3] = {...
</code></pre>
<p>schreibst, lässt du die Größe der ersten Dimension deduzieren.</p>
</blockquote>
<p>was um alles in der Welt muss ich unter deduzieren verstehen?</p>
</blockquote>
<p>Sone wollte dir damit sagen, dass du die die Größe der ersten Dimension hier nicht angeben musst, da sie der Compiler selbst berechnen kann, also überlassen wir es doch dem Compiler.</p>
</blockquote>
<p>Deduktion ist einfach &quot;Ableitung&quot;. Man kann also logisch erkennen, wie groß die erste Dimension ist.</p>
<p>Faustregel: Mach nichts, was der Compiler für dich erledigen kann!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252415</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 18 Sep 2012 16:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to [C++] Vektoren und deren Übergabe an Funktionen on Tue, 18 Sep 2012 16:35:38 GMT]]></title><description><![CDATA[<p>Man könnte auch &quot;herleiten&quot; sagen. Oder &quot;folgern&quot;.<br />
Was im Zusammenhang mit Sprachen die Objektorientierung mit Vererbung unterstützen weniger verwirrend wäre als &quot;ableiten&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2252424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2252424</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 18 Sep 2012 16:35:38 GMT</pubDate></item></channel></rss>