Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben
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.
Geschrieben

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

Geschrieben (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 von TDM
Geschrieben

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

Geschrieben

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.

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...