Zeichenketten, Zeiger



  • Hallo,

    ich kann in folgendem Programm teilweise nicht so richtig nachvollziehen wie die Ausgaben zustande kommen. Wäre super wenn ihr mir kurz erklären könntet was passiert.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char word[] = "missisippi", *p = word;      
        cout << *p << endl;                         // m 
        cout << *++p-3 << endl;                     // 102
        cout << *(p+8) << endl;                     // i
        p++;
        cout << *p << endl;                         // s
        p++;
        *(p+5) = '\0';
        cout << p << endl;                          // sisip
        p = word;
        cout << p << endl;                          // missisip
        char dummy;
        cin >> dummy;
        return 0;
    }
    


  • GR_Watto schrieb:

    Hallo,

    ich kann in folgendem Programm teilweise nicht so richtig nachvollziehen wie die Ausgaben zustande kommen. Wäre super wenn ihr mir kurz erklären könntet was passiert.

    #include <iostream>
    using namespace std;
    
    int main()
    {
        char word[] = "missisippi", *p = word;      
    // Du definierst ein char Array und initialisierst dieses mit "missisippi",
    // Du erstellst einen char pointer und laesst ihn auf word zeigen.
    
    // die Ausgaben:
        cout << *p << endl;                         // m 
    // der pointer (mit *) zeigt aber immer nur auf ein Zeichen: 
    // zunaechst das erste, daher "m"
    
        cout << *++p-3 << endl;                     // 102
    // der pointer wird eins weitergerueckt, dereferenziert (*) und vom Inhalt, 
    // nem char 3 abgezogen, dh 105 waere wohl 'i', und wenn man drei abzieht
    // wirds fuer die Rechnung automatisch (?) in ne Zahl/int umgewandelt und 
    // die bekommst Du raus: 102, (da nach ASCII dez 'i' : 105 waere)
    
        cout << *(p+8) << endl;                     // i
    // der pointer wurde ja oben schon eins weitergerueckt, nun gibst Du das 
    // Zeichen aus (*), welches sich 8 Stellen weiter hinten befindet, 
    // also das letzte 'i'
    
        p++;
    // nun wird er zum zweiten mal selber eins weiter geschoben
    
        cout << *p << endl;                         // s
    // daher ist der nun ausgegebene Buchstabe (per *) der dritte Buchstabe von 
    // Missisippi, also das erste 's'
    
        p++;
    // nochmal eins weiterruecken, er steht nun auf dem zweiten 's'
    
        *(p+5) = '\0';
    // fuenf Stellen weiter fuegst Du nun das "Array ist zu ende Zeichen" = '\0' 
    // ein, damit ersetzt Du das allerletzte 'p', das letzte i wird nun nich mehr
    // zum Array gerechnet. Damit setzt Du ein Zeichen, dh Du veraenderst auch word.
    
        cout << p << endl;                          // sisip
    // da Dein pointer p nun auf dem zweiten s steht (wie oben gesagt) und Du ohne
    // den * das ganze Wort ausgibst, was danach folgt, bis zum '\0' halt, 
    // bekommst Du hier "sisip
    
        p = word;
    // der pointer p wird neu initialisiert und zeigt daher wieder auf den Anfang
    
        cout << p << endl;                          // missisip
    // weil Du vorher per p ein '\0' gesetzt hast, sprich word veraendert hast, 
    // bekommst Du nun nich mehr missisippi sondern wegen dem gesetzten '\0' 
    // nur noch missisip. Du bekommst ein Wort, weil du eben ohne * den Inhalt des 
    // Arrays ausgibst und nich nur den Inhalt des Zeigers (das waere der Inhalt 
    // der Addresse des ersten Zeichens)
    
        char dummy;
        cin >> dummy;
    // um nich gleich das Fenster zu schliessen.
    
        return 0;
    //return
    }
    

    Hoffe es stimmt alles 🙂



  • Das nenn ich ne Bilderbuchantwort

    vielen Dank


Anmelden zum Antworten