Unterschied zwischen [] und *



  • Ich habe mal eine saudumme Frage. Worin besteht der genaue Unterschied zwischen den folgenden beiden Funktionen:

    void Test(char* V)
    {
      ...
    }
    
    void Test2(char V[])
    {
      ...
    }
    


  • In diesem Fall (Parameterübergabe bei einer Funktion) ist [] die Anfängerversion 😃

    Kein Unterschied.
    In der Funktion kannst du auch zwischen * und [] wechseln.



  • Per C Sprachstandard wird identischer Code für die Übergabe der Parameter erzeugt, jedes deklarierte Array 1.Ebene wird zu einem Zeiger, egal ob du das Array evtl. auch mit einer Größe vorgibst.

    int funktion(int *p)
    

    ist äquivalent zu

    int funktion(int p[])
    

    ist äquivalent zu

    int funktion(int p[4711])
    

    und analog

    int funktion(int (*p)[4711])
    

    ist äquivalent zu

    int funktion(int p[][4711])
    

    ist äquivalent zu

    int funktion(int p[111][4711])
    

    Bist du Buchautor? Deine Fragestellung klingt fast danach.



  • Der relevante Teil des Standards ist Folgender:

    ISO/IEC 9899:1999 6.7.5.3 (7-8) schrieb:

    6.7.5.3 Function declarators (including prototypes)

    (...)

    7 A declaration of a parameter as ‘‘array of type’’ shall be adjusted to ‘‘qualified pointer to type’’, where the type qualifiers (if any) are those specified within the [ and ] of the array type derivation. If the keyword static also appears within the [ and ] of the array type derivation, then for each call to the function, the value of the corresponding actual argument shall provide access to the first element of an array with at least as many elements as specified by the size expression.
    8 A declaration of a parameter as ‘‘function returning type’’ shall be adjusted to ‘‘pointer to function returning type’’, as in 6.3.2.1.

    Die Möglichkeit, Zeigerparameter per Array-Syntax zu qualifizieren, ist in C99 neu. So ist etwa

    void foo(int const p[const]);
    

    äquivalent zu

    void foo(int const *const p);
    

    und auch zu

    void foo(int const p[const 5]);
    

    ...wobei die Längenangabe dann ignoriert wird. Theoretisch ist

    void foo(int const p[const static 5]);
    

    etwas anderes, aber es sollte mich wundern, wenn es einen Compiler gäbe, für den das einen Unterschied macht. Vorstellbar wäre ein Szenario, in dem heterogene Deklarationen zu Problemen mit optimierenden Compiler führen - das heißt, wenn du die Funktion als

    void foo(int p[]);
    

    deklarierst und später als

    void foo(int p[static 5]) {
      ...
    }
    

    definierst, übernehme ich keine Verantwortung, dass das für alle Ewigkeit hält, aber erstens wärst du dann selbst schuld und zweitens sollte es mich auch dann überraschen, wenn es auseinanderflöge.

    Der Vollständigkeit halber sei erwähnt, dass das selbe für Funktionszeiger gilt (deswegen habe ich oben auch Absatz 8 zitiert).

    void foo(int(void));
    

    ist äquivalent zu

    void foo(int (*)(void));
    


  • Bist du Buchautor? Deine Fragestellung klingt fast danach.

    Nein, ich bin einfach nur neugierig. Denn das muss man auch als Programmierer der WinAPI sein. 😃

    Dankeschön für die Info's. 👍


Anmelden zum Antworten