c-strings
-
Hallo!
Vorweg: Ich verwende da cout zum ausgeben. Da ich auch eigentlich in C++ programmiere, aber mein Thema sind nunmal C-Arrays und das ist C. Sollte auch nicht stören.
Ich hab mich heute ziemlich viel mit Zeigern auf char auseinandergesetzt ...
Naja und jetzt steh ich aufm Schlauch. Hier mein Beispielprogramm:#include <iostream> using namespace std; int main() { char *pointer = "Hallo!"; //zeiger auf char mit 7 elementen cout << pointer << "\n"; //gibt alle elemente aus cout << *pointer << "\n"; //zeiger auf das erste element, gibt das erste element aus *pointer++; //zeigt nun auf das zweite element cout << *pointer << "\n"; //gibt also das zweite element aus cout << pointer << "\n"; //<-- müsste nicht alles ausgegeben werden? gibt aber nur "allo!" aus? pointer++; //was passiert hier? cout << pointer; //jetzt wird "llo!" ausgegeben? hä? //*pointer = 1; //<-- Programmabsturz! auf das 1.te element zeigen? //cout << *pointer; //1. element ausgeben //anzahl elemente zählen unsigned int pos = 0; while(pointer[pos]) pos++; //solange '\0' nicht erreicht wurde pos um eins erhöhen cout << pos; //eigentlich 7? aber es wird 4 ausgegeben? }
Die Fragen stehen ja als Kommentare da. Ist der Inhalt der Kommentare richtig oder hab ich irgendwo schwere Denkfehler? Wenn ja, wie gehts richtig?
Danke schonmal
-
*pointer++; dereferenziert den Pointer und inkrementiert ihn danach
Das heißt es wird der Wert gelesen auf den Pointer zeigt und danach wird pointer = pointer + 1; Er zeigt also auf das nächste Element.
Darum wird nur "allo!" ausgegeben.pointer++ inkrementiert den Pointer s.o
Und eigentlich sind es 6 Zeichen Die 0 wird nicht mitgezählt). Da du aber schon auf das 2 zeigst, sind es nur noch 4: l,l,o und!
-
Also ersteinmal:
Wenn du in einem Programm ein Stringliteral deklarierst, wird es in einem Readonly Speicherbereich abgelegt. Um einen Schreibzugriff zu vermeiden, deklariert man am Besten solche Literale gleich konstant. Den Programmabsturz (Schreiben in einem Readonly-Bereich des Speichers) hätte der Compiler während der Kompilierzeit schon verhindert.const char *pointer = "Hallo!";
Immer, wenn du pointer inkrementierst (was auch jetzt noch möglich ist) zeigt dieser auf den jeweils nächsten Buchstaben.
Nicht überraschen sollte es, dass cout nun alles ab eben diesem Buchstaben bis zum ersten Auffinden von '\0' ausgibt.Ein Hinweis: Falls das Literal veränderbar sein soll, deklariere es einfach
char pointer[] = "Hallo!";
Eine Kopie der konstanten Zeichenkette liegt nun auf dem Stack und kann verändert werden.
-
Zeile 8:
Zeiger wird dereferenziert und um 1 erhöhtZeile 11:
macht das selbe wie in Zeile 8, ohne die ungenutzte DereferenzierungZeile 10:
Warum fängt der String mit dem zweiten Element an, nachdem du den Zeiger erhöht hast?Zeile 13:
Dein String liegt im Code-Speicher und ist damit unveränderlich. Wenn du ihn ändern willst Array oder new(malloc)