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