Integer Array, Zugriff byte- und wordweise



  • Hallo Leute,
    ich hab diese Ausgangslage:

    int p[4];	
    
    p[0] = 5;
    p[1] = 0xF;
    p[2] = 0xFF;	
    p[3] = 0;
    int *ptr = &p[0];
    
    std::cout << *ptr << ";" << *(ptr+1) << std::endl;
    

    Wieso gibt er mir hier 5 und 15 aus?
    Sollte man nicht, da int, dies schreiben um diese Ausgabe zu erlangen:

    std::cout << *ptr << ";" << *(ptr+4) << std::endl;
    

    schönen Gruß



  • chaoslion schrieb:

    Hallo Leute,
    ich hab diese Ausgangslage:

    int p[4];	
    
    p[0] = 5;
    p[1] = 0xF;
    p[2] = 0xFF;	
    p[3] = 0;
    int *ptr = &p[0];
    
    std::cout << *ptr << ";" << *(ptr+1) << std::endl;
    

    Wieso gibt er mir hier 5 und 15 aus?
    Sollte man nicht, da int, dies schreiben um diese Ausgabe zu erlangen:

    std::cout << *ptr << ";" << *(ptr+4) << std::endl;
    

    schönen Gruß

    Bei der Pointer-Arithmetik gehst Du nicht in Byte-Schritten durch den Speicher, sondern die Schrittweite entspricht der Größe des Typs auf den der Zeiger zeigt. Bei int *i bedeutet also i+1 "ein int weiter" und nicht "ein Byte weiter".



  • Hallo,
    Wie sieht es aus, wenn ich doch byteweise durchgehen möchte? Pointer casten oder gibts ne andere Möglichkeit?



  • chaoslion schrieb:

    Wieso gibt er mir hier 5 und 15 aus?
    Sollte man nicht, da int, dies schreiben um diese Ausgabe zu erlangen:

    std::cout << *ptr << ";" << *(ptr+4) << std::endl;
    

    Wenn du einen Pointer auf T um eins erhöhst, wird er nicht um ein byte verschoben, sondern um ein Element, also um sizeof(T) bytes. Alles andere macht ja auch keinen Sinn, da er ja sonst mitten in das Objekt rein zeigen würde und man beim Dereferenzieren bestenfalls Murks, schlimmstenfalls Zugriffsfehler bekommt. Nebenbei hat das verschieben um sizeof(T) den Vorteil, dass man sich die ganze sizeof()-Rechnerei sparen kann. Grade der *(ptr+4) wäre sonst auch nicht portabel, da es Systeme gibt, bei denen sizeof(int) nicht 4 ist.



  • chaoslion schrieb:

    Wie sieht es aus, wenn ich doch byteweise durchgehen möchte?

    Dann siehts so aus als hättest du irgendwas sehr seltsames vor.

    chaoslion schrieb:

    Pointer casten oder gibts ne andere Möglichkeit?

    Nein, casten ist der richtige Weg für sowas. Und zwar bitte keinen C-Cast sondern ein reinterpret_cast auf unsigned char* oder sowas. Denn daran sieht man sofort "ich will hier was seltsames anstellen" 😉



  • chaoslion schrieb:

    Hallo,
    Wie sieht es aus, wenn ich doch byteweise durchgehen möchte? Pointer casten oder gibts ne andere Möglichkeit?

    Mit Pointer-Cast.
    Also z.B.

    unsigned char * ptr = reinterpret_cast<unsigned char*>(p);
    


  • Achte darauf, dass du aber nicht zu weit gehts beim Iterieren. Außerdem musst du die einzelnen Bytes in einen int (bzw unsigned int) casten, wenn du nicht den ASCII Code meinst.
    Ich habs hier mal kompiliert: http://ideone.com/J0UhA

    Allerdings finde ich das ziemlich hässlich (3 casts). Was hast du vor?


Anmelden zum Antworten