Operatoren Priorität - Verständnis



  • Hey Leute!
    Ich hab eine ganz Simple kleine Frage , die mich trotz allem echt wahnsinnig macht :

    int *ptr_array[12]; 
    int (*array_ptr)[12];
    

    Ersteres erstellt ja ein Array aus Pointern , und zweiteres ein ptr auf int[12]. Aber warum? Eigentlich hat ja der Indexoperator eine höhere Prio und nach meinem Verständnis sollte es dann genau umgekehrt sein. Kann mir das mal einer genau erklären ?
    Und wenn er schon dabei ist , vielleicht auch noch wie das im Speicher aussieht mit den Pointern auf Funktionen mit bestimmten Parametern und Returntypen , odernist das nur Compilerspezifisch?



  • In diesem Kontext sind [] eben kein Indexoperator, das ist ein sog. Deklarator. Deklaratoren werden von innen nach außen geschrieben.

    int (*ptr) [42];
    

    Liest man daher als "Zeiger namens ptr auf ein Array aus 42 ints".



  • Gast___ schrieb:

    Hey Leute!
    Ich hab eine ganz Simple kleine Frage , die mich trotz allem echt wahnsinnig macht :

    int *ptr_array[12]; 
    int (*array_ptr)[12];
    

    Ersteres erstellt ja ein Array aus Pointern , und zweiteres ein ptr auf int[12]. Aber warum? Eigentlich hat ja der Indexoperator eine höhere Prio und nach meinem Verständnis sollte es dann genau umgekehrt sein. Kann mir das mal einer genau erklären ?

    Es ist genau so, weil der Indexoperator eine höhere Priorität hat. (Wie PI sagt, ist das zwar kein Indexoperator, aber die Regeln entsprechen soweit möglich denen der Ausdruckssyntax. Bei Dingen wie Referenzen oder Memberzeigern weicht die Ähnlichkeit natürlich ein bisschen auf.)

    Der erste Deklarator ist also explizit geklammert so: int *(ptr_array[12]); , und jetzt siehst du, dass der Index-Operator auf ptr_array angewendet wird, ptr_array muss also ein Array sein. Das Ergebnis von ptr_array[12] wird dann dereferenziert, also muss es ein Zeiger sein. Das Ergebnis davon wiederum ist, wie der Typ auf der linken Seite anzeigt int. Zusammengefasst: Array[12] von Zeigern auf int.


  • Mod

    Das Forum mag keine * in URLs, daher hier ein paar interessante Links zum selber Copy&Pasten:

    h[b][/b]ttp://cd[b][/b]ecl.ridic[b][/b]ulousfish.c[b][/b]om/?q=int+*ptr_array[12]
    h[b][/b]ttp://cd[b][/b]ecl.ridiculou[b][/b]sfish.c[b][/b]om/?q=int+%28*array_ptr%29[12]
    

    Es beantwortet zwar nicht die gestellte Frage, dafür aber sicherlich so manche zukünftige Frage 😉 .


Anmelden zum Antworten