Aufruf strcat C++



  • @SeppJ sagte in Aufruf strcat C++:

    Wieso ist solch ein willkürlich gewählter Zwischenschritt die Wahrheit, und nicht das Endergebnis dieser Kette?

    Hmmm.. ein double ist ein char, ausser wenn er nicht an einen char bindet? Mag ja sein, dass er eigene Typ in dem Fall nur auf dem Papier existiert, aber "wird konvertiert" statt "ist" hat Konsequenzen, die m.E. für den Anwender zum besseren Verständnis betragen. Z.B. dass Array-Typen auch noch eine Größe haben, die man nicht immer zwangsläufig wegwerfen muss. Manchmal ist es nützlich, die mitzuführen 😉


  • Mod

    @Finnegan sagte in Aufruf strcat C++:

    Hmmm.. ein double ist ein char, ausser wenn er nicht an einen char bindet?

    Da hast du irgendwie Recht. Aber Gegenstandpunkt: Im Array-Fall ist es ja schon eher die Ausnahme, dass das Array tatsächlich wie ein Array zählt. C++ mag es zwar andersherum formulieren als C, aber trotzdem gibt es effektiv nur 4-6 Fälle (je nach Version des Sprachstandards), wo das Array wirklich wie ein Array zählt. Und alle davon sind so komische Meta-Fälle, wo direkt auf den Typen operiert wird, anstatt die "normale" Nutzung einer Variablen als rvalue.



  • @SeppJ sagte in Aufruf strcat C++:

    @Finnegan sagte in Aufruf strcat C++:

    Hmmm.. ein double ist ein char, ausser wenn er nicht an einen char bindet?

    Da hast du irgendwie Recht, aber in diesem Fall ist es ja schon eher die Ausnahme, dass das Array tatsächlich wie ein Array zählt. C++ mag es zwar andersherum formulieren als C, aber trotzdem gibt es effektiv nur 4-6 Fälle (je nach Version des Sprachstandards), wo das Array wirklich wie ein Array zählt.

    Ja, ich mach auch viel zu wenig in C. Da gibts glaube ich echt nicht viel außer vielleicht sizeof, was man mit der Array-Eigenschaft anfangen kann. Da würd's mir wohl auch so gehen. In C++ erhalte ich hin und wieder mal den Array-Typen, z.B. via Template-Parameter. Da kann man sich in einigen Fällen (meist Lowlevel-Zeug) schonmal einen extra size-Funktionsparameter sparen, wenn die Größe eh im Typen eincodiert ist.



  • @SeppJ sagte in Aufruf strcat C++:

    Wieso ist solch ein willkürlich gewählter Zwischenschritt die Wahrheit, und nicht das Endergebnis dieser Kette?

    Weil man so über C++ reden kann. Wenn man nur das Endergebnis betrachtet, dann kann man nicht mehr sinnvoll erklären wie man C++ programmiert. Dann muss man zu jeder Referenz Zeiger sagen. Ausser sie wird vielleicht ganz wegoptimiert. Wie nennt man es dann? Ding was wir hinschreiben aber im Programm nicht mehr vorkommt?

    Ne. Es macht schon Sinn zu einem Array Array zu sagen, und nicht Zeiger.

    ps: Und wenn man sich willkürlich andere Zwischenschritte rauspickt, dann wird es auch schwer. Im Kontext kann das schon Sinn machen. Aber so allgemein... weniger. Und einem Anfänger zu sagen "ist doch schon ein Zeiger" ist kein Kontext wo ich es für sinnvoll halte.


  • Mod

    Fair.
    Aber die Antwort auf die Frage des OP ist immer noch, dass das für den Funktionsaufruf ein Pointer ist, auch wenn da nur str1 (ohne &) steht. Weil die Sprache sagt, dass das so ist, wenn man den "Wert" eines Arrays nimmt.



  • Ich finde die Forumlierung einfach nicht sinnvoll. str1 ist ein Array, egal wo es steht. Die Antwort für den OP ist, dass es in C++ "array to pointer decay" gibt. Also dass Arrays ggf. implizit in einen Zeiger auf ihr erstes Element konvertiert werden. Und dass er deswegen str1 schreiben kann, trotz dem dass str1 ein Array ist und die Funktion einen Zeiger erwartet.



  • @hustbaer Die Funktion bekommt eine Adresse, die sie in einem Zeiger speichert.
    Ob die jetzt von einem Array stammt oder aus einem anderen Zeiger ist da dann nicht mehr feststellbar.



  • @DirkB sagte in Aufruf strcat C++:

    @hustbaer Die Funktion bekommt eine Adresse, die sie in einem Zeiger speichert.
    Ob die jetzt von einem Array stammt oder aus einem anderen Zeiger ist da dann nicht mehr feststellbar.

    s1 ist ein char*, keine Frage. str1 ist jedoch ein char[50]. Wenn man eine Funktion wie strcat schreibt, dann gehört dazu auch die Parameterliste - und dort könnte man beide sehr wohl noch unterscheiden, wenn man denn wollte.



  • @DirkB str1 ist nicht der Parameter sondern das Argument.
    Dass die Parameter von strcat Zeiger sind wurde nie bestritten.



  • Alles klar...vielen Dank für eure Antworten


Anmelden zum Antworten