Nachtschatten09 Geschrieben 15. Februar 2009 Teilen Geschrieben 15. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Februar 2009 Teilen Geschrieben 16. Februar 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Nachtschatten09 Geschrieben 16. Februar 2009 Autor Teilen Geschrieben 16. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. Februar 2009 Teilen Geschrieben 16. Februar 2009 (bearbeitet) 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 2009 von TDM Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 16. Februar 2009 Teilen Geschrieben 16. Februar 2009 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... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Nachtschatten09 Geschrieben 16. Februar 2009 Autor Teilen Geschrieben 16. Februar 2009 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 16. Februar 2009 Teilen Geschrieben 16. Februar 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Wegginho Geschrieben 18. Februar 2009 Teilen Geschrieben 18. Februar 2009 Was wäre denn eine "elegante" Möglichkeit, das zu umgehen? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 18. Februar 2009 Teilen Geschrieben 18. Februar 2009 fgets Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Februar 2009 Teilen Geschrieben 18. Februar 2009 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.