<?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[[gelöst] Verständnisproblem bei Zeiger-Syntax]]></title><description><![CDATA[<p>Diesmal habe ich eine Verstädnisfrage zur Syntax von Zeigern.<br />
In einem Programm möchte ich ein Feld von Zahlen und ein Feld von C-Strings sortieren. Ich danke euch für Eure ZEit und Hilfe.</p>
<p>Bei den Zahlen gehe ich laut meinem Buch wie folgt vor:</p>
<pre><code class="language-cpp">int icmp(const void * a, const void * b)  {
   int ia = *static_cast&lt;const int *&gt;(a);
   int ib = *static_cast&lt;const int *&gt;(b);
   if(ia == ib) return 0;
   return ia &gt; ib ? 1 : -1;
}

int main()  {
    int ifeld[] = {100, 22, 3, 44, 6, 9, 2, 1, 8, 9};
    size_t anzahl = sizeof(ifeld) / sizeof(ifeld[0]);
    qsort(ifeld, anzahl, sizeof(ifeld[0]), icmp);
}
</code></pre>
<p>Dabei versetehe ich die Fktn icmp wie folgt:<br />
Ich übergebe einen Zeiger auf ein konstantes Objekt vom Typ void.<br />
Da die Funktionen mit int-Werten arbeitet, die ich konkret verarbeiten möchte, konvertiere ich den void Zeiger in einen Zeiger auf einen konstanten Integer-Wert, den ich dann dereferenziere, um mit dem Wert zu arbeiten.<br />
Habe ich das richtig verstanden?</p>
<p>Falls ja, kommt hier mein Verstädnisproblem.<br />
Das gleiche mache ich nun mit C-Strings. Laut Buch:</p>
<pre><code class="language-cpp">int ccmp(const void * a, const void * b)    {
    const char * ca = *static_cast&lt;const char * const *&gt;(a);
    const char * cb = *static_cast&lt;const char * const *&gt;(b);
    return strcmp(ca,cb);
}

int main()      {
    const char * cfeld[] = {&quot;Birgit&quot;, &quot;Anton&quot;, &quot;Franz&quot;, &quot;Zenzi&quot;, &quot;Emiliane&quot;, &quot;Chris&quot;};
    anzahl = sizeof(cfeld)/sizeof(cfeld[0]);
    qsort(cfeld, anzahl, sizeof(char *), ccmp);
}
</code></pre>
<p>Ich übergebe der Fktn ccmp einen Zeiger auf ein konstantes Objekt vom Typ void.<br />
Das Objekt (ich glaub, der Begriff ist hier eh falsch, oder?) ist nun konkret ein Zeiger auf ein konstantes Zeichen (eben const char *). Nun möchte ich doch jenen Zeiger auf const void in einen Zeiger auf const (const char <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="😉"
    /> konvertieren, oder?<br />
Wieso heißt es dann</p>
<pre><code class="language-cpp">const char * ca = *static_cast&lt;const char * const *&gt;(a);
</code></pre>
<p>und nicht</p>
<pre><code class="language-cpp">const char * ca = *static_cast&lt;const (const char *) *&gt;(a);
</code></pre>
<p>?</p>
<p>Also wenn das eine dumme Frag eist, tut es mir Leid. Aber ich verstehe es nicht...</p>
<p>Danke schon mal!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274412/gelöst-verständnisproblem-bei-zeiger-syntax</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 10:42:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274412.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 25 Sep 2010 16:35:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Tue, 28 Sep 2010 14:01:46 GMT]]></title><description><![CDATA[<p>Diesmal habe ich eine Verstädnisfrage zur Syntax von Zeigern.<br />
In einem Programm möchte ich ein Feld von Zahlen und ein Feld von C-Strings sortieren. Ich danke euch für Eure ZEit und Hilfe.</p>
<p>Bei den Zahlen gehe ich laut meinem Buch wie folgt vor:</p>
<pre><code class="language-cpp">int icmp(const void * a, const void * b)  {
   int ia = *static_cast&lt;const int *&gt;(a);
   int ib = *static_cast&lt;const int *&gt;(b);
   if(ia == ib) return 0;
   return ia &gt; ib ? 1 : -1;
}

int main()  {
    int ifeld[] = {100, 22, 3, 44, 6, 9, 2, 1, 8, 9};
    size_t anzahl = sizeof(ifeld) / sizeof(ifeld[0]);
    qsort(ifeld, anzahl, sizeof(ifeld[0]), icmp);
}
</code></pre>
<p>Dabei versetehe ich die Fktn icmp wie folgt:<br />
Ich übergebe einen Zeiger auf ein konstantes Objekt vom Typ void.<br />
Da die Funktionen mit int-Werten arbeitet, die ich konkret verarbeiten möchte, konvertiere ich den void Zeiger in einen Zeiger auf einen konstanten Integer-Wert, den ich dann dereferenziere, um mit dem Wert zu arbeiten.<br />
Habe ich das richtig verstanden?</p>
<p>Falls ja, kommt hier mein Verstädnisproblem.<br />
Das gleiche mache ich nun mit C-Strings. Laut Buch:</p>
<pre><code class="language-cpp">int ccmp(const void * a, const void * b)    {
    const char * ca = *static_cast&lt;const char * const *&gt;(a);
    const char * cb = *static_cast&lt;const char * const *&gt;(b);
    return strcmp(ca,cb);
}

int main()      {
    const char * cfeld[] = {&quot;Birgit&quot;, &quot;Anton&quot;, &quot;Franz&quot;, &quot;Zenzi&quot;, &quot;Emiliane&quot;, &quot;Chris&quot;};
    anzahl = sizeof(cfeld)/sizeof(cfeld[0]);
    qsort(cfeld, anzahl, sizeof(char *), ccmp);
}
</code></pre>
<p>Ich übergebe der Fktn ccmp einen Zeiger auf ein konstantes Objekt vom Typ void.<br />
Das Objekt (ich glaub, der Begriff ist hier eh falsch, oder?) ist nun konkret ein Zeiger auf ein konstantes Zeichen (eben const char *). Nun möchte ich doch jenen Zeiger auf const void in einen Zeiger auf const (const char <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="😉"
    /> konvertieren, oder?<br />
Wieso heißt es dann</p>
<pre><code class="language-cpp">const char * ca = *static_cast&lt;const char * const *&gt;(a);
</code></pre>
<p>und nicht</p>
<pre><code class="language-cpp">const char * ca = *static_cast&lt;const (const char *) *&gt;(a);
</code></pre>
<p>?</p>
<p>Also wenn das eine dumme Frag eist, tut es mir Leid. Aber ich verstehe es nicht...</p>
<p>Danke schon mal!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957390</guid><dc:creator><![CDATA[Tonikum]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:01:46 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Sat, 25 Sep 2010 17:24:00 GMT]]></title><description><![CDATA[<p>also const char * const * ist:<br />
zeiger auf -&gt; konstanten -&gt; zeiger auf -&gt; char -&gt; was kosntant ist<br />
(die syntax von rechts nach links lesen)<br />
was soviel heist wie ein zeiger auf eine [konstante zeichenkette wo auch der zeiger kosntant ist]</p>
<p>dass das nicht so gut kommt sollte auch klar sein, weil es quasi ein array von strings ist</p>
<p>sprich du versuchst einen string (so nennt man das &quot;objekt&quot;) in ein array von strings zu konvertieren</p>
<p>achja, sizeof(char <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="😉"
    /> ist immer vier, weil ein zeiger nur die addresse beeinhaltet und die ist nunmal ein int -&gt; 4 byte<br />
genau das gleiche kommt bei sizeof(cfeld[0]) raus, weil auch das nur ein zeiger auf char ist</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957413</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 25 Sep 2010 17:24:00 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Sat, 25 Sep 2010 17:38:12 GMT]]></title><description><![CDATA[<p>Befremdliches Buch. qsort und static_cast? Sowas wirst Du im Einsatz niemals sehen. Warum macht der sowas?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957419</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957419</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 25 Sep 2010 17:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Sat, 25 Sep 2010 17:47:05 GMT]]></title><description><![CDATA[<p>Prinzipiell bezieht sich ein cv-qualifier (wie const) in einer Deklaration immer auf das, was direkt zu seiner linken steht. Also:</p>
<pre><code class="language-cpp">int const i;               // int-Konstante
int const *const p;        // Zeigerkonstante, die auf int-Konstante zeigt
int const *const *const q; // usw.
</code></pre>
<p>Es gibt eine Ausnahme davon, und zwar dann, wenn const ganz links steht - dann bezieht es sich auf das, was direkt zu seiner rechten steht. Dementsprechend:</p>
<pre><code class="language-cpp">int const i; // ist das gleiche wie
const int j;
</code></pre>
<p>und</p>
<pre><code class="language-cpp">char const *const p; // das gleiche wie
const char *const q;
</code></pre>
<p>Das ist im ersten Augenblick etwas verwirrend, wenn man es gewohnt ist, const nach links zu schreiben. Ich empfehle, statt an &quot;konstante Zahlen&quot; an &quot;Zahlenkonstanten&quot; zu denken und const immer nach rechts zu schreiben. Das hat nebenbei auch den Vorteil, dass man sich nie mit Verwirrung um &quot;konstante Variablen&quot; herumschlagen muss. <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/1957421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957421</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Sat, 25 Sep 2010 17:47:05 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Sat, 25 Sep 2010 18:18:46 GMT]]></title><description><![CDATA[<p>Tonikum schrieb:</p>
<blockquote>
<p>Ich übergebe einen Zeiger auf ein konstantes Objekt vom Typ void.</p>
</blockquote>
<p><em>void</em> enthält kein Typinformationen. Demnach kannst du keine Variable/Objekt von diesem Typen erstellen.<br />
<em>void</em> ist ein besonderer Typ für Zeiger. Der Zeiger kann dann auf jedes beliebige Objekt zeigen, egal von welchem Datentypen das Objekt ist.<br />
Um dann aber etwas mit dem Objekt, auf das der void-Zeiger zeigt, anfangen zu können, musst du zum Objekttypen hin casten, weil, wie gesagt, <em>void</em> keine Typinformationen hat.</p>
<p>Tonikum schrieb:</p>
<blockquote>
<p>... konvertiere ich den void Zeiger in einen Zeiger auf einen konstanten Integer-Wert, den ich dann dereferenziere, um mit dem Wert zu arbeiten.</p>
</blockquote>
<p>... konvertiere ich den void Zeiger in einen <em>konstanten</em> Zeiger auf einen konstanten Integer-Wert, den ich dann dereferenziere, um mit dem Wert zu arbeiten.<br />
Hast du richtig verstanden.<br />
Ich würde in deinem Satz das Wort &quot;konvertieren&quot; irgendwie nicht verwenden. Das hört sich für mich so an, als ob du den void-Zeiger an sich veränderst.<br />
Würde eher sagen, &quot;ich interpretiere den void-Zeiger nun als einen konstanten Zeiger auf einen konstanten int-Wert.&quot;</p>
<p>Tonikum schrieb:</p>
<blockquote>
<p>Ich übergebe der Fktn ccmp einen Zeiger auf ein konstantes Objekt vom Typ void.</p>
</blockquote>
<p>Du übergibst der Funktion die Adressen zweier Variablen.</p>
<p>Das erste <em>const</em> bezieht sich auf den Inhalt, auf den der Zeiger zeigt.<br />
Das zweite <em>const</em> bezieht sich auf den Zeiger.<br />
Der c++ Standard sagt nun, dass das erste const vor dem * stehen muss und das zweite const nach dem * stehen muss.</p>
<pre><code class="language-cpp">/*
        Zeiger darf nicht umgebogen werden.
        Zeiger darf die Variable 'i' nur lesen (read-only), und nicht modifizieren.
    */
    int i = 7;
    const int* const pi = &amp;i;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1957424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957424</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 25 Sep 2010 18:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Tue, 28 Sep 2010 12:52:27 GMT]]></title><description><![CDATA[<p>Vielen Dank für eure Antworten!</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>also const char * const * ist:<br />
zeiger auf -&gt; konstanten -&gt; zeiger auf -&gt; char -&gt; was kosntant ist<br />
(die syntax von rechts nach links lesen)<br />
was soviel heist wie ein zeiger auf eine [konstante zeichenkette wo auch der zeiger kosntant ist]</p>
</blockquote>
<p>Okay, das habe ich vestanden. Wie in aler Welt komme ich darauf, dass ich das brauche? Auf der linken Seite steht ja mit &quot;const char * ca&quot; auch kein konstanter Zeiger da. Wieso reicht also nicht</p>
<pre><code class="language-cpp">const char * ca = *static_cast&lt;const char * *&gt;(a);
</code></pre>
<p>und wieso funktioniert dann nicht auch:</p>
<pre><code class="language-cpp">const char * const ca = *static_cast&lt;const char * const *&gt;(a);
</code></pre>
<p>?</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>dass das nicht so gut kommt sollte auch klar sein, weil es quasi ein array von strings ist</p>
</blockquote>
<p>Wieso ist das nicht gut? o.O</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Befremdliches Buch. qsort und static_cast? Sowas wirst Du im Einsatz niemals sehen. Warum macht der sowas?</p>
</blockquote>
<p>Ulrich Breymann - C++ Einführung und professionelle Programmierung</p>
<p>Danke sehr!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958511</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958511</guid><dc:creator><![CDATA[Tonikum]]></dc:creator><pubDate>Tue, 28 Sep 2010 12:52:27 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Tue, 28 Sep 2010 13:27:58 GMT]]></title><description><![CDATA[<p>Du castest einen Zeiger auf void const in einen Zeiger auf etwas anderes. cv-Qualifier wirst du ohne const_cast nicht los, also muss dieses andere auch const sein.</p>
<p>Im Übrigen möchte ich anmerken, dass das in professionellem C++ etwa so aussähe:</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;cstddef&gt;
#include &lt;cstring&gt;
#include &lt;string&gt;

template&lt;typename T, std::size_t N&gt;
std::size_t array_size(T(&amp;)[N]) { return N; }

bool c_strless(char const *p, char const *q) {
  return strcmp(p, q) &lt; 0;
}

int main() {
  std::string sfeld[] = { &quot;Birgit&quot;, &quot;Anton&quot;, &quot;Franz&quot;, &quot;Zenzi&quot;, &quot;Emiliane&quot;, &quot;Chris&quot; };
  std::sort(sfeld, sfeld + array_size(sfeld));

  // Gelegentlich vielleicht so:
  const char *cfeld[] = { &quot;Birgit&quot;, &quot;Anton&quot;, &quot;Franz&quot;, &quot;Zenzi&quot;, &quot;Emiliane&quot;, &quot;Chris&quot; };
  std::sort(cfeld, cfeld + array_size(cfeld), c_strless);
}
</code></pre>
<p>Das Buch, aus dem du deinen Code hast, wäre wahrscheinlich besser mit &quot;C mit Klassen: Einführung in völlig veraltete Praktiken&quot; betitelt. Bis auf die C++-Casts ist das alles reines C.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958534</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 28 Sep 2010 13:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Tue, 28 Sep 2010 14:01:29 GMT]]></title><description><![CDATA[<p>Danke für die Mühe Seldon!<br />
Ich glaub, ich werde das nie richtig können.<br />
Mit welchen Büchern habt ihr denn C++ gelernt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958550</guid><dc:creator><![CDATA[Tonikum]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:01:29 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst] Verständnisproblem bei Zeiger-Syntax on Tue, 28 Sep 2010 14:18:38 GMT]]></title><description><![CDATA[<p>C++ Primer ist eigentlich ganz gut für den Einstieg.<br />
Falls du schon ein wenig Programmiererfahrung hast, dann würde ich dir zum The C++ Programming Language von Bjarne Stroustrup raten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958560</guid><dc:creator><![CDATA[RecommendedBooks]]></dc:creator><pubDate>Tue, 28 Sep 2010 14:18:38 GMT</pubDate></item></channel></rss>