Char Arrays
-
Hey Leute

ich habe mal (wieder) eine Frage:const char ∗ str1 = "Guten Morgen!\n";Ich verstehe diese Zeile nicht ganz. Warum steht dort const wenn ich den Text in str1 verändern kann
const char *str1 = "Guten Morgen!\n"; str1 = "Ich kann es veraendern.."; const char *str2=str1;Ich bitte um Hilfe...
-
Bei Zeigern kann der Zeiger konstant sein, oder du darfst den Pointee nicht verändern, oder beides.
Hier ist das Zweite der Fall: Du darfst das, auf das der Zeiger zeigt, nicht verändern (das resultiert in undefiniertem Verhalten) - auf was der Zeiger zeigt, das kannst du jedoch verändern. Es hängt davon ab, wo das
constbei der Deklaration steht.char const* // Pointee ist unveränderbar char* const // Zeiger ist unveränderbar char const* const // Beides // Du liest von Rechts nach Links: Zeiger auf konstantes char, konstanter Zeiger auf char, konstanter Zeiger auf konstantes charIn deinem Code-Beispiel weist du dem Zeiger, nicht aber dem Pointee etwas zu. Alles nicht erlaubte resultiert selbstverständlich in Gemecker vom Compiler.
-
Du hast den Text nicht geändert. Der Zeiger zeigt einfach auf ein anderes Literal, das alte gibt es an der alten Adresse immer noch unverändert.
-
Arcoth schrieb:
char const* // Pointee ist unveränderbar char* const // Zeiger ist unveränderbar char const* const // Beides // Du liest von Rechts nach Links: Zeiger auf konstantes char, konstanter Zeiger auf char, konstanter Zeiger auf konstantes charOkey danke das hilft mir schon sehr viel weiter

Aber das "const" bedeutet immernoch das dies eine Konstante ist, und nicht verändert werden kann?
-
Skeptar schrieb:
Aber das "const" bedeutet immernoch das dies eine Konstante ist, und nicht verändert werden kann?
Kommt auf "dies" an. Was unveränderbar ist, hat Arcoth ja geschrieben...
-
Nexus schrieb:
Skeptar schrieb:
Aber das "const" bedeutet immernoch das dies eine Konstante ist, und nicht verändert werden kann?
Kommt auf "dies" an. Was unveränderbar ist, hat Arcoth ja geschrieben...
Ups :|
Aber danke

-
Ich hätte da nochmal zwei Frage.
1. Was bedeuten eig. zwei**?
Z.B. in diesem Beispiel:int **pp = new int*[4]; // Array von Zeigern auf int-Zahlen pp[0] = p; // pp[0] zeigt auf *p pp[1] = &pa[2]; // pp[1] zeigt auf pa[2] (s.o.) cout << *pp[0] << endl; // 15 cout << **pp << endl; // 15 cout << *pp[1] << endl; // 452. Ist das richtig das ich das Thema mit den Zeigern noch nicht so richtig verstehen? (Bin seit 3 Tagen dabei)
Gruß
-
Skeptar schrieb:
Ich hätte da nochmal zwei Frage.
1. Was bedeuten eig. zwei**?
Z.B. in diesem Beispiel:int **pp = new int*[4]; // Array von Zeigern auf int-Zahlen pp[0] = p; // pp[0] zeigt auf *p pp[1] = &pa[2]; // pp[1] zeigt auf pa[2] (s.o.) cout << *pp[0] << endl; // 15 cout << **pp << endl; // 15 cout << *pp[1] << endl; // 45bei einer instanzendefinition ist das ein zeiger auf einen zeiger. bei der dereferenzierung ist das einfach die dereferenzierung des resultats einer dereferenzierung. frei übersetzt bedeutet das einfach dass der programmierer keine ahnung von c++ hat.
Skeptar schrieb:
2. Ist das richtig das ich das Thema mit den Zeigern noch nicht so richtig verstehen? (Bin seit 3 Tagen dabei)
kommt auf die definition von "richtig" an. in c++ braucht man selten zeiger. und manuelle speicherverwaltung braucht man so ziemlich gar nie.
-
asfdlol schrieb:
frei übersetzt bedeutet das einfach dass der programmierer keine ahnung von c++ hat.
Super Satz

Danke für die schnelle Antwort
-
Der Begriff Drei-Sterne-Programmierer ist in modernem C++ keine Auszeichnung, sondern eher eine Beleidigung. Nah, vllt nicht ganz, aber es ist auf jeden Fall kein Lob mehr.
Der einzige Grund heute noch mit Zeigern rumzumachen ist, wenn man eine alte C-Bibliothek benutzt (oder Kompatiblität halten will). Aber auch dann kann man STL-Container nutzen und über entsprechende Funktionen auf die Interna zugreifen (Bsp: Std::string::c_str). Manuelle Speicherverwaltung braucht man sowas von selten...
Vielleicht im Embedded Bereich(ok, geht halt oft nicht anders) oder wenn man einen Custom-Allocator schreibt(aber wer macht das schon?!).
Aber dann sollte man wissen, was man macht.