Array / Zeiger "Dualismus"



  • Ich habe mal wieder eine (wie es scheint) triviale Frage:

    Was genau ist der Unterschied zwischen einem Zeiger und einem Array?

    Ich habe nämlich das Problem, dass ich nich5t weiß, inwieweit Arrays von Zeigern und Arrays von Arrays (auch zwei oder mehrdiensionale Arrays genannt) kompatibel sind.

    Dazu folgender Code:

    int var1[5][5];
    int *var2[5];
    int **var3;
    

    Welche der drei Variablen kan ich jetzt einenader zuweisen und wieso funktioniert das oder wieso nicht??
    Irgendwie dachte ich, ichhätte es verstanden, aber als ich intensiv adrüber nachdachte (was imer gefährlich ist) habe ich geerkt, dass ich das ganze doch nicht wirklich verstanden habe.

    Danach entsteht noch die Frage, wie das ganze geht, wenn man Arrays mit noch mehr Dimensionen nimmt, z.B:

    int var5[5][5][5];
    int *var6[5][5];
    int **var7[5];
    int ***var8;
    

    Schonmmal Danke

    Felix





  • Es gibt eigentlich nur 2 Sachen, die man wissen muss.
    1. Arrays und Zeiger sind zwei völlig verschiedene Dinge.
    2. Ein Ausdruck vom Typ 'T[N]' wird bei jeder sich bietenden Gelegenheit (alles ausser sizeof, AFAIK) in einen Rvalue-Ausdruck vom Typ 'T*' umgewandelt, wobei der Wert gleich der Adresse des ersten Elements des Arrays ist.

    Wenn man sich das mal durch den Kopf gehen läßt und die Implikationen durchdenkt, müsste das meiste klar werden.



  • Der Unterschied ist schon mal der:

    wenn du ein Array definierst, dann wird gleich Speicher reserviert (in Höhe der Größe des Arrays), bei einem Zeiger (egal in wie vielen Dimensionen) nicht!
    Das bedeutet, nachher macht es (zumindest für den Computer) keinen Unterschied mehr, ob eine Variable als Array oder als Zeiger definiert wurde, da sie einfach in Form eines Zeigers vorliegt. Ob nun der Speicher, auf den sie zeigt, reserviert wurde (z.B. als Array, oder dynamisch) oder nicht...



  • Das ist falsch. Es macht sehr wohl einen Unterschied. Die als Zeiger deklarierte Variable ist ein Zeiger-Lvalue, d.h. die Variable enthält eine Adresse. Die als Array deklarierte Variable enthält ein Array und keine Adresse, sie wird lediglich fast überall sofort in ein Zeiger-Rvalue umgewandelt.



  • Natürlich haste recht... 🙂
    aber jemand, der wissen will, "inwieweit Arrays von Zeigern und Arrays von Arrays kompatibel sind", für den macht es nicht wirklich einen Unterschied, nehme ich an (er wird wohl eher RValues benutzen).



  • Die Frage war "Was genau ist der Unterschied zwischen einem Zeiger und einem Array?" Bei so einer Frage würde ich nicht erwarten, dass er sich mit einer einfachen und falschen Antwort abspeisen läßt.

    Beispiel:

    int a[10][10];
    int **p = a;
    

    Solchen oder ähnlichen Code hab ich hier schon öfters gesehen. Kannst du mit deinem Modell erklären, warum das nicht klappt?



  • Okay, ich gebe nach:

    Zeiger und Arrays sind grundlegend verschieden...

    Sorry 🙄 (diese C++-Typgenauigkeit... 🙄 )



  • Danke, besonders an Bashar 😃
    Ich habe das ganze jetzt so einigermaßen verstanden (Glaube ich jedenfalls)

    Also nochmal Danke

    Felix


Anmelden zum Antworten