Fragen zu Pointern



  • Hi!

    Das Thema Pointer lässt noch einige Fragen offen. Ich hoffe Ihr könnt mir etwas Helfen damit ich das endlich richtig verstehe 😃

    Ich habe folgende Methoden:

    void printArr(int* a, int length);
    
    int* par;
    int ar [] = {1,2,3,4,5};
    
    par = ar;
    printArr(par, 5);
    

    Übergebe ich hier tatsächlich nur den Zeiger auf ar?
    wieso funktioniet nicht der Aufruf

    printArr(&ar, 5);
    

    vielen Dank schon mal im voraus



  • Hi,
    jain. Du übergibst an deine Funktion schon das Array. Aber es gibt bestimmte Situationen (nicht nur hier, auch wo anders), bei dem ein Array automatisch in einen Zeiger auf das erste Element des Arrays verfällt. Nennt sich array-to-pointer-decay. In deinem Beispiel ist das sogar 2x passiert. Bei der Übergabe des Arrays an deine Funktion, und hier

    par = ar;
    

    Würdest du hier kein array-to-pointer-decay wollen, hättest du

    par = &ar[0];
    

    schreiben müssen.

    printArr(&ar, 5);
    

    Hier übergibst du die Adresse eines "int-Arrays mit 5 Elementen". Der passende Zeiger dazu ist

    int (*p)[5];
    // Also
    int (*p)[5] = &ar;
    

    Du musst also unterscheiden zwischen einem Zeiger auf das erste Element eines Arrays und einem Zeiger auf das ganze Array.



  • Danke für die Antwort!

    Ich finde es trotzdem noch ziemlich verwirrend.

    par = ar; // par zeigt auf das erste Element in ar, array to pointer decay
    par = &ar[0]; // wie oben, ohne array to pointer decay
    

    stimmt das?

    Wieso wird

    int (*p)[5]
    

    in Klammern gesetzt? Leerzeichen spielen ja in diesem Fall keine Rolle aber

    datentyp * var
    

    definiert einen Zeiger während

    *var
    

    der Dereferenzierung dient. Wozu also die Klammerung um *p? Irgendeine Konvention?



  • gescom schrieb:

    par = ar; // par zeigt auf das erste Element in ar, array to pointer decay
    par = &ar[0]; // wie oben, ohne array to pointer decay
    

    stimmt das?

    Richtig.

    gescom schrieb:

    Wieso wird

    int (*p)[5]
    

    in Klammern gesetzt? Leerzeichen spielen ja in diesem Fall keine Rolle aber

    datentyp * var
    

    definiert einen Zeiger während

    *var
    

    der Dereferenzierung dient. Wozu also die Klammerung um *p? Irgendeine Konvention?

    Hmm wie soll ich das erklären. Es gibt Regeln, wie man eine Deklaration ließt.

    int (*p)[5];
    
    1. Ausgehend vom Variablennamen musst du erst nach links gehen, weil nach p eine normale Klammer zu kommt. Und links vom p steht ein * . ➡ Man ließt also "p ist ein Zeiger"

    2. Dann gehst du nach rechts und triffst auf []. Das Symbol für ein Array ➡ Man ließt also "p ist ein Zeiger auf ein Array"

    3. Jetzt bleibt nur noch das links von der normalen Klammer auf , also int. ➡ Man ließt also "p ist ein Zeiger auf ein int-Array". Du kannst noch die 5 mit einbeziehen ➡ "p ist ein Zeiger auf ein Array mit 5 int"

    Wenn du jetzt aber diese Deklaration hast:

    int *p[5];
    

    1. Nun kommt nach p keine normale Klammer zu , sondern gleich []. ➡ Man ließt also "p ist ein Array"

    2. Jetzt bleibt nur noch das links vom Variablennamen, also int* (ein int-Zeiger). ➡ "p ist ein Array mit 5 int-Zeigern.

    Oben hast du also ein Zeiger auf ein Array definiert. Unten hast du ein Array bestehend aus 5 Zeigern definiert.


Anmelden zum Antworten