<?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[Zeigergeschichte]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich beschäftige mich in letzter Zeit intensiv mit Zeigern (bin ja noch blutiger Anfänger <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="😃"
    /> ) und habe ein paar Fragen dazu.</p>
<pre><code>const char * x;
x = &quot;Hallo!&quot;;
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
x = &quot;Hello!&quot;; // warum kann ich einen CONST char * ändern bzw. was ist daran konstant?
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was für ein Vorteil(e) har char * gegenüber const char *?</p>
<pre><code>char * s;
INT32 * n;
s = &quot;Hallo!&quot;; // warum übergebe ich hier ein String-Literal und nicht eine Adresse ?
n = 12; // FEHLER! Hier wird eine Adresse erwartet (mit &amp;-Operator). Warum auch nicht oben?
</code></pre>
<p>Wäre nett, wenn man mich aufklären würde.</p>
<p>Danke im Voraus!</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318071/zeigergeschichte</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 14:24:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318071.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 29 Jun 2013 19:53:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 19:53:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich beschäftige mich in letzter Zeit intensiv mit Zeigern (bin ja noch blutiger Anfänger <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="😃"
    /> ) und habe ein paar Fragen dazu.</p>
<pre><code>const char * x;
x = &quot;Hallo!&quot;;
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
x = &quot;Hello!&quot;; // warum kann ich einen CONST char * ändern bzw. was ist daran konstant?
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was für ein Vorteil(e) har char * gegenüber const char *?</p>
<pre><code>char * s;
INT32 * n;
s = &quot;Hallo!&quot;; // warum übergebe ich hier ein String-Literal und nicht eine Adresse ?
n = 12; // FEHLER! Hier wird eine Adresse erwartet (mit &amp;-Operator). Warum auch nicht oben?
</code></pre>
<p>Wäre nett, wenn man mich aufklären würde.</p>
<p>Danke im Voraus!</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335343</guid><dc:creator><![CDATA[PHBU]]></dc:creator><pubDate>Sat, 29 Jun 2013 19:53:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 20:00:42 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<pre><code>const char * x;
x = &quot;Hallo!&quot;;
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
x = &quot;Hello!&quot;; // warum kann ich einen CONST char * ändern bzw. was ist daran konstant?
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
</code></pre>
</blockquote>
<p>In Verbindung mit Zeigern gibt es 2 const. Du musst die Deklaration von rechts nach links lesen. x is a pointer to const-char. D.h. nicht x ist const, sondern das, worauf der Zeiger zeigt. Bei <code>char* const x</code> wäre der Zeiger const.</p>
<p>Seikuassi schrieb:</p>
<blockquote>
<p>Was für ein Vorteil(e) har char * gegenüber const char *?</p>
<pre><code>char * s;
INT32 * n;
s = &quot;Hallo!&quot;; // warum übergebe ich hier ein String-Literal und nicht eine Adresse ?
n = 12; // FEHLER! Hier wird eine Adresse erwartet (mit &amp;-Operator). Warum auch nicht oben?
</code></pre>
</blockquote>
<p>Naja, wenn etwas nicht geändert werden soll, machst du es const. Du machst es eben immer so, wie du es brauchst. Wenn etwas änderbar sein soll, kannst du es ja nicht cosnt machen... Also ich würde hier nicht von Vorteil/Nachteil reden. Nun noch zu dem konkreten Beispiel. Literale sind immer konstant, auch Zeichenkettenliterale (&quot;Hallo&quot;). Streng genommen, ist <code>char* s = &quot;Hallo&quot;</code> also nicht erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335344</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Sat, 29 Jun 2013 20:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 20:05:12 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>Was für ein Vorteil(e) har char * gegenüber const char *?</p>
</blockquote>
<p>Keinen.</p>
<blockquote>
<pre><code>char * s;
INT32 * n;
s = &quot;Hallo!&quot;; // warum übergebe ich hier ein String-Literal und nicht eine Adresse ?
n = 12; // FEHLER! Hier wird eine Adresse erwartet (mit &amp;-Operator). Warum auch nicht oben?
</code></pre>
</blockquote>
<p>Ein String-Literal ist ein Array mit statischer Speicherdauer, und wie das bei Arrays so ist, wird jede Erwähnung eines solches Arrays bei jeder sich bietenden Gelegenheit sofort in einen Zeiger auf das erste Element umgewandelt. Im Prinzip könnte da auch sowas stehen:</p>
<pre><code class="language-cpp">static char const hallo[] = &quot;Hallo!&quot;;
...
s = hallo;
</code></pre>
<p>Bei int-Literalen ist das nicht so, das sind wirklich einfach nur Zahlen.</p>
<p>BTW dass das mit char* funktioniert, obwohl das Stringliteral const ist, ist ein Spezialfall, den es aus historischen Gründen noch gibt. Normalerweise sollte man auf String-Literale grundsätzlich nur const char* zeigen lassen, da es in jedem Fall undefiniertes Verhalten ergibt, ein String-Literal zu verändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335345</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Sat, 29 Jun 2013 20:05:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 20:09:11 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<pre><code>const char * x;
x = &quot;Hallo!&quot;;
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
x = &quot;Hello!&quot;; // warum kann ich einen CONST char * ändern bzw. was ist daran konstant?
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;
</code></pre>
<p>Was für ein Vorteil(e) har char * gegenüber const char *?</p>
</blockquote>
<p>Ein <code>const char*</code> ist ein Zeiger auf einen konstanten <code>char</code> und kein konstanter Zeiger (das wäre ein <code>char *const</code> ). Du änderst da oben nur den Wert des Zeigers und nicht den Wert des Objektes auf das der Zeiger zeigt, also ist alles in Ordnung.</p>
<p>Seikuassi schrieb:</p>
<blockquote>
<pre><code>char * s;
INT32 * n;
s = &quot;Hallo!&quot;; // warum übergebe ich hier ein String-Literal und nicht eine Adresse ?
n = 12; // FEHLER! Hier wird eine Adresse erwartet (mit &amp;-Operator). Warum auch nicht oben?
</code></pre>
</blockquote>
<p>String Literale sind Objekte vom Typ <code>const char[n]</code> . Ein Array, wie eben z.B. <code>const char[n]</code> , kann implizit in einen Zeiger auf das erste Element umgewandelt werden. Aus Gründen der Kompatibilität mit uraltem C Code ( <code>const</code> gab es nicht immer), gibt es in C++ zusätzlich noch die Regelung, dass ein String Literal auch in einen <code>char*</code> umgewandelt werden kann. Davon sollte man aber selbst in purem C Abstand nehmen und immer korrekt <code>const</code> verwenden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335346</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sat, 29 Jun 2013 20:09:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 20:08:40 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>const char * x;<br />
x = &quot;Hallo!&quot;;<br />
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;<br />
x = &quot;Hello!&quot;; // warum kann ich einen CONST char * ändern bzw. was ist daran konstant?<br />
cout &lt;&lt; x &lt;&lt; &quot;\n&quot;;<br />
[/code]</p>
</blockquote>
<p>const T * ist ein Zeiger auf ein konstantes T, d.h. das Objekt, auf das er zeigt ist über den Zeiger nicht veränderbar, Beispiel:</p>
<pre><code>int a = 5, b = 2;
const int *x = &amp;a;
*x = 1; // FEHLER: a über x nicht veränderbar
x = &amp;b; // ERLAUBT: Änderung der Variablen, auf die der Zeiger zeigt, erlaubt
</code></pre>
<p>T * const ist ein konstanter Zeiger auf T, d.h. das Objekt ist veränderbar, aber der Zeiger nicht:</p>
<pre><code>int a = 5, b = 2;
const int *x = &amp;a;
*x = 1; // ERLAUBT: a über x veränderbar
x = &amp;b; // FEHLER: Änderung der Variablen, auf die der Zeiger zeigt, verboten
</code></pre>
<p>Natürlich geht auch beides:<br />
const T *const, dann ist beides aus dem Beispiel ein Fehler.</p>
<blockquote>
<p>Was für ein Vorteil(e) har char * gegenüber const char *?</p>
</blockquote>
<p>char* kann nicht auf konstanste char zeigen, const char* schon. Stichwort const correctness.</p>
<blockquote>
<pre><code>char * s;
INT32 * n;
s = &quot;Hallo!&quot;; // warum übergebe ich hier ein String-Literal und nicht eine Adresse ?
n = 12; // FEHLER! Hier wird eine Adresse erwartet (mit &amp;-Operator). Warum auch nicht oben?
</code></pre>
</blockquote>
<p>Ein Stringliteral liegt im Arbeitsspeicher.<br />
Es ist wie ein konstantes char-Array, was der Programmier erstellt hat.<br />
Weist man das einem Pointer zu, wird das Literal intern zur Anfangsadresse des Arrays im Speicher konvertiert; es ist also eine Adresse.<br />
Ein Zahlliteral ist aber eine Konstante, die im Programmcode steht, man kann zur Laufzeit nicht darauf zeigen, weil sie nicht im Arbeitsspeicher liegt.<br />
Das man zum Zeigen auf Stringliterale, die eigentlich konstant sind und es undefiniert ist, sie zu verändern, nicht const char* verwenden muss, hat historische Gründe und ist die einzige Ausnahme der Regel oben.</p>
<p>Edit: LOL, viermal die gleiche Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335347</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 29 Jun 2013 20:08:40 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 20:22:18 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die vielen Antworten <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>Das heißt also, dass ein String-Literal</p>
<pre><code>char * x;
x = &quot;Hallo&quot;;
</code></pre>
<p>folgendem Code entspricht, oder?</p>
<pre><code>char * x;
x [0] = 'H';
x [1] = 'a';
x [2] = 'l';
x [3] = 'l';
x [4] = 'o';
</code></pre>
<p>Folgender Code geht nicht, weil also die einzelnen chars konstant sind, oder was <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?</p>
<pre><code>const char * x;
x [0] = 'H';
x [1] = 'a';
x [2] = 'l';
x [3] = 'l';
x [4] = 'o';
</code></pre>
<p>Letzte Frage: Wie lang darf denn ein const char * maximal sein?</p>
<p>Danke im Voraus!</p>
<p>MfG</p>
<p>Seikuassi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335350</guid><dc:creator><![CDATA[PHBU]]></dc:creator><pubDate>Sat, 29 Jun 2013 20:22:18 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sat, 29 Jun 2013 20:36:26 GMT]]></title><description><![CDATA[<p>Seikuassi schrieb:</p>
<blockquote>
<p>Das heißt also, dass ein String-Literal</p>
<pre><code>char * x;
x = &quot;Hallo&quot;;
</code></pre>
<p>folgendem Code entspricht, oder?</p>
<pre><code>char * x;
x [0] = 'H';
x [1] = 'a';
x [2] = 'l';
x [3] = 'l';
x [4] = 'o';
</code></pre>
</blockquote>
<p>Nein:<br />
Bashar hat den Code gezeigt. Das Beispiel ist insofern falsch, da du keinen Speicher anforderst.</p>
<blockquote>
<p>Folgender Code geht nicht, weil also die einzelnen chars konstant sind, oder was <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ?</p>
<pre><code>const char * x;
x [0] = 'H';
x [1] = 'a';
x [2] = 'l';
x [3] = 'l';
x [4] = 'o';
</code></pre>
</blockquote>
<p>Ja, folgender Code geht nicht (abgesehen davon, dass du wieder keinen Speicher anforderst).</p>
<blockquote>
<p>Letzte Frage: Wie lang darf denn ein const char * maximal sein?</p>
</blockquote>
<p>So lang wie dir Arbeitsspeicher zugeteilt ist.[/quote]</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335357</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sat, 29 Jun 2013 20:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to Zeigergeschichte on Sun, 30 Jun 2013 09:28:52 GMT]]></title><description><![CDATA[<blockquote>
<p>Letzte Frage: Wie lang darf denn ein const char * maximal sein?</p>
</blockquote>
<p>Ein char const* ist ein Zeiger. Zuerst mal <strong>kein String</strong>. Sein Wert ist eine Speicheradresse. Erst wenn du diesem Zeiger etwas entsprechendes zuweist, kannst du ihn als &quot;String&quot; betrachten, weil er dann auf eine nullterminierte Folge von Bytes (einen NTBS) verweist, die Zeichencodes o.ä. sind.</p>
<p>Vielleicht war deine Frage, wie lang kann ein (echtes) <code>char</code> -Array sein. Das ist vom Standard nicht vorgegeben - Anhang B, implementation quantities, schreibt eine Höchstzahl für Array-Bounds nicht vor. Aber er darf nicht besonders groß sein, da es auf dem Stack liegt. Und der ist meistens etwa ein, zwei MiB groß.</p>
<p>Ein C-String, der auf dem Heap liegt, muss irgendwie allokiert worden sein. <code>std::string</code> bswp. hat eine Memberfunktion <code>max_size()</code> . Diese gibt einen vom Standard in keinster weise definierten Wert zurück.<br />
GCC schreibt im Header:</p>
<pre><code>// The maximum number of individual char_type elements of an
	// individual string is determined by _S_max_size. This is the
	// value that will be returned by max_size().  (Whereas npos
	// is the maximum number of bytes the allocator can allocate.)
	// If one was to divvy up the theoretical largest size string,
	// with a terminating character and m _CharT elements, it'd
	// look like this:
	// npos = sizeof(_Rep) + (m * sizeof(_CharT)) + sizeof(_CharT)
	// Solving for m:
	// m = ((npos - sizeof(_Rep))/sizeof(CharT)) - 1
	// In addition, this implementation quarters this amount.
</code></pre>
<p>Allerdings ist das nicht ausschlaggebend, sondern im Endeffekt der Arbeitsspeicher (oder wie viel die OS-spezifische API da hergibt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2335396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2335396</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Sun, 30 Jun 2013 09:28:52 GMT</pubDate></item></channel></rss>