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: y
    

    Es werden mir keine Adressen ausgeliefert, sondern die Zeichen ab i...Warum das alles? Ich verstehe den Grund für das Casten nicht...:(



  • http://codepad.org/u1zAa0B3

    abcdefg
    Laenge: 7

    1ter 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 🙂



  • 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ß,
    SP

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


Anmelden zum Antworten