Zeiger-Adressen Subtraktion



  • Die Aufgabestellung hört sich für mich nach sowas an:

    int* a = 0;
    char* addresse_vorher = (char*)a;
    a++;
    char* addresse_nachher = (char*)a;
    int differenz = addresse_nachher - addresse_vorher;
    

    Dabei macht man sich zunutze, dass die Zeiger-Arithmetik auch funktioniert, wenn der Zeiger auf nix vernünftiges (hier 0) zeigt. Man sagt dem Computer, der Zeiger soll auf den nächsten int zeigen, deshalb wird die Adresse um so-und-so-viel erhöht. Die Differenz sollte dann die Größe deines Datentyps in Bytes sein 🙂



  • Schlau schlau, wieder was gelernt :xmas1:

    MfG



  • Definiere ein Array des Datentypes und rechne i.e. &...[1] - &...[0].



  • Super Badestrand!

    Funktioniert mit allen Datentypen hervorragend!

    Vielen Dank 🙂

    Hab leider nur dein Code noch net so ganz verstanden 😞 !

    Lg RaptorX



  • Also bei der Idee mit dem Array erhalte ich den Wert 1. Scheint also nicht zu gehen! 😉

    int array[2];
        int ergebnis;
        ergebnis=&array[1]-&array[0];
        printf("Ergebnis:%i",ergebnis);
    

    Lg RaptorX



  • RaptorX schrieb:

    Also bei der Idee mit dem Array erhalte ich den Wert 1. Scheint also nicht zu gehen! 😉

    Die Idee besteht darin, die Adressen nach char* zu casten:

    int array[2];
        int ergebnis;
        ergebnis=static_cast<char*>(&array[1])-static_cast<char*>(&array[0]);
        printf("Ergebnis:%i",ergebnis);
    


  • Oke sorry Bashar!

    Aber soweit ist unser Wissensstand noch net! 👎

    Habs jetzt nach der Methode von Badestrand gelöst. 😃

    BELIEBIGER_DATENTYP* a = 0;
    char* addresse_vorher = (char*)a;
    a++;
    char* addresse_nachher = (char*)a;
    ergebnis = addresse_nachher - addresse_vorher;
    

    Lg RaptorX



  • Habs jetzt nach der Methode von Badestrand gelöst. 😃

    Die Methode von Badestrand stinkt – sorry – weil er C-Style-Casts verwendet. Das ist pfui und das macht man nicht.

    Also, statt (char*)a schreibt man in diesem Fall reinterpret_cast<char*>(a) . Das ist schön sperrig und gibt ein visuelles Warnsignal ab. Solche Casts sind nämlich immer mit Vorsicht zu genießen.



  • Habs geändert! Geht ebenfalls bestens 🙂

    Sry aber mit den casts hab ich noch keine Ahung! Erst Semester halt ;)! 😃



  • Randfrage: Was für ein Problem hast du mit sizeof()?

    Btw, deine erste Lösung war undefiniert - Zeiger-Arithmetik liefert nur dann etwas vernünftiges, wenn die beteilitgten Zeiger alle im selben Array unterwegs sind.



  • CStoll schrieb:

    Randfrage: Was für ein Problem hast du mit sizeof()?

    RaptorX schrieb:

    Folgende Aufgabe gilt es zu lösen:
    Größe eines Datentypes mittels Adressen zu berechnen!

    :xmas1:



  • So ist es, auch wenns kein Sinn macht man durfte sizeof() nicht verwenden 😉

    Lg RaptorX

    :xmas1:

    Ich danke euch allen nochmal für die Hilfe!


Anmelden zum Antworten