Habe wieder ein Zeigerproblem
-
Hallo,
hab ja in ein paar Threads davor auch über Zeiger gesprochen. Find irgendwie, dass es das Schwierigste an C++ ist. In Java musste ich mich nie um sowas kümmern :p . Naja was solls.
Ich sollte ein Programm schreiben, welches eine Zeichenkette einliest und von jedem Buchstaben der Zeichenkette die Adresse ausgibt. So steht es in der Musterlösung:
// Wort einlesen und die Adressen jeder einzelnen Buchstaben ausgeben #include <iostream> #include <string> using namespace std; int main(){ string eingabe; cout << "\nBitte geben Sie eine Zeichenkette ein: "; cin >> eingabe; //Länge des Strings messen; int laenge = eingabe.length(); cout << "\n\n\t" << eingabe << endl; cout << "\tLaenge: " << laenge << endl; for(int i = 0; i < laenge; i++){ cout << "\n" << i+1 << "ter Buchstabe: " << eingabe.at(i) << "\tAdresse: " << int(&(eingabe.at(i))); } cout << endl; return 0; }Warum muss ich denn in Zeile 11 die Adresse in einen int casten? at() liefert doch ein character zurück und mit dem &-Operator ermittle ich die Adresse. Ich habs ohne den Cast gemacht und kam auf folgende Ausgabe
Bitte geben Sie eine Zeichenkette ein: Memory Memory Laenge: 6 1ter Buchstabe: M Adresse: Memory 2ter Buchstabe: e Adresse: emory 3ter Buchstabe: m Adresse: mory 4ter Buchstabe: o Adresse: ory 5ter Buchstabe: r Adresse: ry 6ter Buchstabe: y Adresse: yEs werden mir keine Adressen ausgeliefert, sondern die Zeichen ab i...Warum das alles? Ich verstehe den Grund für das Casten nicht...:(
-
abcdefg
Laenge: 71ter Buchstabe: a Adresse: 134554692
2ter Buchstabe: b Adresse: 134554693
3ter Buchstabe: c Adresse: 134554694
4ter Buchstabe: d Adresse: 134554695
5ter Buchstabe: e Adresse: 134554696
6ter Buchstabe: f Adresse: 134554697
7ter Buchstabe: g Adresse: 134554698
-
Wozu hast du das gepostet? Das beantwortet nicht meine Frage...
-
std::string::at() liefert einen char&, also ist &at() ein char*. Der op<<() ist aber für char* überladen und interpretiert diesen als C-String.
Mit:
std::cout << reinterpret_cast<void *>(&eingabe.at(i)) ...müsste es gehen.
Übrigens finde ich op[] eleganter:
std::cout << reinterpret_cast<void *>(&eingabe[i]) ...aber das ist wohl Geschmacksache...
Stefan.
-
Hallo, DStefan.
Ich verstehe deine Erklärung nicht ganz. Ich hatte auch kein C. Ich bin von Java direkt auf C++ umgestiegen (bzw. musste), von daher kenne ich mich mit den Eigenarten von C nicht aus. Könntest du es vllt nochmal deutlicher erklären?
EDIT: Ich hab mal schnell in nem C-Tutorial nachgelesen und habs glaub ich verstanden.
Mein
eingabe.at(i)liefert einen character. Mithilfe von
&(eingabe.at(i))will ich ja wie gefragt die Adresse ermitteln. Aber da der cout << - Operator für Adressen von charactern überladen sind, geben sie nicht die Adresse aus, sondern das Zeichen, welches sich dahinter verbirgt. Also muss ich es zu einer Zahl (also int) casten oder dieses "reinterpret_cast" benutzen, womit "Zeiger in Datentypen (und umgekehrt) „uminterpretiert“ werden" (Zitat: http://de.wikibooks.org/wiki/C%2B%2B-Programmierung:_Operatoren#reinterpret_cast). Hab ichs richtig verstanden? Kannst du es mir bestätigen oder mich evtl. korrigieren?
-
Ok,
ich glaubs ich habs wirklich kapiert. Es stimmt, so wie du es gesagt hast. Er interpretiert es als String, deshalb muss man ihn casten. Es geht auch übrigens so:
reinterpret_cast<int>Dann wird aber die Adresse halt in dezimaler Schreibweise angezeigt und nicht hexadezimal.
Vielen Dank für deine Hilfe
![:] 🙂](https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso)
-
lil_pingu schrieb:
Es geht auch übrigens so:
reinterpret_cast<int>Das ist nicht portabel. Auf einem 64bit System wird das höchstwahrscheinlich nicht kompilieren, weil du einen Zeiger (eventuell 64bit) nicht verlustfrei zu einem int (eventuell 32bit) konvertieren kannst. Nimm am besten static_cast<void const*>
Gruß,
SP
-
Sebastian Pizer schrieb:
lil_pingu schrieb:
Es geht auch übrigens so:
reinterpret_cast<int>Das ist nicht portabel. Auf einem 64bit System wird das höchstwahrscheinlich nicht kompilieren, weil du einen Zeiger (eventuell 64bit) nicht verlustfrei zu einem int (eventuell 32bit) konvertieren kannst. Nimm am besten static_cast<void const*>
Gruß,
SPNaja ... auf einem 64Bit-System wird doch ein int wahrscheinlich auch 64 Bit breit sein. Denn int ist ja derjenige Integer-Typ, der für das System am "natürlichsten" ist. Oder irre ich mich?
Stefan.