<?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]]></title><description><![CDATA[<p>Ich hab eben solch einen Code in einem anderen Forum gesehen, jetzt hab ich mit dem Code etwas rumexperimentiert und mir ein paar Gedanken zu dem Code gemacht.</p>
<p>Wenn ich schreibe:</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
    while ( *a = *b );
}
</code></pre>
<p>*a zeigt ja dann auf *b</p>
<p>Somit endet es in einer Endlosschleife.</p>
<p>Und wenn ich schreibe:</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
while ( *a++ = *b++ );
}
</code></pre>
<p>a zeigt auf den Nullpointer seiner eigenen Variable b ebenso.</p>
<p>Und wenn ich folgendes, schreibe:<br />
Dann sollte doch eigentlich innerhalb der while Schleife undefiniertes Verhalten auftreten ist das richtig?</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
*a++;
*b++;

while ( *a++ = *b++ );
}
</code></pre>
<pre><code class="language-cpp">char *a=&quot;A&quot;; // Reserviert 1 Byte für das A und 1 Byte für den Nullterminator
*a++; // *a zeigt auf den Nullterminator
*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär :D (undefiniertes Verhalten^^)
</code></pre>
<p>Kann man das so beschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309262/pointer-spielerei</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 12:09:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309262.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Oct 2012 14:04:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:04:21 GMT]]></title><description><![CDATA[<p>Ich hab eben solch einen Code in einem anderen Forum gesehen, jetzt hab ich mit dem Code etwas rumexperimentiert und mir ein paar Gedanken zu dem Code gemacht.</p>
<p>Wenn ich schreibe:</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
    while ( *a = *b );
}
</code></pre>
<p>*a zeigt ja dann auf *b</p>
<p>Somit endet es in einer Endlosschleife.</p>
<p>Und wenn ich schreibe:</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
while ( *a++ = *b++ );
}
</code></pre>
<p>a zeigt auf den Nullpointer seiner eigenen Variable b ebenso.</p>
<p>Und wenn ich folgendes, schreibe:<br />
Dann sollte doch eigentlich innerhalb der while Schleife undefiniertes Verhalten auftreten ist das richtig?</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
*a++;
*b++;

