<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Zeigerfrage an C++ Profis!!!</title>
    <link>http://forum.geizhals.at/feed.jsp?id=210668</link>
    <description>Geizhals-Forum</description>
    <item>
      <title>Re(9): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1179207.html#1179207</link>
      <description>Dank dir, bei den beiden letzten, wäre ich sonst nie drauf gekommen!&lt;br&gt;Ist ein Programmierpraktikum in C++ auf da Uni, die Beispiele sind ganz schön gefinkelt!!!&lt;br/&gt;</description>
      <pubDate>Mon, 01 Dec 2003 09:31:00 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1179207.html#1179207</guid>
      <dc:creator>Edi</dc:creator>
      <dc:date>2003-12-01T09:31:00Z</dc:date>
    </item>
    <item>
      <title>Re(8): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1177987.html#1177987</link>
      <description>01&gt;&amp;nbsp;&amp;nbsp;char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};&lt;br&gt;02&gt;&amp;nbsp;&amp;nbsp;char **cp[] = {c+3, c+2, c+1, c};&lt;br&gt;03&gt;&amp;nbsp;&amp;nbsp;char ***cpp = cp;&lt;br&gt;04&gt;&lt;br&gt;05&gt;&amp;nbsp;&amp;nbsp;int main (void)&lt;br&gt;06&gt;&amp;nbsp;&amp;nbsp;{&lt;br&gt;07&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%s\n", **++cpp);&lt;br&gt;08&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%s\n", *--*++cpp+3);&lt;br&gt;09&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%s\n", *cpp[-2]+3);&lt;br&gt;10&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%s\n", cpp[-1][-1]+1);&lt;br&gt;11&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;12&gt;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;Ausgabe lautet korrekt:&lt;br&gt;POINT&lt;br&gt;ER&lt;br&gt;ST&lt;br&gt;EW&lt;br&gt;&lt;br&gt;&lt;br&gt;Erklärung:&lt;br&gt;&lt;br&gt;In der Zeile 01 wird ein Array von char Pointern angelegt und vorinitialisiert (*c[] identisch mit **c ist), wobei&lt;br&gt;c[0] = *c = "ENTER"&lt;br&gt;c[1] = *(c+1) = *c+1 = "NEW"&lt;br&gt;c[2] = *(c+2) = *c+2 = "POINT"&lt;br&gt;c[3] = *(c+3) = *c+3 = "FIRST"&lt;br&gt;&lt;br&gt;&lt;br&gt;Zeile 02:&lt;br&gt;cp ist ein array von Doppelpointern. Wird wie&amp;nbsp;&amp;nbsp;folgend initialisiert:&lt;br&gt;cp[0] = Adresse von "FIRST" , zeigt also auf den 4. Eintrag des c Arrays&lt;br&gt;cp[1] = Adresse von "POINT", 3. Eintrag&lt;br&gt;cp[2] = Adresse von "NEW", 2. Eintrag&lt;br&gt;cp[3] = Adresse von "ENTER", 1. Eintrag&lt;br&gt;Jeder Eintrag in diesem Array entspricht einem "char**" Doppelpointer, also den Adressen von Pointern!&lt;br&gt;&lt;br&gt;&lt;br&gt;Zeile 03:&lt;br&gt;cpp ist nun ein 3 fach Pointer ist in dem Sinn der gleiche Typ wie cp!&lt;br&gt;Die Definition ***cpp ist identisch zu **cpp[]!!!&lt;br&gt;Das heißt cpp zeigt einfach auch auf das cp Array und kann im Prinzip alle Elemente des Arrays gleich ansprechen wie cp. Sprich cpp[0] = Adresse von "FIRST" bis cpp[3] = Adresse von "ENTER"&lt;br&gt;&lt;br&gt;Zeile 07:&lt;br&gt;Gib **++cpp aus:&lt;br&gt;Zuerst wird die Operation ++cpp durchgeführt: cpp zeigt nun auf den zweiten Eintrag im cp Array, also statt auf die Adresse von "FIRST" nun auf die Adresse von "POINT". cpp[0] entpricht also nun der Adresse von "POINT".&lt;br&gt;Nun wird der Pointer zweimal dereferenziert -&gt; also mit ** kommt man zu dem char* und "POINT" wird am Bildschirm ausgegeben.&lt;br&gt;&lt;br&gt;&lt;br&gt;Zeile 08: *--*++cpp+3&lt;br&gt;Hier muß man ganz genau die Regeln befolgen, welche Operatoren der Compiler zuerst auswertet. Mit meinen eingesetzten Klammern wird es hoffentlich klarer:&lt;br&gt;&lt;br&gt;printf("%s\n", (*(--(*(++cpp))))+3);&lt;br&gt;&lt;br&gt;Trotzdem ist das noch immer sehr hart aufzulösen:&lt;br&gt;++cpp: Addresse zeigte zuerst auf die Adresse von&amp;nbsp;&amp;nbsp;"POINT", wird um eins erhöht und zeigt damit auf die Adresse von "NEW". &lt;br&gt;Das ganze ein bisserl aufgeschlüsselt:&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; cpp = cpp + 1;&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("%s\n", **cpp);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // zeigt nun auf "NEW"&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("%s\n", *--*cpp);&amp;nbsp;&amp;nbsp;// decrementiere den pointer der bis jetzt auf "NEW"&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // gezeigt hat.&lt;br&gt;&lt;br&gt;Das war die große Schweinerei in dieser Zeile. Da --*cpp nun einen Eintrag im cp Array verändert hat! Folgende Zeilen dokumentieren das:&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("0 %s\n", *cp[0]);&amp;nbsp;&amp;nbsp;// -&gt; FIRST&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("1 %s\n", *cp[1]);&amp;nbsp;&amp;nbsp;// -&gt; POINT&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("2 %s\n", *cp[2]);&amp;nbsp;&amp;nbsp;// -&gt; ENTER (nicht mehr NEW)&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("3 %s\n", *cp[3]);&amp;nbsp;&amp;nbsp;// -&gt; ENTER&lt;br&gt;&lt;br&gt;&lt;br&gt;Also der dritte Eintrag im cp Array wurde decrementiert. Vorher hat der Pointer auf den 2. Eintrag im c Array gezeigt (auf "NEW"), nun zeigt er durch das "--" auf den ersten (auf "ENTER")&lt;br&gt;&lt;br&gt;Das letzte * und +3 dereferenziert nun den Doppelpointer (man erhält also dadurch den char*) und mit dem +3 gibt er den String nun ab dem 4. Zeichen aus. Also steht nun statt "ENTER", ein "ER" am Bildschirm.&lt;br&gt;&lt;br&gt;&lt;br&gt;Zeile 09: *cpp[-2]+3&lt;br&gt;cpp zeigt nach der letzten Zeile 08 noch immer&amp;nbsp;&amp;nbsp;auf den 3. cp Eintrag ( = cp[2]), in dem nach der letzten Operation die Adresse von "ENTER" gespeichert ist.&lt;br&gt;cpp[-2] zeigt nun auf den ersten Eintrag (= cp[0]), also der Adresse von "FIRST".&lt;br&gt;* und +3 geben also nun alle Zeichen von "FIRST" ab dem 4. Zeichen aus. Die Ausgabe ist "ST".&lt;br&gt;&lt;br&gt;&lt;br&gt;Zeile 10: cpp[-1][-1]+1&lt;br&gt;cpp wurde in der letzten Operation nicht verändert, zeigt also noch immer auf den 3 Eintrag (= cp[2],&amp;nbsp;&amp;nbsp;somit "ENTER"). cpp[-1] indiziert den Eintrag vor "ENTER", also die Adresse von "POINT"). Das erste [-1] bezieht also auf das cp Array. Da zweite&amp;nbsp;&amp;nbsp;[-1] bezieht sich nun aber auf das c Array, von der Position von "POINT" aus. "POINT" ist der 3. Eintrag im c Array, -1 darauf angewandt indiziert den "NEW" string. Also den Eintrag vor "POINT" im c Array. Das +1 sagt nun einfach das ab dem 2.Zeichen im "NEW" string ausgegeben werden soll, also "EW".&lt;br&gt;&lt;br&gt;&lt;br&gt;Aber eine Frage hätte ich? Wer stellt solche Aufgaben?&lt;br&gt;&lt;br&gt;mfg Switi&lt;br/&gt;</description>
      <pubDate>Sun, 30 Nov 2003 14:00:51 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1177987.html#1177987</guid>
      <dc:creator>Switi</dc:creator>
      <dc:date>2003-11-30T14:00:51Z</dc:date>
    </item>
    <item>
      <title>Re(7): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175406.html#1175406</link>
      <description>Ich glaub ich weiß jetzt, warum ich eine Ausgabe bekomme und ihr nicht,&lt;br&gt;habe euch nämlich zwei Anweisungen unterschlagen, diese gehören vor die erste printf Anweisung von oben:&lt;br&gt;&lt;br&gt;printf("%s\n", **++cpp);&lt;br&gt;printf("%s\n", *--*++cpp+3);&lt;br&gt;&lt;br&gt;&lt;br&gt;Falls ich diese zwei weg tue, bekomm ich auch eine Exception!&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 21:09:40 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175406.html#1175406</guid>
      <dc:creator>Edi</dc:creator>
      <dc:date>2003-11-28T21:09:40Z</dc:date>
    </item>
    <item>
      <title>Re(6): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175400.html#1175400</link>
      <description>Ich hab es ebenfalls unter MSVC 6.0 unter WinXP laufen und es gibt mir nicht mal eine Warnung aus.&lt;br&gt;&lt;br&gt;Ich dachte mir ja eigentlich auch, dass es keine richtige Lösung für dieses Bsp geben kann, nur wundert es mich etwas, dass sie uns gleich zwei dieser nicht funktionierenden Anweisungen nacheinander gegeben haben, war wohl ein Leger!&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 21:01:56 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175400.html#1175400</guid>
      <dc:creator>Edi</dc:creator>
      <dc:date>2003-11-28T21:01:56Z</dc:date>
    </item>
    <item>
      <title>Re(5): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175375.html#1175375</link>
      <description>Also MSVC 6.0 gibt bei mir auch eine Unhandled Exception.&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 20:41:30 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175375.html#1175375</guid>
      <dc:creator>Taggy</dc:creator>
      <dc:date>2003-11-28T20:41:30Z</dc:date>
    </item>
    <item>
      <title>Re(5): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175275.html#1175275</link>
      <description>hast schonmal einen anderen compiler probiert ?&lt;br&gt;&lt;br&gt;wenn ichs durchs Visual Studio 2003 jage dann erhalte ich eine Unhandled Exception beim ersten printf ... &lt;br&gt;&lt;br&gt;es mag schon sein, dass das mit einem compiler der zugriffe auf nicht - eigenen Speicher nicht überprüft funktioniert ... &lt;br&gt;&lt;br&gt;Im Endeffekt hat das ganze mit Zeigerarithmethik zu tun .. es hängt also davon ab wo was im speicher steht ...&lt;br&gt;&lt;br&gt;&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 19:22:53 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175275.html#1175275</guid>
      <dc:creator>Somnatic</dc:creator>
      <dc:date>2003-11-28T19:22:53Z</dc:date>
    </item>
    <item>
      <title>Re(4): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175247.html#1175247</link>
      <description>Hat damit nichts zu tun, habs schon mehrmals kompiliert und neu gestartet, steht jedes mal genau das selbe drinnen, wäre schon ein großer Zufall, wenn es nur Müll aus dem Speicher wäre!&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 19:04:58 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175247.html#1175247</guid>
      <dc:creator>Edi</dc:creator>
      <dc:date>2003-11-28T19:04:58Z</dc:date>
    </item>
    <item>
      <title>Re(3): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175236.html#1175236</link>
      <description>Im Speicher steht halt immer viel Blödsinn drinnen, wenn du immer mit dem gleichen Compiler compilierst, wird wahrscheinlich immer dort das gleiche stehen, daher dieser Buchstabe!&lt;br&gt;&lt;br&gt;Mach mal vorher noch ein paar Speicherverinbarungen und guck obs derselbe Buchstabe ist!&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 18:57:56 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175236.html#1175236</guid>
      <dc:creator>thE</dc:creator>
      <dc:date>2003-11-28T18:57:56Z</dc:date>
    </item>
    <item>
      <title>Re(3): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175070.html#1175070</link>
      <description>Ich habe es ausprobiert - bei MSVC kracht es. Kommt auf den Compiler und das Betriebssystem an. Der Fehlzugriff impliziert einen Bereich von 2 * sizeof(cpp) bytes. Da kann es schon sein, dass manche Systeme nichts von diesem illegalen Zugriff mitbekommen. Darum ist ja C,C++ mit seiner Zeigeroperationen so teuflisch!&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 17:10:05 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175070.html#1175070</guid>
      <dc:creator>nergal</dc:creator>
      <dc:date>2003-11-28T17:10:05Z</dc:date>
    </item>
    <item>
      <title>Re(2): Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1175032.html#1175032</link>
      <description>Dachte am Anfang auch, dass es nicht funktioniert, dann hab ich es eingegeben und compiliert, siehe da es funktionierte! Darum auch meine Frage, wie es sowas geben kann...&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 16:38:22 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1175032.html#1175032</guid>
      <dc:creator>Edi</dc:creator>
      <dc:date>2003-11-28T16:38:22Z</dc:date>
    </item>
    <item>
      <title>Re: Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1174970.html#1174970</link>
      <description>So ganz kann das Programm nicht funktioniern! &lt;br&gt;Der Ausdruck *cpp[-2] ist ja schon illegal&lt;br&gt;cpp zeigt auf einen definierten Speicherbereich.&lt;br&gt;*cpp[-2]&amp;nbsp;&amp;nbsp;== *(cpp - 2)&lt;br&gt;(cpp - 2) ist ein nicht definierter Speicherbereich&lt;br&gt;Würde sagen da gibt es eine Speicherschutzverletzung!&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 15:57:26 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1174970.html#1174970</guid>
      <dc:creator>nergal</dc:creator>
      <dc:date>2003-11-28T15:57:26Z</dc:date>
    </item>
    <item>
      <title>Zeigerfrage an C++ Profis!!!</title>
      <link>http://forum.geizhals.at/t210668,1174455.html#1174455</link>
      <description>Habe folgendes Codestück gegeben und muss erklären wie es zu den Ausgaben kommt, leider steig ich da irgendwie total aus!&lt;br&gt;&lt;br&gt;char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};&lt;br&gt;char **cp[] = {c+3, c+2, c+1, c};&lt;br&gt;char ***cpp = cp;&lt;br&gt;&lt;br&gt;int main (void)&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("%s\n", *cpp[-2]+3);&lt;br&gt;&amp;nbsp;&amp;nbsp; printf("%s\n", cpp[-1][-1]+1);&lt;br&gt;&amp;nbsp;&amp;nbsp; return 0;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;br&gt;Ausgabe lautet:&lt;br&gt;ST&lt;br&gt;EW&lt;br&gt;&lt;br&gt;&lt;br&gt;Wie kommt diese Ausgabe zustande?&lt;br&gt;Was was passieert bei *cpp[-2]?&lt;br/&gt;</description>
      <pubDate>Fri, 28 Nov 2003 09:55:16 GMT</pubDate>
      <guid>http://forum.geizhals.at/t210668,1174455.html#1174455</guid>
      <dc:creator>Edi</dc:creator>
      <dc:date>2003-11-28T09:55:16Z</dc:date>
    </item>
  </channel>
</rss>
