[geklärt] Arrays als Parameter übergeben, aber nicht als Pointer



  • Hallo,

    normalerweise übergebe ich Arrays an Funktionen per Pointer:

    double function(double* myArray){ return myArray[1]; }
    

    durch einen copy&paste-Fehler hab ich folgenden Code bekommen, der auch läuft:

    double function(double myArray[]){ return myArray[1]; }
    

    Sogar das Originalarray ändert sich mit, wenn ich das Array in der Funktion ändere.

    Ist es normal, dass das läuft, oder liegt das an meinem Compiler (g++)?
    Falls, das normal ist, gibt es einen Unterschied zwischen den beiden Varianten?

    Viele Grüße,
    derda

    //edit: void in double geändert



  • Nein es ist nicht normal wenn du eine void-Funktion hast und in etwas 'returnst'^^! Oder täusch ich mich? 🙄



  • Entschuldige, das void war falsch. Dann ist der Rückgabewert eben double, ich habe es mal geändert.

    Die Rückgabe ist egal, mir geht es um die Funktionsparameter. Hier ein Beispiel ohne Rückgabewert:

    void function(double* myArray){ myArray[1] += 1.0; }
    
    void function(double myArray[]){ myArray[1] += 1.0; }
    


  • In Parameterlisten ist T* a und T a[] exakt identisch (wobei T irgendein Typ wie z.B. double ist), beides bezeichnet einen Zeiger auf T . Dieser Zeiger muss auch nicht in ein Array zeigen. Ich persönlich verwende die zweite Variante nie.



  • Ok, also liegt es wirklich daran, das Arrays im Prinzip Zeiger sind.

    Gibt es einen Nachteil der zweiten Variante? Ich habe bisher immer nur die erste gesehen.

    Ich finde das gar nicht schlecht. Man sieht sofort, dass die Funktion für ein Array gedacht ist und nicht für einen Pointer auf ein einzelnes double/Objekt/sonstwas.



  • Such mal hier im Forum nach "array to pointer decay"... dazu gibt es mehr wie genug Diskussionen.



  • derda schrieb:

    Ok, also liegt es wirklich daran, das Arrays im Prinzip Zeiger sind.

    Sind sie nicht. Aber Arrays können implizit zu Zeigern konvertiert werden (der angesprochene "array to pointer decay").

    derda schrieb:

    Gibt es einen Nachteil der zweiten Variante? Ich habe bisher immer nur die erste gesehen.

    Was verstehst du unter "exakt identisch"? Ist das etwa zu wenig Pleonasmus?

    derda schrieb:

    Ich finde das gar nicht schlecht. Man sieht sofort, dass die Funktion für ein Array gedacht ist und nicht für einen Pointer auf ein einzelnes double/Objekt/sonstwas.

    Ja, aber das kann auch irreführen, weil es sich eben nur in der Optik unterscheidet, und nicht in der Semantik. Du kannst geradeso gut einzelne Objekte übergeben, und niemand kann dich daran hindern.

    Ist etwa das gleiche wie bei Nullzeigern: Das Makro NULL bringt nicht mehr Sicherheit als das einfache Literal 0 , erweckt aber diesen Eindruck.



  • Nexus schrieb:

    Was verstehst du unter "exakt identisch"? Ist das etwa zu wenig Pleonasmus?

    Nicht so zynisch. Gerade weil es exakt das selbe macht, kann es ja gute Gründe dafür geben, dass Variante 1 wesentlich häufiger zu lesen ist.

    Nexus schrieb:

    Ja, aber das kann auch irreführen, weil es sich eben nur in der Optik unterscheidet, und nicht in der Semantik. Du kannst geradeso gut einzelne Objekte übergeben, und niemand kann dich daran hindern.

    Stimmt, das verhindert natürlich gar nichts, aber verdeutlicht, dass die Funktion für Arrays gedacht ist. Einzelne Objekte denkt man sich dann halt als Array der Länge 1.

    Aber das geht wahrscheinlich schon in den Bereich persönlicher Vorlieben.

    Schönen abend noch,
    derda



  • derda schrieb:

    Aber das geht wahrscheinlich schon in den Bereich persönlicher Vorlieben.

    Würde ich auch meinen. Wenn es dir hilft, Array-Parameter mit der zweiten Schreibweise zu kennzeichnen, dann benutze sie! Denke einfach dran, dass die Übergabe trotzdem nicht auf Arrays beschränkt ist. 😉


Anmelden zum Antworten