<?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[Zeigerarithmetik]]></title><description><![CDATA[<p>Moin, ich hätte da mal eine kurze Frage, wenn jemand kurz Zeit hat wäre es freundlich sich mal eben dieses Beispiel anzuschauen :</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

int main (int argc, char** argv) 
{
	const int N = 4;				// Letztes Element, da Zählung bei 0 beginnt
	int a [N+1] = { 2,6,32,3, 1 };	// 0-4 (5 Elemente), ohne '+1' =&gt; 0-3 (4 Elemente)
	int key = 3;					// Gesuchtes Element
	int i = {0};					// Laufvariable

	a[N] = key;						// Senitel
	int *p = a;						// Zeiger auf Adresse des ersten Elements

	while (*p++ != key);
	i = p-a-1;

	std::cout &lt;&lt; &quot;Gesuchtes Element ist an der Stelle &quot;
		&lt;&lt; i &lt;&lt; std::endl;

	std::system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
<p>Funktioniert auch alles soweit und ich verstehe den Großteil (hoffe ich zumindest). Jetzt gibt es aber diese Stelle hier, an der Schlussendlich das Ergebnis (die Position des gesuchten Elements) in i eingespeichert wird :</p>
<pre><code>i = p-a-1;
</code></pre>
<p>Soweit so gut, meines Wissens nach zeigt der Bezeichner des Arrays aber immer auf den Beginn des Feldes. Wieso kann ich also nicht hingehen und einfach</p>
<pre><code>p-1
</code></pre>
<p>sagen? Versuche ich das allerdings bekomme ich eine Fehlermeldung vom Compiler:</p>
<blockquote>
<p>Fehler 1 error C2440: 'Initialisierung': 'int *' kann nicht in 'int' konvertiert werden</p>
</blockquote>
<p>Letztlich funktioniert p-a-1 und p-a doch auch und der Ausdruck dessen ist ebenfalls ein integer.</p>
<p>An dieser Stelle schon mal ein Dankeschön an alle, die sich die Zeit genommen haben!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326424/zeigerarithmetik</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 03:05:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326424.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jun 2014 14:12:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 14:12:45 GMT]]></title><description><![CDATA[<p>Moin, ich hätte da mal eine kurze Frage, wenn jemand kurz Zeit hat wäre es freundlich sich mal eben dieses Beispiel anzuschauen :</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;cstdlib&gt;

int main (int argc, char** argv) 
{
	const int N = 4;				// Letztes Element, da Zählung bei 0 beginnt
	int a [N+1] = { 2,6,32,3, 1 };	// 0-4 (5 Elemente), ohne '+1' =&gt; 0-3 (4 Elemente)
	int key = 3;					// Gesuchtes Element
	int i = {0};					// Laufvariable

	a[N] = key;						// Senitel
	int *p = a;						// Zeiger auf Adresse des ersten Elements

	while (*p++ != key);
	i = p-a-1;

	std::cout &lt;&lt; &quot;Gesuchtes Element ist an der Stelle &quot;
		&lt;&lt; i &lt;&lt; std::endl;

	std::system(&quot;PAUSE&quot;);
	return 0;
}
</code></pre>
<p>Funktioniert auch alles soweit und ich verstehe den Großteil (hoffe ich zumindest). Jetzt gibt es aber diese Stelle hier, an der Schlussendlich das Ergebnis (die Position des gesuchten Elements) in i eingespeichert wird :</p>
<pre><code>i = p-a-1;
</code></pre>
<p>Soweit so gut, meines Wissens nach zeigt der Bezeichner des Arrays aber immer auf den Beginn des Feldes. Wieso kann ich also nicht hingehen und einfach</p>
<pre><code>p-1
</code></pre>
<p>sagen? Versuche ich das allerdings bekomme ich eine Fehlermeldung vom Compiler:</p>
<blockquote>
<p>Fehler 1 error C2440: 'Initialisierung': 'int *' kann nicht in 'int' konvertiert werden</p>
</blockquote>
<p>Letztlich funktioniert p-a-1 und p-a doch auch und der Ausdruck dessen ist ebenfalls ein integer.</p>
<p>An dieser Stelle schon mal ein Dankeschön an alle, die sich die Zeit genommen haben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404279</guid><dc:creator><![CDATA[PointerManX]]></dc:creator><pubDate>Tue, 17 Jun 2014 14:12:45 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 14:33:01 GMT]]></title><description><![CDATA[<p><code>p</code> und <code>a</code> sind Zeiger und damit nur Adressen. Mit <code>p - a</code> berechnest du allerdings die Anzahl (keine Adresse mehr!) der Integer, um die <code>p</code> verschoben ist.</p>
<p>Woher das <code>- 1</code> ist aber klar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404282</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Tue, 17 Jun 2014 14:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 14:52:09 GMT]]></title><description><![CDATA[<p>Erst mal danke für die Antwort,<br />
Die -1 dient dazu, das Ergebnis an die interne Zählung ab 0 anzupassen, oder?<br />
Also ich denke, dass ist etwa verstanden habe, was du meinst. Sollte ich den Ausdruck besser so lesen : (p-a) -1 ?<br />
Um es mal in Worte zu fassen: Rechenoperationen mit Adressen funktionieren nur, wenn man auch eine andere Adresse als zweiten Operand hat. Das Ergebnis dieser Rechenoperation ist ein Integer und deshalb kann ich -1 abziehen, oder wie sollte ich das verstehen?</p>
<p>~ Sorry ich stell mich allgemein was Pointer angeht ziemlich dämlich an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404286</guid><dc:creator><![CDATA[PointerManX]]></dc:creator><pubDate>Tue, 17 Jun 2014 14:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 15:20:09 GMT]]></title><description><![CDATA[<p>PointerManX schrieb:</p>
<blockquote>
<p>Die -1 dient dazu, das Ergebnis an die interne Zählung ab 0 anzupassen, oder?</p>
</blockquote>
<p>Nicht so ganz. Die while-Schleife ist so gestaltet, dass das aktuelle <code>p</code> mit dem <code>key</code> verglichen und dann um eins hochgezählt wird. Erst danach wird die Schleifenbedingung geprüft. (Nach der Schleife zeigt <code>p</code> also auf das Element hinter dem eigentlichen Fund. In diesem Fall allerdings dein Sentinel.)</p>
<p>PointerManX schrieb:</p>
<blockquote>
<p>Also ich denke, dass ist etwa verstanden habe, was du meinst. Sollte ich den Ausdruck besser so lesen : (p-a) -1 ?<br />
Um es mal in Worte zu fassen: Rechenoperationen mit Adressen funktionieren nur, wenn man auch eine andere Adresse als zweiten Operand hat. Das Ergebnis dieser Rechenoperation ist ein Integer und deshalb kann ich -1 abziehen, oder wie sollte ich das verstehen?</p>
</blockquote>
<p>Ja, so wird er auch ausgewertet.<br />
Mit den Zeigern kann man nicht beliebig rechnen. Die Differenz ist aber definiert. (Man kann die Zeiger aber in normale Zahlen umwandeln, dann kann man damit ganz normal rechnen. Sollte aber normalerweise nicht gemacht werden.)</p>
<p>Dazu musst du noch wissen, dass die Zeiger einen Typ haben, darüber wissen sie, dass bei einem 32-bit Integer bei einem Inkrement die Adresse um 4 (Byte) erhöht werden muss. (zB bei deinem <code>p++</code> ) Oder auch, dass die Differenz der Adressen durch vier geteilt werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404289</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Tue, 17 Jun 2014 15:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 15:40:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Die while-Schleife ist so gestaltet, dass das aktuelle p mit dem key verglichen und dann um eins hochgezählt wird. Erst danach wird die Schleifenbedingung geprüft.</p>
</blockquote>
<p>Die Schleifenbedingung ist doch, dass p mit key verglichen wird, oder was genau meinst du? Bezüglich dessen ist mir allerdings auch noch etwas unklar, vielleicht hast du ja eine Antwort :<br />
Bei mir im Buch steht es wird bei &quot;*p++&quot; eben erst der Wert an der Stelle p genommen und dann um eins inkrementiert. Was wäre aber wenn ich einen Schleifenkörper mit Code hätte (speziell der 1. Durchlauf ist gemeint).</p>
<p>Sagen wir mal *(p+0) = 10, *(p+1) = 20.<br />
Würde p im ersten Durchlauf auf den Wert 10 oder 20 Zeigen?</p>
<p>Ums mal generell zu fassen : Wird direkt nachdem die Bedingung geprüft wurde p erhöht, oder wird die Schleife dann erst ein mal durchlaufen?</p>
<p>Den Rest hab ich soweit verstanden, viele Dank schon mal dafür !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404292</guid><dc:creator><![CDATA[PointerManX]]></dc:creator><pubDate>Tue, 17 Jun 2014 15:40:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 16:17:38 GMT]]></title><description><![CDATA[<p>Es wird der Wert in <code>*p</code> genommen und zwischengespeichert, dann wird <code>p</code> inkrementiert. ( <code>*p++</code> )<br />
Danach wird geschaut ob der Wert von vorher nicht mit dem <code>key</code> übereinstimmt.</p>
<p>Wenn das der Fall ist, wird die Schleife abgearbeitet (in diesem Fall ist sie leer) und das Spiel beginnt von vorne. Ansonsten wird die Schleife abgebrochen.</p>
<p>Im ersten Durchlauf des Schleifenkörpers wäre das <code>p</code> bereits einmal inkrementiert.</p>
<p>Mit einer for-Schleife oder einer Modifikation an der while-Schleife kann man das Verhalten natürlich ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2404296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404296</guid><dc:creator><![CDATA[lagalopex]]></dc:creator><pubDate>Tue, 17 Jun 2014 16:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigerarithmetik on Tue, 17 Jun 2014 16:42:00 GMT]]></title><description><![CDATA[<p>Ich wollte das mal an einem Beispiel ausprobieren aber irgendwie ist mir nie was passendes eingefallen.<br />
Vielen vielen Dank für die Unterstützung, das hat mich wirklich ein ganzes Stück weiter gebracht ! <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/2404298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2404298</guid><dc:creator><![CDATA[PoinerManX]]></dc:creator><pubDate>Tue, 17 Jun 2014 16:42:00 GMT</pubDate></item></channel></rss>