<?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 spielerei, frage ob ich richtig denke]]></title><description><![CDATA[<p>hallo habe mir als uebungszweck folgendes programm geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main(int argc, char *argv[])
{
  cout &lt;&lt; argc &lt;&lt; &quot; Parameter\n&quot;;

  //gleiche adresse wie erstes element in for
  cout &lt;&lt; &quot;Speicheradresse des arrays: &quot; &lt;&lt; argv &lt;&lt; endl; //erstes elemetn
  cout &lt;&lt; &quot;Und der Wert?: &quot; &lt;&lt; *argv &lt;&lt; endl &lt;&lt; endl; //programname 
  // !!! warum benoetige ich hier zwei endl um ein endl zu machen???

  int i = 0; 
  //array nur mit pointer durchlaufen
  //solange wir den wert lesen duerfen - also != segmentation fault
  for(char **p = argv; *p; ++p)
  { 
    cout &lt;&lt; &quot;p fuer element &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; p &lt;&lt; endl; //speicher adresse der einzelnen zeilen
    cout &lt;&lt; &quot;*p fuer element &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; *p &lt;&lt; endl; //was steht in der zeile?
    cout &lt;&lt; &quot;**p fuer element &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; **p &lt;&lt; endl; //???
    cout &lt;&lt; endl;
    ++i;
  }
  cout &lt;&lt; &quot;*** done ***&quot; &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>hier meine gedanken dazu:</p>
<p>das im parameter uebergebene</p>
<pre><code class="language-cpp">char *argv[]
</code></pre>
<p>ist ja ein array von pointern auch chars.<br />
(bitte korrigieren wenn ich was falsches sage!)<br />
hier gleich mal eine frage, es ist ja so dass sich nicht nur chars sondern strings verbergen, also ist es immer nur ein pointer auf das erste zeichen des strings. dieses zeichen hat je nachdem wie lang der eingegeben string war, genau so viel speicherplatz reserviert dass sich das ganze wort ausgeht.<br />
wenn ich</p>
<pre><code class="language-cpp">argv
</code></pre>
<p>also die erste adresse des arrays inkrementiere bekomme ich den ersten speicherplatzt des zweiten strings.</p>
<p>zu meinem programm, ich moechte das ganze array mit einem pointer durchgehen.<br />
also muss ich einen doppel pointer vom typ char machen der mir (zu beginn) auf die erste speicheradresse zeigt.</p>
<p>nun meine große frage was in der for schleife passiert:<br />
mit p, das verstehe ich noch gebe ich die adresse aus an der ich mich befinde.<br />
also nach jeder iteration um genau 4 stellen (ein char) weiter.<br />
mit dem ersten * gehe ich eine ebene hoeher, dass dachte ich mir da ich ja einenen pointer auf einen pointer habe muesste auch eine adresse sein, ist es aber nicht wie ich sehe, es ist der komplette string.<br />
um mich ganz zu verwirren gibt mir dann **p nur den ersten buchstaben aus??</p>
<p>waere nett wenn mir das jemand erklaeren koennte - DANKE!</p>
<p>falls es interessiert, der output:</p>
<blockquote>
<p>4 Parameter<br />
Speicheradresse des arrays: 0x6116b6d0<br />
Und der Wert?: pointerTest</p>
<p>p fuer element 0: 0x6116b6d0<br />
*p fuer element 0: pointerTest<br />
**p fuer element 0: p</p>
<p>p fuer element 1: 0x6116b6d4<br />
*p fuer element 1: eins<br />
**p fuer element 1: e</p>
<p>p fuer element 2: 0x6116b6d8<br />
*p fuer element 2: zwei<br />
**p fuer element 2: z</p>
<p>p fuer element 3: 0x6116b6dc<br />
*p fuer element 3: drei<br />
**p fuer element 3: d</p>
<p>*** done ***</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/topic/226203/pointer-spielerei-frage-ob-ich-richtig-denke</link><generator>RSS for Node</generator><lastBuildDate>Thu, 01 Oct 2026 01:17:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/226203.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Oct 2008 16:14:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 17:40:33 GMT]]></title><description><![CDATA[<p>hallo habe mir als uebungszweck folgendes programm geschrieben:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

int main(int argc, char *argv[])
{
  cout &lt;&lt; argc &lt;&lt; &quot; Parameter\n&quot;;

  //gleiche adresse wie erstes element in for
  cout &lt;&lt; &quot;Speicheradresse des arrays: &quot; &lt;&lt; argv &lt;&lt; endl; //erstes elemetn
  cout &lt;&lt; &quot;Und der Wert?: &quot; &lt;&lt; *argv &lt;&lt; endl &lt;&lt; endl; //programname 
  // !!! warum benoetige ich hier zwei endl um ein endl zu machen???

  int i = 0; 
  //array nur mit pointer durchlaufen
  //solange wir den wert lesen duerfen - also != segmentation fault
  for(char **p = argv; *p; ++p)
  { 
    cout &lt;&lt; &quot;p fuer element &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; p &lt;&lt; endl; //speicher adresse der einzelnen zeilen
    cout &lt;&lt; &quot;*p fuer element &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; *p &lt;&lt; endl; //was steht in der zeile?
    cout &lt;&lt; &quot;**p fuer element &quot; &lt;&lt; i &lt;&lt; &quot;: &quot; &lt;&lt; **p &lt;&lt; endl; //???
    cout &lt;&lt; endl;
    ++i;
  }
  cout &lt;&lt; &quot;*** done ***&quot; &lt;&lt; endl;

  return 0;
}
</code></pre>
<p>hier meine gedanken dazu:</p>
<p>das im parameter uebergebene</p>
<pre><code class="language-cpp">char *argv[]
</code></pre>
<p>ist ja ein array von pointern auch chars.<br />
(bitte korrigieren wenn ich was falsches sage!)<br />
hier gleich mal eine frage, es ist ja so dass sich nicht nur chars sondern strings verbergen, also ist es immer nur ein pointer auf das erste zeichen des strings. dieses zeichen hat je nachdem wie lang der eingegeben string war, genau so viel speicherplatz reserviert dass sich das ganze wort ausgeht.<br />
wenn ich</p>
<pre><code class="language-cpp">argv
</code></pre>
<p>also die erste adresse des arrays inkrementiere bekomme ich den ersten speicherplatzt des zweiten strings.</p>
<p>zu meinem programm, ich moechte das ganze array mit einem pointer durchgehen.<br />
also muss ich einen doppel pointer vom typ char machen der mir (zu beginn) auf die erste speicheradresse zeigt.</p>
<p>nun meine große frage was in der for schleife passiert:<br />
mit p, das verstehe ich noch gebe ich die adresse aus an der ich mich befinde.<br />
also nach jeder iteration um genau 4 stellen (ein char) weiter.<br />
mit dem ersten * gehe ich eine ebene hoeher, dass dachte ich mir da ich ja einenen pointer auf einen pointer habe muesste auch eine adresse sein, ist es aber nicht wie ich sehe, es ist der komplette string.<br />
um mich ganz zu verwirren gibt mir dann **p nur den ersten buchstaben aus??</p>
<p>waere nett wenn mir das jemand erklaeren koennte - DANKE!</p>
<p>falls es interessiert, der output:</p>
<blockquote>
<p>4 Parameter<br />
Speicheradresse des arrays: 0x6116b6d0<br />
Und der Wert?: pointerTest</p>
<p>p fuer element 0: 0x6116b6d0<br />
*p fuer element 0: pointerTest<br />
**p fuer element 0: p</p>
<p>p fuer element 1: 0x6116b6d4<br />
*p fuer element 1: eins<br />
**p fuer element 1: e</p>
<p>p fuer element 2: 0x6116b6d8<br />
*p fuer element 2: zwei<br />
**p fuer element 2: z</p>
<p>p fuer element 3: 0x6116b6dc<br />
*p fuer element 3: drei<br />
**p fuer element 3: d</p>
<p>*** done ***</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1607316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607316</guid><dc:creator><![CDATA[AbsoluterBeginner]]></dc:creator><pubDate>Thu, 30 Oct 2008 17:40:33 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 19:01:56 GMT]]></title><description><![CDATA[<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>das im parameter uebergebene</p>
<pre><code class="language-cpp">char *argv[]
</code></pre>
<p>ist ja ein array von pointern auch chars.<br />
(bitte korrigieren wenn ich was falsches sage!)</p>
</blockquote>
<p>Genau genommen ist es nur ein Zeiger auf einen Zeiger auf einen <code>char</code> . Arrays können an sich nicht übergeben werden, jedoch kann der Zeiger in deinem Fall fast wie ein Array gehandhabt werden, da er auf einen zusammenhängenden Speicherbereich zeigt. Es verhält sich also wie ein dynamisches Array.</p>
<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>dieses zeichen hat je nachdem wie lang der eingegeben string war, genau so viel speicherplatz reserviert dass sich das ganze wort ausgeht.</p>
</blockquote>
<p>Nein. Im ersten Zeichen wird keine Information ausser dem Zeichen selbst gespeichert. C-Strings sind nullterminiert, d.h. das Zeichen <code>'\0'</code> markiert das Ende der Zeichenkette.</p>
<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>wenn ich</p>
<pre><code class="language-cpp">argv
</code></pre>
<p>also die erste adresse des arrays inkrementiere bekomme ich den ersten speicherplatzt des zweiten strings.</p>
</blockquote>
<p>Ja, der <code>char**</code> -Zeiger verweist dann auf den nächsten <code>char*-</code> Zeiger, also den nächsten C-String.</p>
<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>zu meinem programm, ich moechte das ganze array mit einem pointer durchgehen.<br />
also muss ich einen doppel pointer vom typ char machen der mir (zu beginn) auf die erste speicheradresse zeigt.</p>
</blockquote>
<p>Ja, das ist eine Möglichkeit. Du kannst aber auch den übergebenen Zeiger direkt verwenden oder auf STL-Algorithmen zurückgreifen, aber das ist wahrscheinlich noch etwas zu früh.</p>
<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>mit dem ersten * gehe ich eine ebene hoeher, dass dachte ich mir da ich ja einenen pointer auf einen pointer habe muesste auch eine adresse sein, ist es aber nicht wie ich sehe, es ist der komplette string.</p>
</blockquote>
<p>Du verwechselst da die Operatoren * und &amp;, die entgegengesetzte Bedeutung haben. <code>operator*</code> dereferenziert einen Zeiger, das heisst, er gibt den Speicherbereich zurück, auf den er verweist. <code>operator&amp;</code> gibt die Adresse einer Variable zurück.</p>
<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>um mich ganz zu verwirren gibt mir dann **p nur den ersten buchstaben aus??</p>
</blockquote>
<p>Ja, du dereferenzierst ja <code>p</code> zwei Mal. Beim ersten Mal greifst du auf den Inhalt von p zu, also das (dynamische) Array von <code>char*</code> (entspricht dem ersten String). Beim zweiten Mal dereferenzierst du gerade den ersten dieser C-Strings und greifst auf dessen erstes Element vom Typ <code>char</code> zu.</p>
<p>Aber lies doch noch einmal den Artikel über Zeiger, den ich dir angegeben habe, dort wird wirklich alles gut beschrieben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607411</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Oct 2008 19:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 21:22:22 GMT]]></title><description><![CDATA[<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>mit dem ersten * gehe ich eine ebene hoeher, dass dachte ich mir da ich ja einenen pointer auf einen pointer habe muesste auch eine adresse sein, ist es aber nicht wie ich sehe, es ist der komplette string.<br />
um mich ganz zu verwirren gibt mir dann **p nur den ersten buchstaben aus??</p>
</blockquote>
<p>Klingt für mich nach einem kleinen Verständnisproblem. Ein c-string ist nichts anderes als ein char*, denn C kennt keinen string Datentyp. Wenn eine Funktion irgendwas mit einem String machen möchte, lässt sie sich einfach einen pointer auf dessen ersten char geben (also einen char*). Wenn sie nun den restlichen string bearbeiten will, erhöht sie einfach den pointer um 1, so dass er auf den nächsten Buchstaben zeigt. Das macht sie solange bis sie auf '\0' trifft, woran sie erkennt das dort der string zuende ist. Ein char** stellt damit tatsächlich ein Array von strings da (ein Zeiger auf das erste Element des Arrays, was ja nun ein char* also ein string ist).</p>
<p>Wenn du nun mit dem ersten * eine Ebene höher gehst, bekommst du, wie du oben vermutest, tatsächlich eine Adresse (einen char*). Und wie du auch richtig beobachtest, ist das gleichzeitig als string interpretierbar (nach meiner Erklärung oben solltest du verstehen warum). Cout weiß auch das es char* als string zu interpretieren hat, daher bekommst du den ganzen string ausgeben.</p>
<p>Nunja wenn du nun noch das zweite * dazunimmst, wird aus deinem Zeiger auf den ersten char des strings direkt der erste char des strings. Auch das hast du ja beobachtet. Ich hoffe das war jetzt nicht zu verwirrend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607510</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Thu, 30 Oct 2008 21:22:22 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 21:34:41 GMT]]></title><description><![CDATA[<p>HyperSonic schrieb:</p>
<blockquote>
<p>Wenn du nun mit dem ersten * <strong>eine Ebene höher gehst</strong>, bekommst du, wie du oben vermutest, tatsächlich eine Adresse (einen char*)</p>
</blockquote>
<p>Eben nicht. Mit dem *-Operator geht man eine Ebene tiefer, also auf den verwiesenen Speicherbereich (Dereferenzierung). Dadurch erhält man nicht zwingend eine Adresse - in diesem Falle nur, weil der Zeiger selbst wieder auf einen Zeiger zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607525</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Oct 2008 21:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 21:55:21 GMT]]></title><description><![CDATA[<p>Jup, das hängt aber halt davon ab, wie man eine Ebene höher definiert. Ich interpretiere seinen Text so, das er nicht Referenzieren und Dereferenzieren verwechselt, sondern er einfach höher anders definiert als du (was möglicherweise nicht intuitiv ist, gebe ich zu).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607537</guid><dc:creator><![CDATA[HyperSonic]]></dc:creator><pubDate>Thu, 30 Oct 2008 21:55:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 22:13:29 GMT]]></title><description><![CDATA[<p>Hmm, das könnte sein, vielleicht habe ich ihn auch falsch verstanden. <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>
<p>Und was das Ebenen-Problem betrifft: Für mich ist halt die unterste Ebene dort, wo direkt mit der Variable gearbeitet wird. Abstaktion (somit auch Indirektion) bedeutet für mich höhere Ebene... <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/1607550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607550</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 30 Oct 2008 22:13:29 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei, frage ob ich richtig denke on Thu, 30 Oct 2008 22:24:22 GMT]]></title><description><![CDATA[<p>hallo leute, vielen dank, ich glaube jetzt habe ich es verstanden.<br />
zu eurer diskussion, ich habe nicht * und &amp; verwechselts, ich meine mit ebene hoeher den wert der variable.<br />
ich denke halt:<br />
ich habe die adresse und wenn ich weiter schaue (also nach oben bzw. vorne kA ;)) sehe ich dann was denn wirklich auf dieser adresse steht.</p>
<p>[quote=&quot;HyperSonic&quot;]</p>
<p>AbsoluterBeginner schrieb:</p>
<blockquote>
<p>...Cout weiß auch das es char* als string zu interpretieren hat, daher bekommst du den ganzen string ausgeben.</p>
</blockquote>
<p>das hat mir entgueltig die augen geoffnet, kann man ja nicht wissen dass cout automatisch ein char* als string interpretiert und ausgiebt.</p>
<p>also werde mich mal weiter spielen hehe<br />
gefaellt mir das forum hier - danke nochmal an euch beiden!!<br />
schoenen abend noch...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1607558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1607558</guid><dc:creator><![CDATA[AbsoluterBeginner]]></dc:creator><pubDate>Thu, 30 Oct 2008 22:24:22 GMT</pubDate></item></channel></rss>