<?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[Und wieder Pointer-Verwirrung]]></title><description><![CDATA[<p>normalerweise macht man das so:</p>
<pre><code class="language-cpp">int *p, wert = 666;

p = &amp;wert;

cout &lt;&lt; *p &lt;&lt; endl;
</code></pre>
<p>aber wieso geht es auch so:<br />
*p = wert;</p>
<p>dasselbe ergebnis? ist den beides überhaupt zuweisen?</p>
<p>und dennoch:</p>
<p>wenn ich *p++ mache kommt da irgendwelche komische zahlen raus 4198889<br />
und wenn ich *p = wert; mache und dann *p++ dann kommt 0 raus.</p>
<p>was passiert da eigentlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/183818/und-wieder-pointer-verwirrung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 12:37:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/183818.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 09 Jun 2007 00:16:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 00:16:12 GMT]]></title><description><![CDATA[<p>normalerweise macht man das so:</p>
<pre><code class="language-cpp">int *p, wert = 666;

p = &amp;wert;

cout &lt;&lt; *p &lt;&lt; endl;
</code></pre>
<p>aber wieso geht es auch so:<br />
*p = wert;</p>
<p>dasselbe ergebnis? ist den beides überhaupt zuweisen?</p>
<p>und dennoch:</p>
<p>wenn ich *p++ mache kommt da irgendwelche komische zahlen raus 4198889<br />
und wenn ich *p = wert; mache und dann *p++ dann kommt 0 raus.</p>
<p>was passiert da eigentlich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1301744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301744</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Sat, 09 Jun 2007 00:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 00:17:31 GMT]]></title><description><![CDATA[<p>sorry, die komischen unicodes... die erste zeile nochmal</p>
<pre><code class="language-cpp">int *p, wert = 666;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1301745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301745</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Sat, 09 Jun 2007 00:17:31 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 01:32:26 GMT]]></title><description><![CDATA[<p>Ich würde dir dringends empfehlen dich intensiver mit Pointern zu beschäftigen.</p>
<p>Fangen wir mal an:</p>
<pre><code class="language-cpp">int *p, wert =&amp;666;
</code></pre>
<p>Du definierst einen Zeiger namens &quot;p&quot; vom typ int,<br />
und du definierst eine Variable vom typ int namens &quot;wert&quot;, welche du mit 666 initialisierst.</p>
<pre><code class="language-cpp">p = &amp;wert;
</code></pre>
<p>Du weist dem Zeiger p, die Adresse von der Variable &quot;wert&quot; zu.<br />
Ab jetzt &quot;zeigt&quot; p auf die Stelle im Speicher, wo der Inhalt von 'wert' liegt.</p>
<pre><code class="language-cpp">cout &lt;&lt; *p &lt;&lt; endl;
</code></pre>
<p>du dereferenzierst den Zeiger p, und lässt ihn durch cout ausgeben.<br />
Es wird das ausgegeben, was in der Speicherstelle steht, auf die p zeigt (also das, was in &quot;wert&quot; steht).</p>
<p>Nun zu deiner Verwirrung:</p>
<blockquote>
<p>aber wieso geht es auch so:<br />
*p = wert;</p>
</blockquote>
<pre><code class="language-cpp">int *p, wert = 666;

*p = wert; 

cout &lt;&lt; *p &lt;&lt; endl;
</code></pre>
<p>Puuuh... hoffentlich geht das NICHT. Was du machst ist nicht empfehlenswert.<br />
Du benutzt einen nicht initialisierten Zeiger (manche sagen auch wild pointer).<br />
Keiner weiss wirklich auf welche Speicherstelle er zeigt, und wenn du nun in dem Speicher rumschreibst (mit &quot;*p = wert;&quot; zB), weiss keiner was du gerade überschreibst. Im günstigsten Fall stürzt das Programm ab und dein Betriebssystem gibt dir eine schöne Fehlermeldung (Segfault, Ausnahmefehler blabla). Im ungünstigsten Fall löst Du damit den dritten Weltkrieg aus.</p>
<p>Ein gültiges Beispiel damit wäre folgendes:</p>
<pre><code class="language-cpp">int *p, wert = 666;

p = &amp;wert;
*p = wert; 

cout &lt;&lt; *p &lt;&lt; endl;
</code></pre>
<p>Hierbei wird mit &quot;*p = wert;&quot;, der Zeiger p dereferenziert, und an die Speicherstelle auf die er zeigt, den Inhalt aus &quot;wert&quot; geschrieben. Was im Grunde genommen doppelt gemoppelt ist. Er holt sich die 666 von &quot;wert&quot; und legt sie dort ab, wo die 666 schon steht.</p>
<p>Noch mehr Verwirrung:</p>
<blockquote>
<p>wenn ich *p++ mache kommt da irgendwelche komische zahlen raus 4198889</p>
</blockquote>
<p>Willkommen in der wundervollen Welt des Operatorenvorrangs.<br />
Heute kämpfen der Derefenzierungsoperator gegen den Postinkrement.<br />
Let's get ready to rumbleeeeeeeeee.... *langzieh*<br />
Oh, und direkt der Knockout in der ersten Runde!<br />
And the winner is: POSTINKREMENT.</p>
<p>Okay, spass beiseite.<br />
Du musst aufpassen, was wann passiert.<br />
Der Postinkrement wird VOR dem Deref-Operator ausgewertet.<br />
In p steht nun eine Speicheradresse. Diese inkrementierst du (und zwar um die Größe vom Zeigertyp - also in deinem Fall int. - macht locker 2 - 4 bytes). Dann schaust du erst was in dieser Speicherzelle abgelegt ist.<br />
Hat dich natürlich brennend interessiert, was hinter deiner 666 noch so alles steht, nicht wahr? Nicht? Oh, dann habe ich noch was:<br />
Für diesen Fall hat Gott (nagut, vielleicht war es auch Kernighan oder Ritchie) die sogenannten Klammern erfunden. Sind endlos praktisch wenn man zu faul ist Operatorenvorrang zu lernen <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="😃"
    /><br />
Was du gerne machen möchtest ist:</p>
<pre><code class="language-cpp">(*p)++;
</code></pre>
<p>Dann wird aus deiner 666, fluchs eine 667.</p>
<p>Noch Fragen? <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/1301750</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1301750</guid><dc:creator><![CDATA[Ike]]></dc:creator><pubDate>Sat, 09 Jun 2007 01:32:26 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 14:18:17 GMT]]></title><description><![CDATA[<p>ja ok vielen vielen dank für die Mühe! ich hoffe ich verstehe es. ist halt nur merkwürdig wenn ich ++*p mache dann kommt auch 667 raus. Wenn dagegen *p++ dann merkwürdige Zahlen. Jedenfalls experimentiere ich sehr viel, und wenn ich feststelle es geht irgendwie auch so und so und im Buch steht nix dann will man es untersuchen wieso <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/1302012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302012</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Sat, 09 Jun 2007 14:18:17 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 14:33:01 GMT]]></title><description><![CDATA[<p>also kann es sein dass die pointers manchmal gefährlich sind? Also wie eine Schusswaffe? wenn noch andere Programme offen sind und ebenfalls Speicher belegen. Könnte ich mit meinen Programm auf fremde Speicherbereiche zugreifen und verändern. Quasi andere Software zerschiessen? Und manchmal zerstört es nicht, sondern verändere nur die Werte und das fremde Programm verhält sich komisch? Wie radioaktive Strahlen die nicht immer zerstören sondern auch verändern?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302027</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302027</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Sat, 09 Jun 2007 14:33:01 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 15:02:10 GMT]]></title><description><![CDATA[<p>nein, auf andere Prozesse kannst du so nicht zugreifen. du musst wissen, dass auf einem win32-rechner jedes Programm virtuell 4GB ram zugesichert bekommt. Das ist dein speicher, auf dem kannst du schreiben. Du kommst aber mit einem normalen pointer nicht auf den (virtuellen) speicher eines anderen Prozesses.<br />
Unter windows gibt es dazu readprocessmemory und writeprocessmemory</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302043</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302043</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Sat, 09 Jun 2007 15:02:10 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 15:18:10 GMT]]></title><description><![CDATA[<p>hm wundert mich grad, wie hackersoftware und andere cheats andere programme zur laufzeit verändern können - letzte frage noch:</p>
<p>kann man pointers auf normale zahlen zuweisen?</p>
<p>also wenn irgendwo im quellcode eine 4 steht, die ja eigentilch Konstante ist, kann man mit Pointers da drauf zuweisen? Oder geht das nur bei Variablen?</p>
<p>weil ich hab nämlich so gemacht:</p>
<pre><code class="language-cpp">*p = 3;
(*p)++;
</code></pre>
<p>Ein mal ist es abstürzt. dann hab ich andere zeilen die damit nix zu tun haben auskommentiert. dann gehts. In der Ausgabe kommt 4 raus. Sollte eigentlich dasselbe wie bei Werten nicht empfehlenswert sein, nehme ich an.</p>
<p>und hier: so kommt Compilierfehler raus ^^</p>
<pre><code class="language-cpp">p = &amp;3
</code></pre>
<p>so auch nicht:</p>
<pre><code class="language-cpp">p = &amp;(3)
</code></pre>
<p>als konstante Zeiger auch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302050</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302050</guid><dc:creator><![CDATA[x]]></dc:creator><pubDate>Sat, 09 Jun 2007 15:18:10 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sat, 09 Jun 2007 20:36:36 GMT]]></title><description><![CDATA[<p>hmm</p>
<pre><code class="language-cpp">int* pInt = new int;
*pInt = 3;
delete pInt;
</code></pre>
<p><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="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1302224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302224</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Sat, 09 Jun 2007 20:36:36 GMT</pubDate></item><item><title><![CDATA[Reply to Und wieder Pointer-Verwirrung on Sun, 10 Jun 2007 05:42:38 GMT]]></title><description><![CDATA[<p>x:</p>
<p>Die Gefahr von Pointern relativiert sich größtenteils bei Software für Personal Computer. Prinzipiell könntest du einen Pointer auch auf Speicher zeigen lassen, der einem Anderen Prozess oder gar dem Kernel gehört.<br />
Jedoch liegt zwischen deinem Programm und dem Speicher noch dein Betriebssystem, was es höchstwahrscheinlich zu verhindern weiss und dein Programm abstürzen lässt (als mildeste Konsequenz sozusagen <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="😃"
    /> ).<br />
Trotzdem ist es mit Mitteln die dein Betriebssystem liefern (win32-api zB) möglich, den Speicher von fremden Prozessen zu manipulieren (Stichwort Game-Trainer zB).</p>
<p>----</p>
<p>Pointern kannst du _nicht_ die Adresse von Konstanten zuweisen.<br />
Zum einen ist nicht definiert wie der Compiler Konstanten schlussendlich in Maschinencode umsetzt, zum anderen ist nicht ersichtlich ob die Konstante in einem Speichersegment liegt, in dem du überhaupt mit deiner Pointerei arbeiten darfst <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1302292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1302292</guid><dc:creator><![CDATA[Ike]]></dc:creator><pubDate>Sun, 10 Jun 2007 05:42:38 GMT</pubDate></item></channel></rss>