Veröffentlicht 15. Februar 200916 j Hallo, ich bin gerade beim Thema Zeiger und mein C++ Buch löst nun in mir Verwirrung aus... Was macht der Computer wenn er folgende Zeile durchführt? char* b ="hallo"; ? Ich mein klar ich hab im Endeffekt nen char-array aber warum deklarier ich ihn wie ein zeiger? Heisst ja nicht b zeigt auf "hallo"... Ich hab immer gedacht ein Zeiger zeigt auf eine Speicheradresse eines Objektes... Ich könnte doch gleich : char b[]="hallo"; nutzen, da wäre keine solche Verwirrung. Und warum darf man bei c-strings einfach char* test[] = { "hallo", "welt" }; machen, ohne das ne Fehlermeldung erscheint? Und wie sagt man dazu? Deklaration eines Zeigers des Types char das auf "hallo" und "welt" zeigt oder wie?! wenn ich das selbe mit ints mach erhalte ich nen compilererror. Haben chars etwa ne Sonderberechtigung? Mir ist schon klar das arrays und zeiger eine gewisse Ähnlichkeit haben, allerdings hat sich diese bisher nur so gezeigt: int test[5]={1,2,3,4,5}; int* ptest=test; //ptest zeigt auf erstes Element von test[5], Kann mir bitte jemand auf die Sprünge helfen? Ich glaub ich kauf ein anderes Buch denn ohne Erklärung was da gemacht wird hilft das mir nicht weiter, ich brauch ja auch das Verständnis zu allem. Vielen Dank und Gruß nachtschatten
16. Februar 200916 j Was macht der Computer wenn er folgende Zeile durchführt? char* b ="hallo"; ?Diese Zeile deklariert einen char-Zeiger namens b, der auf das Literal "hallo" verweist. Ich mein klar ich hab im Endeffekt nen char-array aber warum deklarier ich ihn wie ein zeiger?Nein, du hast kein Array. b ist ein Zeiger. Heisst ja nicht b zeigt auf "hallo"...Doch, genau das heißt es Ich hab immer gedacht ein Zeiger zeigt auf eine Speicheradresse eines Objektes...Richtig. In diesem Fall zeigt der Zeiger auf die Adresse des Literals. Zeichenkettenliterale sind übrigens die einzigen Literale, deren Adresse man bestimmen kann. Ich könnte doch gleich : char b[]="hallo"; nutzen, da wäre keine solche Verwirrung. Das ist etwas völlig anderes. In diesem Fall wäre b ein Array von 6 char, mit dem Inhalt hallo\0. Der entscheidende Unterschied ist der, dass du den Inhalt hier verändern darfst. Bei einem Zeiger auf ein Literal darfst du das nicht. Und warum darf man bei c-strings einfach char* test[] = { "hallo", "welt" }; machen, ohne das ne Fehlermeldung erscheint? Und wie sagt man dazu? Deklaration eines Zeigers des Types char das auf "hallo" und "welt" zeigt oder wie?!Das ist einfach ein Array von 2 char-Zeigern. Der erste zeigt auf das Literal "hallo", der zweite auf das Literal "welt". wenn ich das selbe mit ints mach erhalte ich nen compilererror. Haben chars etwa ne Sonderberechtigung?Du hast da char-Zeiger, keine char. Mit int geht das wie gesagt nicht, weil du von int-Literalen keine Adresse ermitteln kannst.
16. Februar 200916 j Danke, hast es mir sehr verständlich erklärt, nur hab ich dazu noch eine Frage: Das ist etwas völlig anderes. In diesem Fall wäre b ein Array von 6 char, mit dem Inhalt hallo\0. Der entscheidende Unterschied ist der, dass du den Inhalt hier verändern darfst. Bei einem Zeiger auf ein Literal darfst du das nicht. Bei mir funktioniert es aber, also genau umgekehrt. Oder ist mit dürfen etwas anderes gemeint? thx Nachtschatten
16. Februar 200916 j Bei mir funktioniert es aber, also genau umgekehrt. Oder ist mit dürfen etwas anderes gemeint? char *lpStr = "abc"; lpStr = "def"; Geht. char acStr[] = "abc"; acStr = "def"; Geht nicht. error C2440: '=': 'const char [4]' kann nicht in 'char [4]' konvertiert werden [Edit] Des Weiteren hat acStr dann eine feste Größe. Char-Pointern kannst du nach der Deklaration einen beliebig langen Text zuweisen. Bearbeitet 16. Februar 200916 j von TDM
16. Februar 200916 j Nein, was Klotzkopp meinte ist das hier: char *p = "test"; p[2] = 'a'; [/PHP] Das geht nicht weil du das Stringliteral nicht verändern darfst. Mit p = "test2"; ändert man das Stringliteral ja nicht sondern lässt den Zeiger lediglich auf ein anderes zeigen...
16. Februar 200916 j char* test=new char[50]; char* test2=new char[50]; gets(test); for(i=0; i<(strlen(test)+1);i++) { test2[i]=test[strlen(test)-i]; } cout<<"Laenge von test2: "<<strlen(test2); //<--- 0?? ... Warum ist die Länge von test2, 0? Wenn ich mit gets einlese verändert sich die Länge. Auch wenn ich test2 ausgeben würde würde etwas ausgegeben werden, daher frag ich mich warum strlen 0 zurückgibt. Nachtschatten
16. Februar 200916 j Du drehst den String mitsamt der Terminierung um. Damit steht die Terminierung in test2 ganz vorn. Und damit hört der String dort auf. Ganz nebenbei, gets ist "böse", weil du keine Möglichkeit hast, zu verhindern, dass jemand mehr eingibt als in deinen Puffer passt. Ein klassisches Szenario für einen Pufferüberlauf.
18. Februar 200916 j Was wäre denn eine "elegante" Möglichkeit, das zu umgehen?Ich nehme einfach mal an, dass du dich auf das gets-Problem beziehst. Da hier ja offensichtlich C++ zum Einsatz kommt, würde ich die Streamklassen und std::getline benutzen. In C++ muss man eher selten mit rohem Speicher hantieren.
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.