while ( *a++ = *b++ );
}
</code></pre>
<pre><code class="language-cpp">char *a=&quot;A&quot;; // Reserviert 1 Byte für das A und 1 Byte für den Nullterminator
*a++; // *a zeigt auf den Nullterminator
*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär :D (undefiniertes Verhalten^^)
</code></pre>
<p>Kann man das so beschrieben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261657</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261657</guid><dc:creator><![CDATA[Der Zeiger untersucher!]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:21:10 GMT]]></title><description><![CDATA[<p>Du hast das falsch verstanden. a zeigt auf einen char. *a ist dieser char. Dass bei *a++ das ++ auf a wirkt und nicht auf *a liegt daran, dass operator ++ stärker bindet als operator *.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261664</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261664</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:21:10 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:21:41 GMT]]></title><description><![CDATA[<p>Der Zeiger untersucher! schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
    while ( *a = *b );
}
</code></pre>
<p>*a zeigt ja dann auf *b</p>
<p>Somit endet es in einer Endlosschleife.</p>
</blockquote>
<p>Eventuell. Erstmal ist a der Zeiger, und nicht *a. Zweitens könnte in *b der Wert 0 stehen, sodass die Schleife abbricht.</p>
<p>Der Zeiger untersucher! schrieb:</p>
<blockquote>
<p>Und wenn ich folgendes, schreibe:<br />
Dann sollte doch eigentlich innerhalb der while Schleife undefiniertes Verhalten auftreten ist das richtig?</p>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
*a++;
*b++;

while ( *a++ = *b++ );
}
</code></pre>
</blockquote>
<p>Ja da hast du früher oder später UB, du irgendwann *a einen Wert zuweist, obwohl dir der Speicherbereich gar nicht gehört. Es sei denn, in *b steht gleich wieder eine 0 drin.</p>
<p>Der Zeiger untersucher! schrieb:</p>
<blockquote>
<pre><code class="language-cpp">char *a=&quot;A&quot;; // Reserviert 1 Byte für das A und 1 Byte für den Nullterminator
*a++; // *a zeigt auf den Nullterminator
*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär :D (undefiniertes Verhalten^^)
</code></pre>
<p>Kann man das so beschrieben?</p>
</blockquote>
<p>Fast.<br />
1. *a++; --&gt; a zeigt auf '\0' und wird dann dereferenziert.<br />
2. *a++; --&gt; a zeigt auf irgendwas und wird dann dereferenziert.<br />
Beides ist ok. Es wäre nur dann UB, wenn du *a noch etwas zuweisen würdest. Bei 1. weil *a const ist. Bei 2. weil dir der Speicherplatz bei *a nicht gehört.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261665</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 15:07:28 GMT]]></title><description><![CDATA[<p>Da du überall die Pointer dereferenzierst ist das was passiert vollkommen davon abhängig, worauf die Pointer überhaupt zeigen. Insofern ist keine deiner Fragen so richtig beantwortbar, außer dass deine Kommentare jeweils nicht stimmen.</p>
<blockquote>
<pre><code class="language-cpp">while ( *a = *b );
</code></pre>
</blockquote>
<p>Du weist hier jeweils dem Objekt auf das a Zeigt den Wert zu, auf den b zeigt. Solange, bis einer dieser Werte 0 ist. Da sich der Wert nicht ändern wird, ist das entweder nur ein Durchlauf (es ist 0) oder eine Endlosschleife (falls nicht).</p>
<blockquote>
<p>while ( *a++ = *b++ );</p>
</blockquote>
<p>Wie oben, aber du setzt a und b jeweils 1 weiter, verweist also auf das Objekt &quot;eins weiter&quot;. Kommt wieder drauf an, auf was a und b überhaupt zeigen.</p>
<blockquote>
<p>*a++;</p>
</blockquote>
<p>Erhöht den Pointer a, holt den Wert auf den a zeigt, macht mit diesem gar nichts.</p>
<blockquote>
<p>char *a=&quot;A&quot;; // Reserviert 1 Byte für das A und 1 Byte für den Nullterminator</p>
</blockquote>
<p>Reserviert gar nix, außer den Zeiger a. Dieser zeigt auf ein Zeichenkettenliteral im Datensegment des Programms.</p>
<blockquote>
<p>*a++; // *a zeigt auf den Nullterminator</p>
</blockquote>
<p>Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.</p>
<blockquote>
<p>*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> (undefiniertes Verhalten^^)</p>
</blockquote>
<p>Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt. edit: Nein, verzählt. Er zeigt ja noch auf die Null. Erst eines weiter wäre undefiniert.</p>
<p>So ganz scheinst du die Bedeutung von dem Sternchen nicht verstanden zu haben. Bei einer Variablendefinition ziegt es einen Pointertyp an, wenn du es auf einen Pointer anwendest, dann heißt es, dass du dich auf den Wert beziehst, auf den gezeigt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261667</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 18 Oct 2012 15:07:28 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:23:30 GMT]]></title><description><![CDATA[<blockquote>
<p>*a zeigt ja dann auf *b</p>
<p>Somit endet es in einer Endlosschleife.</p>
</blockquote>
<p>Nicht ganz, der Stelle, an die a zeigt wird der Wert der Stelle an die b zeigt zugewiesen und es wird bei der Zuweisung normalerweise eine Referenz auf this zurückgegeben bzw. im Falle von char wird hier einfach *a zurückgegeben. Es endet also in einer Endlosschleife, wenn weder a noch b auf 0 zeigen.<br />
Wenn du willst, dass *a auf b zeigt musst du a = b schreiben. Dann zeigt a auf dieselbe Stelle im Speicher wie b.</p>
<blockquote>
<p>a zeigt auf den Nullpointer seiner eigenen Variable b ebenso.</p>
</blockquote>
<p>Ne, a und b werden jeweils solange inkrementiert, bis die Zuweisung 0 zurückgibt und währenddessen werden alle Werte von *a zu *b kopiert.</p>
<p>Du hast eine falsche Einbildung von dem Dereferenzierungsoperator. Mit diesem (dem <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="😉"
    /> greifst du auf den Wert zu, der in an der Stelle im Speicher steht, auf die der Zeiger selbst zeigt. *a = 'a'; weist also der Stelle im Speicher, auf die der Zeiger a zeigt den wert 'a' zu.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261669</guid><dc:creator><![CDATA[Der Tobi]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:23:30 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:27:24 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>Der Zeiger untersucher! schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void blup(char *a, char  *b)
{
    while ( *a = *b );
}
</code></pre>
<p>*a zeigt ja dann auf *b</p>
<p>Somit endet es in einer Endlosschleife.</p>
</blockquote>
<p>Eventuell. Erstmal ist a der Zeiger, und nicht *a. Zweitens könnte in *b der Wert 0 stehen, sodass die Schleife abbricht.</p>
</blockquote>
<p>Ich hoffe ich störe nicht mit einer Zwischenfrage :).<br />
&quot;=&quot; ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?<br />
Oder fliegt dann eine Exception ? Wegen Null-Pointer ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261672</guid><dc:creator><![CDATA[martin_zi]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:27:24 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:29:01 GMT]]></title><description><![CDATA[<p>martin_zi schrieb:</p>
<blockquote>
<p>&quot;=&quot; ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?</p>
</blockquote>
<p>Der Wert einer Zuweisung ist der Wert der zugewiesen wird. a = 0 ist z.B. 0 und daher false. (Deswegen funktioniert ja auch a = b = c = 5 und a, b und c sind 5.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261674</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:29:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:29:50 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>*a++; // *a zeigt auf den Nullterminator</p>
</blockquote>
<p>Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.</p>
<blockquote>
<p>*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> (undefiniertes Verhalten^^)</p>
</blockquote>
<p>Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt.</p>
</blockquote>
<p>Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261675</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:37:38 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>martin_zi schrieb:</p>
<blockquote>
<p>&quot;=&quot; ist ja eine Zuweisung. Die ist ja immer true oder nicht ? Oder warum bricht da was ab ?</p>
</blockquote>
<p>Der Wert einer Zuweisung ist der Wert der zugewiesen wird. a = 0 ist z.B. 0 und daher false. (Deswegen funktioniert ja auch a = b = c = 5 und a, b und c sind 5.)</p>
</blockquote>
<p>Achne <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> .. tatsächlich .. ich bin doch etwas geschockt das mir das noch nicht so bewusst war <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261679</guid><dc:creator><![CDATA[martin_zi]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:37:38 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:39:29 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?</p>
</blockquote>
<p>In dem Beispiel ist das nicht undefiniert, aber das hier</p>
<pre><code class="language-cpp">const char* p = &quot;A&quot;;
++p;
*++p;
</code></pre>
<p>schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261680</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:39:28 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<blockquote>
<p>*a++; // *a zeigt auf den Nullterminator</p>
</blockquote>
<p>Ja. Außerdem schaust du dir das Nullzeichen mit dem * an. Siehe oben. Macht wieder gar nix.</p>
<blockquote>
<p>*a++; // *a zeigt auf vielleicht auf den Weg zum Millionär <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> (undefiniertes Verhalten^^)</p>
</blockquote>
<p>Ja, das ist nun undefiniert, weil du dir wer weiß was anguckt.</p>
</blockquote>
<p>Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?</p>
</blockquote>
<p>Nein, einen wilden (oder Null-) Zeiger auch nur zu dereferenzieren ist UB.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261681</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:39:28 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:51:01 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>Sicher? Ich dachte lesen sei erlaubt nur schreiben nicht?</p>
</blockquote>
<p>Ja sicher. Die Adresse könnte zum Beispiel gar nicht gemappt sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261691</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:54:11 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>In dem Beispiel ist das nicht undefiniert</p>
</blockquote>
<p>Klar ist das &quot;undefiniert&quot;: <a href="http://ideone.com/2E6cm" rel="nofollow">http://ideone.com/2E6cm</a></p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261694</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:54:11 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 14:55:39 GMT]]></title><description><![CDATA[<p>Probe-Nutzer schrieb:</p>
<blockquote>
<p>cooky451 schrieb:</p>
<blockquote>
<p>In dem Beispiel ist das nicht undefiniert</p>
</blockquote>
<p>Klar ist das &quot;undefiniert&quot;: <a href="http://ideone.com/2E6cm" rel="nofollow">http://ideone.com/2E6cm</a></p>
</blockquote>
<p>C Noob. <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="😉"
    /> <a href="http://ideone.com/oWQKp" rel="nofollow">http://ideone.com/oWQKp</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261696</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 18 Oct 2012 14:55:39 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer spielerei on Thu, 18 Oct 2012 15:00:09 GMT]]></title><description><![CDATA[<p>Probe-Nutzer schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>In dem Beispiel ist das nicht undefiniert</p>
</blockquote>
<p>Klar ist das &quot;undefiniert&quot;: <a href="http://ideone.com/2E6cm" rel="nofollow">http://ideone.com/2E6cm</a></p>
</blockquote>
<p>Nein, es ist nicht undefiniert.</p>
<pre><code class="language-cpp">int main()
{
    char *a=&quot;A&quot;;
</code></pre>
<p>soweit ists ja klar, denke ich.</p>
<pre><code class="language-cpp">*a++;
</code></pre>
<p>hier wird nun a dereferenziert ('A' als ergebnis) und der Zeiger wird um 1 erhöht.</p>
<pre><code class="language-cpp">*a++;
</code></pre>
<p>hier wird nun der erhöhte Zeiger dereferenziert ('\0' als ergebnis) und der Zeiger wird um 1 erhöht und zeigt somit auf Speicherbereich der wahrscheinlich nicht mehr uns gehört. Aber solange er nur zeigt ist das OK.</p>
<p>Ein weiteres</p>
<pre><code class="language-cpp">*a++;
</code></pre>
<p>wäre undefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2261698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2261698</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 18 Oct 2012 15:00:09 GMT</pubDate></item></channel></rss>