C - Zeigerarithmetik Struktur



  • Hallo,

    ich habe einen zeiger ( über malloc ) auf dem ein eigene struktur abgelegt habe die ungefähr so ausschaut

    { { double , double } , { int , int , int } }

    von dieser Sttruktur habe ich also mehrere (ab beginn es zeigers ) auf dem Speicher liegen.

    Was mir aktuell gelingt ist über

    for ( i ; i< ; i ++)

    • ( zeiger + i )

    über den Speicher zu laufen und habe also zugriff auf die einzelnen Strukturen

    Mein Frage wäre ob es möglich ist über weitere Indizes j , k und * Operatoren weiter in die Struktur vorzudringen.

    was bekomme ich bspw. wenn ich * * ( zeiger + i ) mache.

    oder bekomme ich zugriff auf eine der beiden inneren Strukturen wenn ich (* (zeiger + i ) ) + j

    Vielen Dank,

    James


  • Mod

    Vielleicht. Vielleicht auch nicht. Kommt drauf an, wie deine inneren Dinge genau definiert sind. Aber auf jeden Fall nicht nur mit dem zeiger und ein paar Integers. Da wird irgendwo auch mal das Innere der Struktur angesprochen werden müssen. (Oder ganz dreckige Zeigercasts rausgeholt werden, aber das ist nicht zu empfehlen)

    Warum fragst du überhaupt? Du weißt schon, dass du einfach direkt so wie üblich auf deine Daten zugreifen kannst und gar keine Zeigerarithmetik brauchst? Gerade so etwas wie *(zeiger+i) ist ja einfach nur umständlich ohne jeden Vorteil.



  • @JamesNguyen sagte in C - Zeigerarithmetik Struktur:

    Was mir aktuell gelingt ist über
    for ( i ; i< ; i ++)

    • ( zeiger + i )

    Schreibe bitte in eine Zeile vor Deinem Code ``` und in eine Zeile nach Deinem Code ```. Alternativ klicke auf das </> in der Symbolleiste über dem Eingabefeld.
    Du kannst Deine Beiträge auch im Nachhinein bearbeiten. Den Menüpunkt "Bearbeiten" findest Du in dem Drei-Punke-Menü rechts unter Deinen Beiträgen.
    Danke.



  • @JamesNguyen sagte in C - Zeigerarithmetik Struktur:

    Mein Frage wäre ob es möglich ist über weitere Indizes j , k und * Operatoren weiter in die Struktur vorzudringen.

    Die einzige wirkliche Garantie die Du hast ist, daß der erste Member der struct die selbe Adresse hat wie die betreffende Instanz. Die Lage anderer Member können wegen für Allignment nötigem Padding anders sein als erwartet.

    @JamesNguyen sagte in C - Zeigerarithmetik Struktur:

    [...] weitere Indizes j , k [...]

    Du kannst deine Variablen nenn wie Du willst.



  • @JamesNguyen Was stört dich an dem -> Operator?

    Du kannst die mal das offsetof() aus der stddef.h ansehen.

    Aber Vorsicht, offsetof() gibt den Abstand in Bytes, während die Zeigerarithmetik mit sizeof(Zeigertyp)arbeitet.



  • Wenn du sowas hast:

    struct MeineDaten
    {
         double meinedouble[5];
         int meineint[5]
    };
    

    dann kannst du so alle double-Elemente durchlaufen und ausgeben:

    struct MeineDaten meinedaten[5];
    
    for(i = 0; i < 5; i++)
    {
         for(j = 0; j < 5; j++)
         {
              printf("%f\n", meinedaten[i].meinedouble[j]); //Array-Schreibweise
              printf("%f\n", *((*(meinedaten + i)).meinedouble + j)); //Zeiger-Schreibweise mit Dereferenzierungsoperator
              printf("%f\n", *((meinedaten + i)->meinedouble + j)); //Zeiger-Schreibweise mit Pfeiloperator (der richtige Name fällt mir grad nicht ein)
         }
    }
    

    Das funktioniert auch, wenn du meinedaten und meinedouble als Zeiger vorliegen hast.

    PS: Ich habs jetzt nicht getestet, d.h. vielleicht gibts Syntaxfehler o.Ä..


Log in to reply