<?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ändnisfrage zu Pointern]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Mir ist eben etwas aufgefallen, was ich nicht verstehe!</p>
<p>Ich kann problemlos folgenden Quellcode schreiben und ausführen:</p>
<pre><code class="language-cpp">char *C=&quot;a&quot;;
printf(&quot;%c&quot;,*C);
</code></pre>
<p>Mir wird ein &quot;a&quot; ausgegeben.</p>
<p>Wenn ich aber schreibe:</p>
<pre><code class="language-cpp">int *I=1;
printf(&quot;%d&quot;,*I);
</code></pre>
<p>Bekomme ich die Fehlermeldung beim Kompilieren &quot;error C2440: 'Initialisierung': 'int' kann nicht in 'int *' konvertiert werden&quot;.</p>
<p>Warum klappt das Eine, aber das Andere nicht???</p>
<p>Danke für euere Hilfe! <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/245366/verständnisfrage-zu-pointern</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 19:29:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245366.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 13 Jul 2009 11:23:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 11:23:58 GMT]]></title><description><![CDATA[<p>Hallo zusammen ...</p>
<p>Mir ist eben etwas aufgefallen, was ich nicht verstehe!</p>
<p>Ich kann problemlos folgenden Quellcode schreiben und ausführen:</p>
<pre><code class="language-cpp">char *C=&quot;a&quot;;
printf(&quot;%c&quot;,*C);
</code></pre>
<p>Mir wird ein &quot;a&quot; ausgegeben.</p>
<p>Wenn ich aber schreibe:</p>
<pre><code class="language-cpp">int *I=1;
printf(&quot;%d&quot;,*I);
</code></pre>
<p>Bekomme ich die Fehlermeldung beim Kompilieren &quot;error C2440: 'Initialisierung': 'int' kann nicht in 'int *' konvertiert werden&quot;.</p>
<p>Warum klappt das Eine, aber das Andere nicht???</p>
<p>Danke für euere Hilfe! <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/1742047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742047</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:23:58 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 11:44:08 GMT]]></title><description><![CDATA[<p>Mandel schrieb:</p>
<blockquote>
<p>...<br />
Bekomme ich die Fehlermeldung beim Kompilieren &quot;error C2440: 'Initialisierung': 'int' kann nicht in 'int *' konvertiert werden&quot;.</p>
<p>Warum klappt das Eine, aber das Andere nicht???...</p>
</blockquote>
<p>Steht doch da!</p>
<p><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="😉"
    /><br />
Vorab: Willst Du wirklich mir C weitermachen? Oder nicht doch lieber C++ programmieren?</p>
<p>Wenn es bei C bleiben soll: Dafür gibt es ein eigenes Unterforum, bei dem Du glücklicher werden wirst.</p>
<p>Wenn nicht: Nimm für Strings das, was dafür gemacht ist: std::string.<br />
Das vereinfacht die Sache in 1000 Situationen und würde bei Dir einfach zu</p>
<pre><code class="language-cpp">std::string C=&quot;a&quot;;
std::cout &lt;&lt; C;
</code></pre>
<p>werden.</p>
<p>@Dein Code:<br />
Was ist ein &quot;char&quot;? -&gt; EIN Buchtstabe. (nicht zwei, nicht drei, sondern: EINER!)<br />
Wie kennzeichnet man in C und C++ EINEN Char-Literal? -&gt; 'a'.<br />
(Merke: Einfache Anführungsstriche)<br />
Wenn Du es also richtig &quot;gemacht&quot; hättest (also so, wie bei Deinem int-Beispiel), hättest Du schreiben müssen:</p>
<pre><code class="language-cpp">char *C='a';
</code></pre>
<p>.... und hättest dieselbe Fehlermeldung erhalten wie bei Deinem int-Beispiel.<br />
DENN: &quot;char*&quot; bedeutet &quot;Zeiger auf einen Buchstaben&quot; - und der kann halt nicht mit einem &quot;Buchstaben&quot; initialisiert werden, sondern nur mit einer Speicheradresse, an der hoffentlich auch ein Buchstabe zufinden ist.<br />
Zu Zeigern gibt's hier&amp;im Internet schon genug nachzulesen, aber nur soweit: Dein Haus ist auch nicht dasselbe wie Deine Adresse.</p>
<p>Mit &quot;a&quot; kennzeichnet man eine ZeichenKETTE (die in diesem speziellen Fall halt nur 2 Zeichen (1 Buchstabe + 1 Stringendekennzeichen) umfasst).<br />
Wie gesagt: Wenn Du wirklich mit Zeichenketten arbeiten möchtest, sind C++ und std::string Deine Freunde (und Helfer) <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="😉"
    /><br />
Wenn Du Lust hast, den Umgang mit Zeigern zu lernen (die auch in C++ sehr sinnvoll sind), würde ich Dir vorschlagen, das an anderen Beispielen zu üben.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742053</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 11:41:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int *I = 1;
</code></pre>
<p>Thats a negative! Ein Zeiger zeigt auf eine Adresse!</p>
<pre><code class="language-cpp">int a = 3;
int *I = &amp;a;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1742055</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742055</guid><dc:creator><![CDATA[Danmel]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 11:56:17 GMT]]></title><description><![CDATA[<p>Vielen Dank erstmal für euere Antworten!</p>
<p>Ich hab mir das auch schon so gedacht, bzw. schon mal so ähnlich gelesen.<br />
Es ist ja so, dass der Zeiger auf eine Adresse zeigt. Und die muss ja erstmal für eine Variable reserviert sein.<br />
Also mit &quot;int i;&quot; reserviere ich dann ja eine Adresse für einen Int. Und auf die kann ich dann mit &quot;I=&amp;i&quot; von zeigen. Durch printf(&quot;%d&quot;,*I); kann ich dann den Inhalt der Adresse ausgeben.</p>
<p>Aber was ich leider immer noch nicht verstanden habe:<br />
Warum klappt das mit &quot;char *C=&quot;a&quot;&quot;?<br />
Damit das klappt muss doch dann auch erstmal eine Speicheradresse reserviert werden, ein Wert reingeschrieben werden und dann auch noch der Zeiger drauf gerichtet werden. Das alles übernimmt ja dann der Ausdruck. Sollte das bedeuten, dass due &quot;a&quot; schon Speicher reserviert wird?</p>
<p>Entschuldigung übrigens für mein schreckliches Mischmasch aus C und C++ <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742066</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Mon, 13 Jul 2009 11:56:17 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 12:00:42 GMT]]></title><description><![CDATA[<p>Mandel schrieb:</p>
<blockquote>
<p>Entschuldigung übrigens für mein schreckliches Mischmasch aus C und C++ <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
</blockquote>
<p>Bisher ist das kein Mischmasch sondern reines C. Du solltest dich allerdings entscheiden (und Bescheid sagen) was von beidem du möchtest. Im Fall C wird der Thread hier dann ins ANSI-C-Forum verschoben, im Fall C++ darfst du dir dann anhören was du alles nicht machen solltest und wie das in C++ soooo vieeeel besser geht <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/1742070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742070</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 12:00:59 GMT]]></title><description><![CDATA[<p>dein Beispiel: in c++</p>
<pre><code class="language-cpp">char *p;
    int  *pi;
    char c = 'A';
    int i  = 1;
    pi    = &amp;i;
    p     = &amp;c;
    cout&lt;&lt;*p&lt;&lt;*pi;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1742071</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742071</guid><dc:creator><![CDATA[sovielleicht]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:00:59 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 12:07:12 GMT]]></title><description><![CDATA[<p>Mandel schrieb:</p>
<blockquote>
<p>Warum klappt das Eine, aber das Andere nicht???</p>
</blockquote>
<p>Weil in einem Fall der Typ des Initialisierers &quot;passt&quot; und im anderen Fall nicht.</p>
<pre><code class="language-cpp">char * pc1 = &quot;a&quot;;  // OK, &quot;a&quot; ist vom Typ const char[2]
char * pc2 = 'a';  // Fehler! Typ von 'a' ist char und nicht char*
int  * pi  = 1;    // Fehler! Typ con 1 ist int und nicht int*
</code></pre>
<p>Zeiger kannst Du entweder mit 0 Initialisieren (wird dann ein Nullzeiger) oder mit einer <em>Adresse</em> eines Objekts vom &quot;richtigen&quot; Typen. Um die Adresse eines Objektes zu bekommen, musst Du den Adress-operator ( <code>&amp;</code> ) benutzen. <a href="http://de.wikipedia.org/wiki/Literal" rel="nofollow">Literale</a> wie <code>1</code> , <code>'a'</code> oder <code>3.14159265</code> besitzen keine Addresse. Deswegen kannst Du auch nicht das hier schreiben:</p>
<pre><code class="language-cpp">int * pi = &amp;2;  // Fehler! [c]int[/c]-Literale haben keine Adressen!
</code></pre>
<p>Du musst also erst irgendwo einen <code>int</code> anlegen, damit ein Zeiger darauf zeigen kann:</p>
<pre><code class="language-cpp">int k = 23;
int * pi = &amp;k;  // OK
</code></pre>
<p>Soweit sogut.</p>
<p>String-Literale spielen eine besondere Rolle, weil sie eine Adresse besitzen. Das String-Literal &quot;a&quot; ist vom Typ <code>const char[2]</code> -- also ein Array aus zwei unveränderliche Zeichen, 'a' und '\0'. Dieses Array sitzt wirklich irgendwo im Speicher (da kümmert sich der Compiler drum) und man kann sich die Adresse des ersten Zeichens so holen:</p>
<pre><code class="language-cpp">const char* pc = &quot;Hallo, Welt!&quot;;
</code></pre>
<p>Das funktioniert so, weil es in C und C++ &quot;array-to-pointer decay&quot; gibt. Dabei wird automatisch ein Zeiger erzeugt, der auf das erste Element zeigt. Das Prinzip ist das gleiche wie in diesem Fall</p>
<pre><code class="language-cpp">int array[10];
int * pi = array;      // ist equivalent
int * pi = &amp;array[0];  // zu dem hier
</code></pre>
<p>String-Literale spielen noch eine zweite Sonderrolle. In C sind solche Literale nämlich <em>nicht</em> const, obwohl man sie trotzdem nicht verändern darf. Aus Gründen der C-Kompatibilität kann man also auch Zeiger vom Typen <code>char*</code> (<em>ohne</em> const) mit String-Literalen initialisieren.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742076</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:07:12 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 12:07:28 GMT]]></title><description><![CDATA[<p>Mandel schrieb:</p>
<blockquote>
<p>Das alles übernimmt ja dann der Ausdruck. Sollte das bedeuten, dass due &quot;a&quot; schon Speicher reserviert wird?</p>
</blockquote>
<p>So ähnlich. Die Zeichenkette &quot;a&quot; steht irgendwo im Speicher und durch Deinen Ausdruck wird der Zeiger 'C' dort drauf gerichtet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742077</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:07:28 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 12:08:49 GMT]]></title><description><![CDATA[<p>Mandel schrieb:</p>
<blockquote>
<p>Warum klappt das mit &quot;char *C=&quot;a&quot;&quot;?</p>
</blockquote>
<p>Weil &quot;a&quot; (mit &quot;) kein char ist. 'a' (mit ') wäre vom Typ char. Sachen zwischen doppelten Anführungszeichen gelten als Zeichenkette und da gibt es eine Konvertierung zu char*, da char* in C die übliche Art und Weise ist, mit Zeichenketten umzugehen. Mein C++ Compiler gibt übrigens bei</p>
<pre><code class="language-cpp">char *C=&quot;a&quot;
</code></pre>
<p>zu Recht die Warnung</p>
<pre><code>warning: deprecated conversion from string constant to 'char*'
</code></pre>
<p>aus.</p>
<p>edit: Woah, da war ich wohl viel zu langsam beim Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742078</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 13 Jul 2009 12:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 14:33:35 GMT]]></title><description><![CDATA[<p>Ich glaub jetzt hab ichs!</p>
<p>Vielen Dank für euere Mühe...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742168</guid><dc:creator><![CDATA[Mandel]]></dc:creator><pubDate>Mon, 13 Jul 2009 14:33:35 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage zu Pointern on Mon, 13 Jul 2009 16:25:24 GMT]]></title><description><![CDATA[<p>Du kannst es wissen.<br />
String-Literale &quot;bla&quot; sind eine Ausnahme. Fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1742261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1742261</guid><dc:creator><![CDATA[Danmel]]></dc:creator><pubDate>Mon, 13 Jul 2009 16:25:24 GMT</pubDate></item></channel></rss>