<?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[data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot;]]></title><description><![CDATA[<p>Liebe C++ Community,</p>
<p>Ich bin immer interessiert daran, was &quot;wirklich&quot; hinter den Dingen steht und im Fall von Pointern interessiert mich, was der Compiler schlussendlich wirklich mit dem Code macht.</p>
<p>Es geht um das Dereferenzieren von Pointer</p>
<p>Man deklariert einen Pointer ja in der Weise:<br />
int a;<br />
int* ptr = &amp;a</p>
<p>Wenn der Compiler auf den Ausdruck &quot;int*&quot; stoesst, interpretiert er ihn als:</p>
<p>Compiler schrieb:</p>
<blockquote>
<p>Ok, das ist eine Variable ptr, vom type &quot;int*&quot;. D.h. der Wert(der binaere Code) der unter der Adresse ptr (also &amp;ptr) gespeichert ist, repraesentiert eine &quot;Adresse im Arbeitsspeicher&quot;.</p>
</blockquote>
<p>(So wie er bei int a, sieht, dass unter der Adresse, die a repraesentiert (also &amp;a) ein binaerer Code liegt, der eine Integer Zahl repraesentiert.)<br />
Und das &quot;int&quot; im &quot;int*&quot; heisst, dass die Adresse, welche in ptr gespeichert ist, eine Variable enthaelt, die als int zu interpretieren ist.</p>
<p>Und so kann ich natuerlich auch einer Variablen ptr2 von typ int* einen Wert, der eine Adresse repraesentieren _kann_, direkt zuweisen:</p>
<p>int* ptr = 0x7fff765144e8;</p>
<p>Was nichts anderes sagt, als dass das eine Adresse ist und diese Adresse auf einen int zeigt.</p>
<p>Und wenn ich jetzt schreibe:</p>
<p>int** ptr3 = &amp;ptr;<br />
dann sagt dass dem compiler:</p>
<p>Compiler schrieb:</p>
<blockquote>
<p>Ok, der Wert, der unter der adresse ptr3 (also &amp;ptr) finde ich eine Adresse.<br />
Und unter dieser Adresse ist eine Pointer gespeichert. (also *ptr3 = ptr)<br />
Und wenn ich mit dann den Wert dieses Pointers angucke,dann ist dort eine Adresse gespeichert, unter welcher ein int zu finden ist (also *ptr = ptr = &amp;a)</p>
</blockquote>
<p>Hier kurz ein Code dazu:</p>
<pre><code>#include &lt;iostream&gt;

int main() {

int a = 5;

int* ptr = &amp;a;

int* ptr2 = (int*) 0x7fff765144e8;

std::cout &lt;&lt; &quot;&amp;a : &quot; &lt;&lt; &amp;a &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;ptr : &quot; &lt;&lt; ptr &lt;&lt; std::endl; 
std::cout &lt;&lt; &quot;ptr2 : &quot; &lt;&lt; ptr2 &lt;&lt; std::endl;

int** ptr3 = &amp;ptr;
std::cout &lt;&lt; &quot;ptr3 : &quot; &lt;&lt; ptr3 &lt;&lt; std::endl; 

std::cout &lt;&lt; &quot;&amp;ptr : &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;*ptr3 : &quot; &lt;&lt; *ptr3 &lt;&lt; std::endl;

return 0;
}
</code></pre>
<p>und die Ausgabe:</p>
<pre><code>&amp;a : 0x7fff0c2e17fc
ptr : 0x7fff0c2e17fc
ptr2 : 0x7fff765144e8
ptr3 : 0x7fff0c2e17f0
&amp;ptr : 0x7fff0c2e17f0
*ptr3 : 0x7fff0c2e17fc
</code></pre>
<p>Soweit so gut.<br />
Nur bin ich mir nicht ganz sicher, ob diese Erklaerung stimmt, die ich mir zusammengereimt habe.</p>
<p>Weil, dieser Code:</p>
<pre><code>#include &lt;iostream&gt;

int main(){

char x = 'a';

char* ptrx = &amp;x;

std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x &lt;&lt; &quot; at &quot; &lt;&lt; (char*) ptrx &lt;&lt; std::endl;

return 0;
}
</code></pre>
<p>sollte nach meiner Erklaerung fur den Compiler bedeuten:</p>
<pre><code>Ok, &quot;char* ptrx = &amp;x&quot; bedeutet dass unter der Adresse von ptrx (also &amp;ptrx) eine Adresse gespeicher ist. Und unter dieser Adresse liegt ein Char&quot;
</code></pre>
<p>Aber die Ausgabe sieht so aus</p>
<pre><code>x: a at a���o�
</code></pre>
<p>(in wirklichkeit besteht die Darstellung nicht von (char*) ptrx nicht aus diesen Zeichen, sondern aus ein paar exotischen Sonderzeichen.</p>
<p>Wenn ich jetzt aber schreibe (int*) ptrx<br />
dann kommt das raus:</p>
<p>(int*) ptrx : 0x7fffff2dab37</p>
<p>Und jetzt sozusagen die harte Pruefung:</p>
<pre><code>#include &lt;iostream&gt;

int main(){

char x = 'a';

char* ptrx = &amp;x;

std::cout &lt;&lt; &quot;&amp;x : &quot; &lt;&lt; &amp;x &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x &lt;&lt; &quot; at &quot; &lt;&lt; (char*) ptrx &lt;&lt; std::endl;

std::cout &lt;&lt; &quot;(int*) ptrx : &quot; &lt;&lt; (int*) ptrx &lt;&lt; std::endl;
return 0;

}
</code></pre>
<p>Und das ergibt:</p>
<pre><code>&amp;x : a7�-��
x: a at a7�-��
(int*) ptrx : 0x7fffff2dab37
</code></pre>
<p>(Hier besteht die (char*) Darstellung wieder eigentlich aus exotischen Sonderzeiche, aber sie sind ebenfalls ident (wie hier auch die konvertierte Variante)</p>
<p>Um jetzt also zu meiner eigentlichen Frage zu kommen.</p>
<p>Bei den Datenypen &quot;int*&quot;, &quot;char*&quot;, &quot;int**&quot;, etc.<br />
sagt der der &quot;<em>&quot; (asterix) dem Compiler wohl, dass es sich um eine Adresse handelt. Aber was sagt der &quot;int&quot;, &quot;char&quot; etc Teil (von &quot;int</em>&quot;, &quot;char*&quot;,...) dem Compiler ?</p>
<p>Tut mir leid, falls ich das etwas sehr ausfuehrlich dargestellt habe. Aber ich denke ich wuerde sonst leicht missverstanden werden. <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/topic/316267/data-type-quot-int-quot-vs-quot-char-quot</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 06:12:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316267.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 27 Apr 2013 12:13:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 12:15:08 GMT]]></title><description><![CDATA[<p>Liebe C++ Community,</p>
<p>Ich bin immer interessiert daran, was &quot;wirklich&quot; hinter den Dingen steht und im Fall von Pointern interessiert mich, was der Compiler schlussendlich wirklich mit dem Code macht.</p>
<p>Es geht um das Dereferenzieren von Pointer</p>
<p>Man deklariert einen Pointer ja in der Weise:<br />
int a;<br />
int* ptr = &amp;a</p>
<p>Wenn der Compiler auf den Ausdruck &quot;int*&quot; stoesst, interpretiert er ihn als:</p>
<p>Compiler schrieb:</p>
<blockquote>
<p>Ok, das ist eine Variable ptr, vom type &quot;int*&quot;. D.h. der Wert(der binaere Code) der unter der Adresse ptr (also &amp;ptr) gespeichert ist, repraesentiert eine &quot;Adresse im Arbeitsspeicher&quot;.</p>
</blockquote>
<p>(So wie er bei int a, sieht, dass unter der Adresse, die a repraesentiert (also &amp;a) ein binaerer Code liegt, der eine Integer Zahl repraesentiert.)<br />
Und das &quot;int&quot; im &quot;int*&quot; heisst, dass die Adresse, welche in ptr gespeichert ist, eine Variable enthaelt, die als int zu interpretieren ist.</p>
<p>Und so kann ich natuerlich auch einer Variablen ptr2 von typ int* einen Wert, der eine Adresse repraesentieren _kann_, direkt zuweisen:</p>
<p>int* ptr = 0x7fff765144e8;</p>
<p>Was nichts anderes sagt, als dass das eine Adresse ist und diese Adresse auf einen int zeigt.</p>
<p>Und wenn ich jetzt schreibe:</p>
<p>int** ptr3 = &amp;ptr;<br />
dann sagt dass dem compiler:</p>
<p>Compiler schrieb:</p>
<blockquote>
<p>Ok, der Wert, der unter der adresse ptr3 (also &amp;ptr) finde ich eine Adresse.<br />
Und unter dieser Adresse ist eine Pointer gespeichert. (also *ptr3 = ptr)<br />
Und wenn ich mit dann den Wert dieses Pointers angucke,dann ist dort eine Adresse gespeichert, unter welcher ein int zu finden ist (also *ptr = ptr = &amp;a)</p>
</blockquote>
<p>Hier kurz ein Code dazu:</p>
<pre><code>#include &lt;iostream&gt;

int main() {

int a = 5;

int* ptr = &amp;a;

int* ptr2 = (int*) 0x7fff765144e8;

std::cout &lt;&lt; &quot;&amp;a : &quot; &lt;&lt; &amp;a &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;ptr : &quot; &lt;&lt; ptr &lt;&lt; std::endl; 
std::cout &lt;&lt; &quot;ptr2 : &quot; &lt;&lt; ptr2 &lt;&lt; std::endl;

int** ptr3 = &amp;ptr;
std::cout &lt;&lt; &quot;ptr3 : &quot; &lt;&lt; ptr3 &lt;&lt; std::endl; 

std::cout &lt;&lt; &quot;&amp;ptr : &quot; &lt;&lt; &amp;ptr &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;*ptr3 : &quot; &lt;&lt; *ptr3 &lt;&lt; std::endl;

return 0;
}
</code></pre>
<p>und die Ausgabe:</p>
<pre><code>&amp;a : 0x7fff0c2e17fc
ptr : 0x7fff0c2e17fc
ptr2 : 0x7fff765144e8
ptr3 : 0x7fff0c2e17f0
&amp;ptr : 0x7fff0c2e17f0
*ptr3 : 0x7fff0c2e17fc
</code></pre>
<p>Soweit so gut.<br />
Nur bin ich mir nicht ganz sicher, ob diese Erklaerung stimmt, die ich mir zusammengereimt habe.</p>
<p>Weil, dieser Code:</p>
<pre><code>#include &lt;iostream&gt;

int main(){

char x = 'a';

char* ptrx = &amp;x;

std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x &lt;&lt; &quot; at &quot; &lt;&lt; (char*) ptrx &lt;&lt; std::endl;

return 0;
}
</code></pre>
<p>sollte nach meiner Erklaerung fur den Compiler bedeuten:</p>
<pre><code>Ok, &quot;char* ptrx = &amp;x&quot; bedeutet dass unter der Adresse von ptrx (also &amp;ptrx) eine Adresse gespeicher ist. Und unter dieser Adresse liegt ein Char&quot;
</code></pre>
<p>Aber die Ausgabe sieht so aus</p>
<pre><code>x: a at a���o�
</code></pre>
<p>(in wirklichkeit besteht die Darstellung nicht von (char*) ptrx nicht aus diesen Zeichen, sondern aus ein paar exotischen Sonderzeichen.</p>
<p>Wenn ich jetzt aber schreibe (int*) ptrx<br />
dann kommt das raus:</p>
<p>(int*) ptrx : 0x7fffff2dab37</p>
<p>Und jetzt sozusagen die harte Pruefung:</p>
<pre><code>#include &lt;iostream&gt;

int main(){

char x = 'a';

char* ptrx = &amp;x;

std::cout &lt;&lt; &quot;&amp;x : &quot; &lt;&lt; &amp;x &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x &lt;&lt; &quot; at &quot; &lt;&lt; (char*) ptrx &lt;&lt; std::endl;

std::cout &lt;&lt; &quot;(int*) ptrx : &quot; &lt;&lt; (int*) ptrx &lt;&lt; std::endl;
return 0;

}
</code></pre>
<p>Und das ergibt:</p>
<pre><code>&amp;x : a7�-��
x: a at a7�-��
(int*) ptrx : 0x7fffff2dab37
</code></pre>
<p>(Hier besteht die (char*) Darstellung wieder eigentlich aus exotischen Sonderzeiche, aber sie sind ebenfalls ident (wie hier auch die konvertierte Variante)</p>
<p>Um jetzt also zu meiner eigentlichen Frage zu kommen.</p>
<p>Bei den Datenypen &quot;int*&quot;, &quot;char*&quot;, &quot;int**&quot;, etc.<br />
sagt der der &quot;<em>&quot; (asterix) dem Compiler wohl, dass es sich um eine Adresse handelt. Aber was sagt der &quot;int&quot;, &quot;char&quot; etc Teil (von &quot;int</em>&quot;, &quot;char*&quot;,...) dem Compiler ?</p>
<p>Tut mir leid, falls ich das etwas sehr ausfuehrlich dargestellt habe. Aber ich denke ich wuerde sonst leicht missverstanden werden. <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/2318985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318985</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 12:15:08 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 12:21:38 GMT]]></title><description><![CDATA[<p>Der int, char Teil sagt nur, welcher Datentyp an dieser Adresse gespeichert ist.<br />
Das Problem bei der Ausgabe liegt lediglich daran, dass char* automatisch als Zeichenkette interpretiert wird. Die geht bis zum Zeichen '\0'. Wenn du das ausgibst, gibt der alle char's aus, die hinter der Startadresse im Speicher stehen, bis er ein '\0' findet. Deshalb der Zeichenmüll.<br />
Wenn du die Adresse haben willst, musst du nach void* casten, dann kommt die richtige Ausgabe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318988</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 27 Apr 2013 12:21:38 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 12:33:28 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Der int, char Teil sagt nur, welcher Datentyp an dieser Adresse gespeichert ist.<br />
Das Problem bei der Ausgabe liegt lediglich daran, dass char* automatisch als Zeichenkette interpretiert wird. Die geht bis zum Zeichen '\0'. Wenn du das ausgibst, gibt der alle char's aus, die hinter der Startadresse im Speicher stehen, bis er ein '\0' findet. Deshalb der Zeichenmüll.<br />
Wenn du die Adresse haben willst, musst du nach void* casten, dann kommt die richtige Ausgabe.</p>
</blockquote>
<p>Aha ! Also &quot;(char*) ptrx&quot; bedeutet: Gehe and die Adresse ptrx und interpretiere den dort gespeicherten Wert als char.</p>
<p>Ok. Aber warum gibt er bei (int*) die Adresse dann in Hexadezimal aus, und nicht in Dezimal - wie es std::cout ja auch bei allen anderen int tut ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318991</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 12:33:28 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 12:37:34 GMT]]></title><description><![CDATA[<p>Ich habe einen void* cast hinzugefuegt und die Ausgabe ist die gleiche wie mit int* cast</p>
<pre><code>#include &lt;iostream&gt;

int main(){

char x = 'a';

char* ptrx = &amp;x;

std::cout &lt;&lt; &quot;&amp;x : &quot; &lt;&lt; &amp;x &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;x: &quot; &lt;&lt; x &lt;&lt; &quot; at &quot; &lt;&lt; (char*) ptrx &lt;&lt; std::endl;

std::cout &lt;&lt; &quot;(int*) ptrx : &quot; &lt;&lt; (int*) ptrx &lt;&lt; std::endl;
std::cout &lt;&lt; &quot;(void*) ptrx: &quot; &lt;&lt; (void*) ptrx &lt;&lt; std::endl;
return 0;

}
</code></pre>
<p>Ausgabe:</p>
<pre><code>&amp;x : a�!�v�
x: a at a�!�v�
(int*) ptrx : 0x7fff76a221f7
(void*) ptrx: 0x7fff76a221f7
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2318994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318994</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 12:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 12:43:04 GMT]]></title><description><![CDATA[<p>Du musst auch die anderen Adressen casten, also auch die mit &amp;, damit du die richtige Adresse hast.<br />
Ja, int* geht auch.<br />
Das hexadezimale liegt an einer Einstellung der Streams, denn ein int* ist kein int, weswegen da andere (Ausgabe-)regeln gelten.<br />
Der char* Cast bei ptrx ist übrigens überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2318999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2318999</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 27 Apr 2013 12:43:04 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Thu, 12 Jun 2014 02:21:55 GMT]]></title><description><![CDATA[<p>...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319002</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Thu, 12 Jun 2014 02:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 12:47:04 GMT]]></title><description><![CDATA[<p>Ja, ich hatte das noch im Kopf, weil der mir this-Zeiger nicht ausgeben wollte und ich die nach void* gecastet habe. Da dachte ich, dass das mit jedem Pointertyp so sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319004</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 27 Apr 2013 12:47:04 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 13:20:17 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Du musst auch die anderen Adressen casten, also auch die mit &amp;, damit du die richtige Adresse hast.</p>
</blockquote>
<p>Schon klar.<br />
Ich wollte nur zeigen, dass (void*) und (int*) das gleiche anzeigt.</p>
<p>Nathan schrieb:</p>
<blockquote>
<p>Ja, int* geht auch.<br />
Das hexadezimale liegt an einer Einstellung der Streams, denn ein int* ist kein int, weswegen da andere (Ausgabe-)regeln gelten.</p>
</blockquote>
<p>Swordfish schrieb:</p>
<blockquote>
<p>idrake schrieb:</p>
<blockquote>
<p>Aber warum gibt er bei (int*) die Adresse dann in Hexadezimal aus, und nicht in Dezimal - wie es std::cout ja auch bei allen anderen int tut ?</p>
</blockquote>
<p>Die Adresse eines <code>int</code> s ist ein anderer Typ als ein <code>int</code> . <code>cout</code> gibt jeden Pointertyp hexadezimal aus.</p>
</blockquote>
<p>Natuerlich, dass ein int und int* zwei verschiedene Datentypen sind ist mir sonnenklar <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>
<p>Mir geht es jetzt darum, was der Compiler tut.</p>
<p>Also:</p>
<p>Wenn der Compiler bei &quot;(char*) ptrx&quot; alles an dieser Adresse (ptrx) als char behandelt, warum behandelt er dann nicht bei &quot;(int*) ptrx&quot; alles an dieser adresse als int ?</p>
<p>Siehe:</p>
<p>idrake schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Der int, char Teil sagt nur, welcher Datentyp an dieser Adresse gespeichert ist.<br />
Das Problem bei der Ausgabe liegt lediglich daran, dass char* automatisch als Zeichenkette interpretiert wird. Die geht bis zum Zeichen '\0'. Wenn du das ausgibst, gibt der alle char's aus, die hinter der Startadresse im Speicher stehen, bis er ein '\0' findet. Deshalb der Zeichenmüll.<br />
Wenn du die Adresse haben willst, musst du nach void* casten, dann kommt die richtige Ausgabe.</p>
</blockquote>
<p>Aha ! Also &quot;(char*) ptrx&quot; bedeutet: Gehe and die Adresse ptrx und interpretiere den dort gespeicherten Wert als char.</p>
<p>Ok. Aber warum gibt er bei (int*) die Adresse dann in Hexadezimal aus, und nicht in Dezimal - wie es std::cout ja auch bei allen anderen int tut ?</p>
</blockquote>
<p>Edit:</p>
<p>Um es anders zu formulieren:</p>
<p>Wenn es stimmt, dass bei<br />
(char*) ptrx<br />
der Compiler zur Adresse ptrx geht und alles dort als char behandelt,</p>
<p>dann muss analog, der Compiler bei<br />
(int*) ptrx<br />
zur Adresse ptrx gehen und dort alles als int behandeln.</p>
<p>Aber das ist offensichtlich nicht so, weil cout es als hexadezimal und nicht als dezimal wie alle anderen int ausgiebt.</p>
<p>Folgich stimmt entweder die Praemisse nicht, oder es handelt sich um eine Ausnahme.<br />
Was ist der Fall ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319012</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 13:20:17 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 13:26:55 GMT]]></title><description><![CDATA[<p>idrake schrieb:</p>
<blockquote>
<p>Wenn der Compiler bei &quot;(char*) ptrx&quot; alles an dieser Adresse (ptrx) als char behandelt, warum behandelt er dann nicht bei &quot;(int*) ptrx&quot; alles an dieser adresse als int ?</p>
</blockquote>
<p>Er tut es.<br />
Für den Compiler sind die nachfolgenden sizeof(char) Bytes an Adresse ptrx Bestandteile eines chars. Wenn man auf den Wert zugrefit werden die sizeof(char) * CHAR_BIT Bits als char interpretiert.<br />
Das Gleiche gilt für int. Die nachfolgenden sizeof(int) * CHAR_BIT Bits werden als int interpretiert.<br />
Der Stream (in deinem Fall cout) sieht jedoch, dass er einen int* ausgeben soll.<br />
(Achtung Metaphern, nicht instant-flamen, bitt ;))<br />
Der Stream schaut nach, wie er einen int* ausgeben soll. Der hat gespeichert: gebe einen int* als hexadezimale Zahl aus, die die Adresse angibt.<br />
Bei char* schaut der ebenfalls nach und sieht: Ein char* ist eine Zeichenkette. Sie geht von der Startadresse bis zu '\0'. Interpretiere den Speicherbereich von char* bis zur ersten '\0' als char und gebe alles aus.<br />
Aber für den Compiler werden beide gleich behandelt.</p>
<p>Edit:<br />
Hättest du die Streams geschrieben, hättest du sagen können:<br />
Wenn du einen int* siehst, gebe den Wert aus, auf den int* zeigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319015</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 27 Apr 2013 13:26:55 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 13:47:16 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>idrake schrieb:</p>
<blockquote>
<p>Wenn der Compiler bei &quot;(char*) ptrx&quot; alles an dieser Adresse (ptrx) als char behandelt, warum behandelt er dann nicht bei &quot;(int*) ptrx&quot; alles an dieser adresse als int ?</p>
</blockquote>
<p>Er tut es.<br />
Für den Compiler sind die nachfolgenden sizeof(char) Bytes an Adresse ptrx Bestandteile eines chars. Wenn man auf den Wert zugrefit werden die sizeof(char) * CHAR_BIT Bits als char interpretiert.<br />
Das Gleiche gilt für int. Die nachfolgenden sizeof(int) * CHAR_BIT Bits werden als int interpretiert.</p>
</blockquote>
<p>Super beschrieben !</p>
<blockquote>
<p>Der Stream (in deinem Fall cout) sieht jedoch, dass er einen int* ausgeben soll.<br />
(Achtung Metaphern, nicht instant-flamen, bitt ;))<br />
Der Stream schaut nach, wie er einen int* ausgeben soll. Der hat gespeichert: gebe einen int* als hexadezimale Zahl aus, die die Adresse angibt.<br />
Bei char* schaut der ebenfalls nach und sieht: Ein char* ist eine Zeichenkette. Sie geht von der Startadresse bis zu '\0'. Interpretiere den Speicherbereich von char* bis zur ersten '\0' als char und gebe alles aus.<br />
Aber für den Compiler werden beide gleich behandelt.</p>
<p>Edit:<br />
Hättest du die Streams geschrieben, hättest du sagen können:<br />
Wenn du einen int* siehst, gebe den Wert aus, auf den int* zeigt.</p>
</blockquote>
<p>Also ist das so richtig:</p>
<pre><code>(char*) ptrx 
--&gt; Compiler erzeugt bestimmten Binaercode Y anhand des Interpretationsalgorithmus gehoerend zu: Gehe zu Adresse ptrx, interpretiere als char 
--&gt; dieser Binaercode Y wird dann an std::cout uebergeben
--&gt; std::cout sieht nach wie es Datentypen char* ausgeben soll und interpretiert dann Binaercode Y anhand der Interpretationsalgorithmen fuer &quot;char*&quot;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2319018</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319018</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 13:47:16 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 13:49:19 GMT]]></title><description><![CDATA[<p>Es ist ganz einfach so, dass die C++ Streams ungefähr diese Operatoren für Zeiger haben:</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; o, const char* p)
{
    // Gib alle Zeichen aus bis ein Nullbyte kommt.
    while(*p)
        o.put(*(p++));
    return o;
}

ostream&amp; operator&lt;&lt;(ostream&amp; o, const void* p)
{
    // Betrachte den Zeiger als int und gebe den Zahlenwert (=die Speicheraddresse) aus.
    return o &lt;&lt; (uintptr_t)p;
}
</code></pre>
<p>Schreibst du jetzt zb</p>
<pre><code>int* foo;
cout &lt;&lt; foo;
</code></pre>
<p>Sucht der Compiler einen passenden Operator. Und das ist eben #2, da er int* nach void* konvertieren kann, hingegen nicht int* in char*.</p>
<p>Der erste Operator existiert nur, damit du Stringliterale bequem ausgeben kannst:</p>
<pre><code>cout &lt;&lt; &quot;Hallo Welt !&quot;;
</code></pre>
<p>Ruft #1 auf, da es die Funktion ist, die am Besten passt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319020</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319020</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 27 Apr 2013 13:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 13:55:12 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; o, const void* p)
{[b]
    // Betrachte den Zeiger als int und gebe den Zahlenwert (=die Speicheraddresse) aus.[/b]
    return o &lt;&lt; (uintptr_t)p;
}
</code></pre>
</blockquote>
<p>Aber wenn er den Zeiger als int betrachtet, warum wird es dann in Hexadezimal ausgegeben und nicht in Dezimal wie es cout bei int fuer gewoehnlich tut ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319022</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 13:55:12 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 13:56:16 GMT]]></title><description><![CDATA[<p>Weil halt gespeichert ist, dass Zeigertypen hexadezimal ausgegeben werden sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319023</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319023</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 27 Apr 2013 13:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 14:01:42 GMT]]></title><description><![CDATA[<p>Super, vielen vielen Dank, Leute !</p>
<p>Ich denke jetzt hab ich es endlich halbwegs durchschaut.</p>
<p>Noch kurz zur Ueberpruefung, ob ich es wirklich richtig verstanden habe:</p>
<p>idrake schrieb:</p>
<blockquote>
<p>Also ist das so richtig:</p>
<pre><code>(char*) ptrx 
--&gt; Compiler erzeugt bestimmten Binaercode Y anhand des Interpretationsalgorithmus gehoerend zu: Gehe zu Adresse ptrx, interpretiere als char 
--&gt; dieser Binaercode Y wird dann an std::cout uebergeben
--&gt; std::cout sieht nach wie es Datentypen char* ausgeben soll und interpretiert dann Binaercode Y anhand der Interpretationsalgorithmen fuer &quot;char*&quot;
</code></pre>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/2319029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319029</guid><dc:creator><![CDATA[idrake]]></dc:creator><pubDate>Sat, 27 Apr 2013 14:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 14:03:53 GMT]]></title><description><![CDATA[<p>Jein.<br />
Der Compiler erzeugt Maschinencode mit Anweisungen, wie der Speicherbereich zu interpretieren ist.<br />
Die Auswahl des passenden operators (Ethon hat dir gezeigt, wie die aussehen) geschieht aber noch zur Compilezeit, nach strikt definierten Überladungsregeln. Es wird dann Maschinencode erzeugt, der den operator ausführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319031</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319031</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 27 Apr 2013 14:03:53 GMT</pubDate></item><item><title><![CDATA[Reply to data type &amp;quot; int* &amp;quot; vs &amp;quot; char* &amp;quot; on Sat, 27 Apr 2013 14:40:10 GMT]]></title><description><![CDATA[<p>idrake schrieb:</p>
<blockquote>
<p>Ethon schrieb:</p>
<blockquote>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; o, const void* p)
{[b]
    // Betrachte den Zeiger als int und gebe den Zahlenwert (=die Speicheraddresse) aus.[/b]
    return o &lt;&lt; (uintptr_t)p;
}
</code></pre>
</blockquote>
<p>Aber wenn er den Zeiger als int betrachtet, warum wird es dann in Hexadezimal ausgegeben und nicht in Dezimal wie es cout bei int fuer gewoehnlich tut ?</p>
</blockquote>
<p>Weil ich zu faul war eine korrekte Implementierung zu tippen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Der Operator enthält natürlich noch Magie, um den Stream auf hex zu stellen und danach auf das, was er davor war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2319045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2319045</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sat, 27 Apr 2013 14:40:10 GMT</pubDate></item></channel></rss>