Zeiger als Rückgabewert einer Funktion



  • Guten Tag,

    ich hätte eine Frage zu Zeigern und Funktionen. Gegeben ist folgende Sinnlosfunktion:

    char* ausgabe(char *t[]);
    {
       return &t[0];
    }
    

    Nach meinem Verständnis ist dies doch eine Funktion, die als Rückgabewert einen Zeiger auf eine Char-Variable liefert und als Parameter einen Zeiger auf ein Char-Array fordert.
    Wenn ich nun aber versuche, diese Funktion aufzurufen, muss ich doch den Adresswert des Arrays übergeben und deshalb des &-Operator verwenden.

    char r[2] = {'A', 'B'};
    *ausgabe(&r);
    

    Leider liefert mir der Compiler in diesem Fall immer die Meldung "cannot convert 'char*' to 'char**'" und ich weiß leider nicht warum.

    Es wäre wirklich nett, wenn jemand eine Idee hätte warum das so nicht funktioniert. Das würde mir beim Verständnis sehr helfen.

    Viele Grüße



  • @hmars sagte in Zeiger als Rückgabewert einer Funktion:

    Nach meinem Verständnis ist dies doch eine Funktion, die als Rückgabewert einen Zeiger auf eine Char-Variable liefert und als Parameter einen Zeiger auf ein Char-Array fordert.

    char* ausgabe(char *t[]);

    ist dasselbe wie
    char* ausgabe(char **t);

    Die Funktion nimmt also einen Zeiger auf einen Zeiger auf char.



  • @hmars sagte in Zeiger als Rückgabewert einer Funktion:

    t[0]

    Was hat t für einen Typ?
    Was hat t[0] für einen Typ?
    Was hat &t[0] für einen Typ?

    Und passt das zum Rückgabe-Typ deiner Funktion?



  • Du musst lernen, wie eine Deklaration zu lesen ist. Glaub die Regel heißt right-left-rule. Den Link muss ich gerade mal suchen... https://gist.github.com/c00kiemon5ter/3023944

    char *t[]
    

    t is an array of pointers to char. Und wegen array-to-pointer-decay zerfällt das Array bei der Übergabe in einen Zeiger auf das erste Element des Arrays, also char** t.

    char (*t)[]
    

    t is a pointer to an array of chars. Hier hast du also einen Zeiger auf ein char-Array.



  • Und wenn du char-Arrays und char-Pointer statt std:.string und std::string_view betrachtest, bist du möglicherweise auf dem Holzweg.



  • @out Vielen Dank für die Erklärung und den Link. Das hat mir wirklich weitergeholfen.


Log in to reply