Zeigerfrage an C++ Profis!!!
Geizhals » Forum » Programmierung » Zeigerfrage an C++ Profis!!! (12 Beiträge, 215 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
........
Re(8): Zeigerfrage an C++ Profis!!!
30.11.2003, 15:00:51
01>  char *c[] = {"ENTER", "NEW", "POINT", "FIRST"};
02>  char **cp[] = {c+3, c+2, c+1, c};
03>  char ***cpp = cp;
04>
05>  int main (void)
06>  {
07>     printf("%s\n", **++cpp);
08>     printf("%s\n", *--*++cpp+3);
09>     printf("%s\n", *cpp[-2]+3);
10>     printf("%s\n", cpp[-1][-1]+1);
11>     return 0;
12>  }

Ausgabe lautet korrekt:
POINT
ER
ST
EW


Erklärung:

In der Zeile 01 wird ein Array von char Pointern angelegt und vorinitialisiert (*c[] identisch mit **c ist), wobei
c[0] = *c = "ENTER"
c[1] = *(c+1) = *c+1 = "NEW"
c[2] = *(c+2) = *c+2 = "POINT"
c[3] = *(c+3) = *c+3 = "FIRST"


Zeile 02:
cp ist ein array von Doppelpointern. Wird wie  folgend initialisiert:
cp[0] = Adresse von "FIRST" , zeigt also auf den 4. Eintrag des c Arrays
cp[1] = Adresse von "POINT", 3. Eintrag
cp[2] = Adresse von "NEW", 2. Eintrag
cp[3] = Adresse von "ENTER", 1. Eintrag
Jeder Eintrag in diesem Array entspricht einem "char**" Doppelpointer, also den Adressen von Pointern!


Zeile 03:
cpp ist nun ein 3 fach Pointer ist in dem Sinn der gleiche Typ wie cp!
Die Definition ***cpp ist identisch zu **cpp[]!!!
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"

Zeile 07:
Gib **++cpp aus:
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".
Nun wird der Pointer zweimal dereferenziert -> also mit ** kommt man zu dem char* und "POINT" wird am Bildschirm ausgegeben.


Zeile 08: *--*++cpp+3
Hier muß man ganz genau die Regeln befolgen, welche Operatoren der Compiler zuerst auswertet. Mit meinen eingesetzten Klammern wird es hoffentlich klarer:

printf("%s\n", (*(--(*(++cpp))))+3);

Trotzdem ist das noch immer sehr hart aufzulösen:
++cpp: Addresse zeigte zuerst auf die Adresse von  "POINT", wird um eins erhöht und zeigt damit auf die Adresse von "NEW".
Das ganze ein bisserl aufgeschlüsselt:

   cpp = cpp + 1;
   printf("%s\n", **cpp);     // zeigt nun auf "NEW"
   printf("%s\n", *--*cpp);  // decrementiere den pointer der bis jetzt auf "NEW"
                                     // gezeigt hat.

Das war die große Schweinerei in dieser Zeile. Da --*cpp nun einen Eintrag im cp Array verändert hat! Folgende Zeilen dokumentieren das:

   printf("0 %s\n", *cp[0]);  // -> FIRST
   printf("1 %s\n", *cp[1]);  // -> POINT
   printf("2 %s\n", *cp[2]);  // -> ENTER (nicht mehr NEW)
   printf("3 %s\n", *cp[3]);  // -> ENTER


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")

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.


Zeile 09: *cpp[-2]+3
cpp zeigt nach der letzten Zeile 08 noch immer  auf den 3. cp Eintrag ( = cp[2]), in dem nach der letzten Operation die Adresse von "ENTER" gespeichert ist.
cpp[-2] zeigt nun auf den ersten Eintrag (= cp[0]), also der Adresse von "FIRST".
* und +3 geben also nun alle Zeichen von "FIRST" ab dem 4. Zeichen aus. Die Ausgabe ist "ST".


Zeile 10: cpp[-1][-1]+1
cpp wurde in der letzten Operation nicht verändert, zeigt also noch immer auf den 3 Eintrag (= cp[2],  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  [-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".


Aber eine Frage hätte ich? Wer stellt solche Aufgaben?

mfg Switi
--
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung