*ptr->x



  • Hallo,
    ich bin anfänger und hab neulich folgenden konstrukt gesehn.
    kann mir jemand sagen was dieser genau macht?
    danke



  • ptr ist ein Pointer auf einen Struct
    Durch -> wird auf ein Element des Struct zugegriffen
    Dieses Element ist wieder ein Pointer
    Durch * wird auf den Wert des Pointers zugegriffen



  • Toniii schrieb:

    ptr ist ein Pointer auf einen Struct
    Durch -> wird auf ein Element des Struct zugegriffen
    Dieses Element ist wieder ein Pointer
    Durch * wird auf den Wert des Pointers zugegriffen

    die letzten beiden zeilen sind falsch.
    das darüber stimmt.
    😉



  • vista schrieb:

    die letzten beiden zeilen sind falsch.
    das darüber stimmt.
    😉

    Dann korrigiere sie doch. IMO sind sie nicht falsch, höchstens ungenau.



  • Bashar schrieb:

    vista schrieb:

    die letzten beiden zeilen sind falsch.
    das darüber stimmt.
    😉

    Dann korrigiere sie doch. IMO sind sie nicht falsch, höchstens ungenau.

    oh, sorry, nur die letzte ist falsch, hab das '*' übersehen.
    die letzte zeile müsste heissen: 'Durch * wird auf das Element zugegriffen, auf das der Pointer zeigt'
    🙂



  • Oder es findet eine Multiplikation statt 😃


  • Mod

    vista schrieb:

    die letzte zeile müsste heissen: 'Durch * wird auf das Element zugegriffen, auf das der Pointer zeigt'

    Jetzt ist es definitiv falsch. * bedeutet tatsächlich einen Zugriff auf den Pointer - das Ergebnis dieser Operation verweist erst auf das Element. Ob dagegen ein Zugriff auf das Element stattfindet, hängt vom Kontext ab, in dem dieser Ausdruck steht. Natürlich wäre günstig, hier den Begriff "Zugriff" erst einmal präzise zu definieren.



  • camper schrieb:

    vista schrieb:

    die letzte zeile müsste heissen: 'Durch * wird auf das Element zugegriffen, auf das der Pointer zeigt'

    Jetzt ist es definitiv falsch. * bedeutet tatsächlich einen Zugriff auf den Pointer - das Ergebnis dieser Operation verweist erst auf das Element.

    mal angenommen es wäre sowas:

    struct s
    {
      int *x;
    } *ptr;
    

    dann ist das ein zugriff auf den pointer x:

    ptr->x = irgendwas:
    

    und das ein zugriff auf das, worauf pointer x zeigt.

    *ptr->x = nochwas;
    

    🙂


  • Mod

    vista schrieb:

    und das ein zugriff auf das, worauf pointer x zeigt.

    *ptr->x = nochwas;
    

    🙂

    genau. Allerdings ging es eben nur um den Subausdruck *ptr->x . Und der allein bewirkt eben noch keinen solchen Zugriff. Das geschieht erst durch die Zuweisung, die du hier dazugedacht hast.



  • camper schrieb:

    Allerdings ging es eben nur um den Subausdruck *ptr->x . Und der allein bewirkt eben noch keinen solchen Zugriff. Das geschieht erst durch die Zuweisung, die du hier dazugedacht hast.

    so gesehen hast du natürlich recht.
    also geben wir dem OP die einig richtige antwort auf seine frage:

    ich bin anfänger und hab neulich folgenden konstrukt gesehn.
    kann mir jemand sagen was dieser genau macht?

    dieses konstrukt macht nichts.
    ⚠ absolut *NICHTS* ⚠
    ob ihm damit wohl geholfen ist?



  • @ Vista

    So alleine steht das Konstrukt aber auch noch nicht... machen wirs doch richtig 😉

    struct s
    {
      int *x;
    };
    
    int main ()
    {
      struct s *mys = malloc(sizeof(struct s));
    }
    

    Und nun gibt es eigentlich 2 Möglichkeiten auf den Wert auf den der Pointer x zeigt zuzugreifen

    1) *mys->x
    2) *((*mys).x)
    

    In welchem Zusammenhang allerdings so ein Konstruktwirrwarr Anwendung finden soll 😉 naja


  • Mod

    vista schrieb:

    camper schrieb:

    Allerdings ging es eben nur um den Subausdruck *ptr->x . Und der allein bewirkt eben noch keinen solchen Zugriff. Das geschieht erst durch die Zuweisung, die du hier dazugedacht hast.

    so gesehen hast du natürlich recht.
    also geben wir dem OP die einig richtige antwort auf seine frage:

    ich bin anfänger und hab neulich folgenden konstrukt gesehn.
    kann mir jemand sagen was dieser genau macht?

    dieses konstrukt macht nichts.
    ⚠ absolut *NICHTS* ⚠
    ob ihm damit wohl geholfen ist?

    Das ist auch nicht korrekt. Die Lesezugriffe auf ptr und x finden auf jeden Fall statt (soweit sie beobachtbar sind - volatile) - und wenn einer davon ungültig ist, darf die Festplatte formatiert werden 🙂



  • camper schrieb:

    (soweit sie beobachtbar sind - volatile)

    jetzt hast du aber angenommen, dass da ein 'volatile' steht.

    struct s
       {
         int *x;
       } volatile *ptr;
    
       *ptr->x;
    

    dann wird natürlich erstmal das 'ptr->x' ausgeführt.
    aber man soll ja keine annahmen machen, oder?


Anmelden zum Antworten