<?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[[Verständnisprobleme] Zeigerarithmetik]]></title><description><![CDATA[<p>Hallo Zusammen</p>
<p>Derzeit bin ich das Buch &quot;C/C++ Das umfassende Lehrbuch&quot; am Lesen.<br />
Jedoch tauch bei mir einige Unklarheiten beim Thema Zeigerarithmetik auf.<br />
Und zwar bei folgendem Codebeispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
	int a;
	int *p = 0;

	cout &lt;&lt; &quot;p + 0 = &quot; &lt;&lt; p + 0 &lt;&lt; endl;
	cout &lt;&lt; &quot;p + 1 = &quot; &lt;&lt; p + 1 &lt;&lt; endl;
	cout &lt;&lt; &quot;p + 2 = &quot; &lt;&lt; p + 2 &lt;&lt; endl;
	cout &lt;&lt; &quot;p + 3 = &quot; &lt;&lt; p + 3 &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>1. Es ist für mich unlogisch wieso die Adresse von p ausgegeben wird ohne Adresseoperator.<br />
2. Wenn ich eine 1 dazu rechne, wieso wird dann der Adressbereich/Wert(?) gleich um 4 Byte erhöht. Mit einem Byte kann man ja 16 verschiedene Werte darstellen.<br />
3. Was genau wird jetzt hier überhaupt hinzuaddiert bzw. da bei ...p + 0... ja kein Derefernzierungsoperator steht, müsste die 0 doch eigentlich zu dem Wert, auf den die Adresse zeigt, hinzuaddiert werden.</p>
<p>Ich hoffe ihr könnt mir da weiterhelfen. Ich bin da gewissermassen etwas verwirrt.</p>
<p>Mit besten Grüssen</p>
<p>Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/247348/verständnisprobleme-zeigerarithmetik</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 13:52:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/247348.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Aug 2009 20:40:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Sun, 09 Aug 2009 20:40:58 GMT]]></title><description><![CDATA[<p>Hallo Zusammen</p>
<p>Derzeit bin ich das Buch &quot;C/C++ Das umfassende Lehrbuch&quot; am Lesen.<br />
Jedoch tauch bei mir einige Unklarheiten beim Thema Zeigerarithmetik auf.<br />
Und zwar bei folgendem Codebeispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
	int a;
	int *p = 0;

	cout &lt;&lt; &quot;p + 0 = &quot; &lt;&lt; p + 0 &lt;&lt; endl;
	cout &lt;&lt; &quot;p + 1 = &quot; &lt;&lt; p + 1 &lt;&lt; endl;
	cout &lt;&lt; &quot;p + 2 = &quot; &lt;&lt; p + 2 &lt;&lt; endl;
	cout &lt;&lt; &quot;p + 3 = &quot; &lt;&lt; p + 3 &lt;&lt; endl;
	return 0;
}
</code></pre>
<p>1. Es ist für mich unlogisch wieso die Adresse von p ausgegeben wird ohne Adresseoperator.<br />
2. Wenn ich eine 1 dazu rechne, wieso wird dann der Adressbereich/Wert(?) gleich um 4 Byte erhöht. Mit einem Byte kann man ja 16 verschiedene Werte darstellen.<br />
3. Was genau wird jetzt hier überhaupt hinzuaddiert bzw. da bei ...p + 0... ja kein Derefernzierungsoperator steht, müsste die 0 doch eigentlich zu dem Wert, auf den die Adresse zeigt, hinzuaddiert werden.</p>
<p>Ich hoffe ihr könnt mir da weiterhelfen. Ich bin da gewissermassen etwas verwirrt.</p>
<p>Mit besten Grüssen</p>
<p>Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758029</guid><dc:creator><![CDATA[Doltsche]]></dc:creator><pubDate>Sun, 09 Aug 2009 20:40:58 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Sun, 09 Aug 2009 20:50:32 GMT]]></title><description><![CDATA[<p>Nein. Da hast du etwas grundlegend falsch an Zeiger verstanden.</p>
<p>Auf den Wert, auf den ein Zeiger zeigt greift man mit einem Dereferenzierungsoperator zu. Sprich mit dem *, oder -&gt;.</p>
<pre><code class="language-cpp">int i = 2;
int* pi = &amp;i;

std::cout &lt;&lt; *pi; // gibt 2 aus
</code></pre>
<p>Und wenn du direkt auf eine Member zugreifen willst, kannst du mit dem <code>-&gt; Operator</code> arbeiten.</p>
<p>Wenn du das allerdings nicht machst, arbeitest du mit der Adresse, die den Wert referenziert.</p>
<pre><code class="language-cpp">std::cout &lt;&lt; pi; // Die Adresse, wo i liegt.
</code></pre>
<p>Und wenn du auf pi 1 hinzuaddierst, inkrementierst du den Zeiger, was in deinem Fall 4 Byte entspricht, also der Grösse des Datentypes, auf den er zeigt.</p>
<p>Du erwartest das hier:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    int a;
    int *p = 0;

    cout &lt;&lt; &quot;*p + 0 = &quot; &lt;&lt; *p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 1 = &quot; &lt;&lt; *p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 2 = &quot; &lt;&lt; *p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 3 = &quot; &lt;&lt; *p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1758034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758034</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 09 Aug 2009 20:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 09:31:40 GMT]]></title><description><![CDATA[<p>Wenn du so auf den Zeiger zugreift:</p>
<pre><code class="language-cpp">p + 1;
</code></pre>
<p>dann erhöhst du das was im Zeiger steht. Hier ist das die Adresse der Variable die der Zeiger speichert. Dann kannst du erstmal nicht mehr auf die Variable zugreifen, da der Zeiger nun eine andere Adresse hast.</p>
<p>Mit der Anweisung:</p>
<pre><code class="language-cpp">*p + 1;
</code></pre>
<p>greifst du auf das zu, was im Zeiger seine Adresse abgelegt hat. Hier ist das eine Variable, die dann um 1 inkrementiert wird.</p>
<p>lg, freakC++</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758149</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758149</guid><dc:creator><![CDATA[freakC++]]></dc:creator><pubDate>Mon, 10 Aug 2009 09:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 10:21:15 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Du erwartest das hier:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    int a;
    int *p = 0;
   
    cout &lt;&lt; &quot;*p + 0 = &quot; &lt;&lt; *p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 1 = &quot; &lt;&lt; *p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 2 = &quot; &lt;&lt; *p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 3 = &quot; &lt;&lt; *p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
</blockquote>
<p>halt ich für unwahrscheinlich, dass er das erwartet - evtl das hier:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    int a;
    int *p = &amp;a;
	*p = 0;

    cout &lt;&lt; &quot;*p + 0 = &quot; &lt;&lt; *p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 1 = &quot; &lt;&lt; *p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 2 = &quot; &lt;&lt; *p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 3 = &quot; &lt;&lt; *p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758175</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758175</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Mon, 10 Aug 2009 10:21:15 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 10:26:30 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>drakon schrieb:</p>
<blockquote>
<p>Du erwartest das hier:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    int a;
    int *p = 0;
   
    cout &lt;&lt; &quot;*p + 0 = &quot; &lt;&lt; *p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 1 = &quot; &lt;&lt; *p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 2 = &quot; &lt;&lt; *p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 3 = &quot; &lt;&lt; *p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
</blockquote>
<p>halt ich für unwahrscheinlich, dass er das erwartet - evtl das hier:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    int a;
    int *p = &amp;a;
	*p = 0;
   
    cout &lt;&lt; &quot;*p + 0 = &quot; &lt;&lt; *p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 1 = &quot; &lt;&lt; *p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 2 = &quot; &lt;&lt; *p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;*p + 3 = &quot; &lt;&lt; *p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
<p>bb</p>
</blockquote>
<p>Ich nehme an er erwartet das</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    char *p = (char*)0;

    cout &lt;&lt; &quot;p + 0 = &quot; &lt;&lt; p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;p + 1 = &quot; &lt;&lt; p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;p + 2 = &quot; &lt;&lt; p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;p + 3 = &quot; &lt;&lt; p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1758178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758178</guid><dc:creator><![CDATA[general bacardi]]></dc:creator><pubDate>Mon, 10 Aug 2009 10:26:30 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 10:39:42 GMT]]></title><description><![CDATA[<blockquote>
<p>halt ich für unwahrscheinlich, dass er das erwartet - evtl das hier:</p>
</blockquote>
<p>Hups. Den oberen Teil habe ich übersehen. So habe ich das gemeint.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758186</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 10 Aug 2009 10:39:42 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 14:43:11 GMT]]></title><description><![CDATA[<p>general bacardi schrieb:</p>
<blockquote>
<p>Ich nehme an er erwartet das</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

using namespace std;

int main()
{
    char *p = (char*)0;
   
    cout &lt;&lt; &quot;p + 0 = &quot; &lt;&lt; p + 0 &lt;&lt; endl;
    cout &lt;&lt; &quot;p + 1 = &quot; &lt;&lt; p + 1 &lt;&lt; endl;
    cout &lt;&lt; &quot;p + 2 = &quot; &lt;&lt; p + 2 &lt;&lt; endl;
    cout &lt;&lt; &quot;p + 3 = &quot; &lt;&lt; p + 3 &lt;&lt; endl;
    return 0;
}
</code></pre>
</blockquote>
<p>Das ist streng genommen auch &quot;UB&quot; (ruft undefiniertes Verhalten hervor). Der Standard definiert das so (sinngemäß):</p>
<blockquote>
<p>Ein einzelnes Objekt, welches nicht Teil eines Arrays ist, wird bzgl Pointer-Arithmetik wie ein 1-elementiges Array behandelt.</p>
<p>Zeigt der Zeiger <code>p</code> auf das i-te Element eines n-elementigen Arrays (oder auf das imaginäre Element hinter dem letzten, also 0&lt;=i&lt;=n) dann ist <code>p+k</code> vom gleichen Zeigertyp wie p und zeigt auf das (i+k)-te Element des Arrays, <em><strong>FALLS 0 &lt;= i+k &lt;= n gilt</strong></em>. Sonst ist das Verhalten undefiniert.</p>
<p>Zeigen zwei Zeiger p1 und p2 auf das i-te bzw j-te Element des selben n-elementigen Arrays (oder auf das Element hinter dem letzten, also 0 &lt;= i,j &lt;=n) dann ist <code>p1-p2</code> vom Typ std::ptrdiff_t und hat den Wert i-j. Sonst ist das Verhalten undefiniert.</p>
</blockquote>
<p>Das kann man im Kapitel 5 (&quot;Expressions&quot;) nachlesen. Am Beispiel:</p>
<pre><code class="language-cpp">int foo() {
  int z = 0;
  int* p = &amp;z; // p zeigt auf z
  p+0; // OK
  p+1; // OK, darf man nur nicht dereferenzieren
  p+2; // Nicht OK (UB)
  p-1; // Nicht OK (UB)

  int array[5];
  p = array; // p zeigt auf array[0]
  p+0; // OK
  p+5; // OK, darf man nur nicht dereferenzieren
  p+6; // Nicht OK (UB)
  p-1; // Nicht OK (UB)
}
</code></pre>
<p>Man darf also nicht einfach irgendeinen Wert zu einem Zeiger addieren oder irgendwelche zwei Zeiger vom gleichen Typ voneinander subtrahieren.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758356</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 10 Aug 2009 14:43:11 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 14:55:00 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Das kann man im Kapitel 5 (&quot;Expressions&quot;) nachlesen. Am Beispiel:</p>
<pre><code class="language-cpp">int z = 0;
  int* p = &amp;z; // p zeigt auf z
  p+0; // OK
  p+1; // OK, darf man nur nicht dereferenzieren
  p+2; // Nicht OK (UB)
  p-1; // Nicht OK (UB)
</code></pre>
</blockquote>
<p>Laut standard ja, aber in Wirklichkeit passiert bei p+1 bis p+x oder p-x nichts schlimmes, man darf nur nicht dereferenzieren.<br />
Ich nehme an, dass Folgendes</p>
<pre><code class="language-cpp">p = (p+5)-5;
*p = ...;   // Dereferenzieren!
</code></pre>
<p>auch nicht zulässig ist, obwohl p wieder seine ehemaligen Wert hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758364</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758364</guid><dc:creator><![CDATA[general bacardi]]></dc:creator><pubDate>Mon, 10 Aug 2009 14:55:00 GMT</pubDate></item><item><title><![CDATA[Reply to [Verständnisprobleme] Zeigerarithmetik on Mon, 10 Aug 2009 20:45:11 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Vielen vielen Dank für Eure Antworten.<br />
Hat mich sehr gefreut ;).<br />
Da ich derzeit etwas etwas Wenig habe werde ich die Beiträge bei der nächsten Gelegenheit genau durchlesen.<br />
Vielen Dank nochmals.</p>
<p>MfG Samuel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1758524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1758524</guid><dc:creator><![CDATA[Doltsche]]></dc:creator><pubDate>Mon, 10 Aug 2009 20:45:11 GMT</pubDate></item></channel></rss>