Pointer in Structs



  • Hallo,
    in Anlehnung an den vorherigen Thread hier ein kleines Beispielprogramm mit Syntaxfehler:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct myTest { char *Name;  int *i };
    
    void Enter( const char *Name_, struct myTest *point_,  int *p );
    
    int main()
    {
      struct myTest *p_info;
      int s = 5;
      p_info = malloc(sizeof(struct myTest));
    
      Enter( "Mein Name" , p_info , &s );
      return 0;
    }
    
    void Enter ( const char *Name_,  struct myTest *point_ , int *p )
    {
      // Hier mach was
      point_->Name = Name_;
      point_->i = p;
    
      printf("Name: %s",point_->Name);
      printf("Int: %d",(*point_).(*i) );   // <= ZEILE MIT SYNTAXFEHLER
    
    }
    

    Wenn ich es versuche zu kompilieren, dann gibt es folgenden Fehler:

    C:\Temp\test\main.c:25: error: syntax error before '(' token
    :: === Build finished: 1 errors, 2 warnings ===

    Meine Frage an Euch:
    Bei Char-Pointern ist es ja einfach da ich den Dereferenzierungsoperator "*" nicht brauche um auf den Inhalt zuzugreifen. Bei Integerwerten sieht das ganze ja schon anders aus.

    Wie muss ich die Zeile mit Syntaxfehler schreiben, damit ich auf den Inhalt zugreifen kann, auf den i pointet zugreifen.

    Btw. ich weiss das "(*point_)." nur eine andere Schreibweise wie "point_->" ist, aber wie kann ich den "Pointer-Operator" nach dem "->" angeben?

    Gibts dazu eigentlich eine schöne Doku wenn was wo hin muss?

    Wäre super 🙂

    Danke 👍



  • printf("Int: %d", *point_->i );
    

    🙂



  • So gehts:

    printf("Int: %d", *(point_->i) );
    

    oder so:

    printf("Int: %d",*((*point_).i) );
    

    Wobei ersteres vorzuziehen ist. Mit ein bisschen Erfahrung erkennt man da sofort was gemeint ist beim zweiten müsste man zuerst mal überlegen, was wie dereferenziert wird.

    Gruß
    Don06



  • pale dog schrieb:

    printf("Int: %d", *point_->i );
    

    🙂

    Uuuiiii 😮 so einfach?
    Gibt es denn ne Regel/Faustregel, wenn man die () um den Dereferenzierungsoperator setzen muss und wenn man den "*" vor dem "Variablenkonstrukt" setzen kann/muss?

    Danke 😋



  • codefrag schrieb:

    Gibt es denn ne Regel/Faustregel, wenn man die () um den Dereferenzierungsoperator setzen muss und wenn man den "*" vor dem "Variablenkonstrukt" setzen kann/muss?

    guckst du: http://www.difranco.net/cop2220/op-prec.htm
    operatoren weiter oben haben vorrang vor den unteren.
    wenn man die reihenfolge ändern will, muss man klammern.
    🙂



  • pale dog schrieb:

    codefrag schrieb:

    Gibt es denn ne Regel/Faustregel, wenn man die () um den Dereferenzierungsoperator setzen muss und wenn man den "*" vor dem "Variablenkonstrukt" setzen kann/muss?

    guckst du: http://www.difranco.net/cop2220/op-prec.htm
    operatoren weiter oben haben vorrang vor den unteren.
    wenn man die reihenfolge ändern will, muss man klammern.
    🙂

    Alles klar ... das erklärt warum das man die () um das Konstrukt "(*point_)." benötigt. Denn laut Tabelle liegt ja "*" unter "."

    Aber wieso muss ich den Dereferenzierungsoperator "*" for den Konstrukt "point_->" schreiben und nicht hinter den -> mit ().

    Laut der Tabelle dürfte dann ja auch "*point_->i" nicht funktionieren... tut es aber... denn laut Tabelle müsste man es ja so schreiben "*(point_->i)".

    Verstehe ich die Tabelle nur falsch oder ? 🙄



  • codefrag schrieb:

    Verstehe ich die Tabelle nur falsch oder ? 🙄

    wahrscheinlich ja,
    -> steht an vierter stelle, * steht an zehnter, also ist -> vor * dran...
    🙂



  • pale dog schrieb:

    codefrag schrieb:

    Verstehe ich die Tabelle nur falsch oder ? 🙄

    wahrscheinlich ja,
    -> steht an vierter stelle, * steht an zehnter, also ist -> vor * dran...
    🙂

    Ahh args 🤡
    Alles klar... d.h. "->" referenziert zu erst auf i und dann kommt "*" als Pointer 😉

    So funktionierts... und deshalb ist es eigentlich genau das gleiche wie "(point_->i)"... aber da "->" vor "" ist braucht man in diesem Fall die "()" nicht.

    Endlich das Mysterium gelöst 😉 brauche das zwar nicht wirklich oft... aber jetzt isses klar 🙂

    Danke 👍


Anmelden zum Antworten