Aufruf strcat C++
-
@hustbaer sagte in Aufruf strcat C++:
Und:
@SeppJ sagte in Aufruf strcat C++:In den meisten Fällen ist der Ausdruck str1 ein Zeiger, doch.
Nö. In den meisten Fällen wird
str1
in einen Zeiger konvertiert. Zu sagenstr1
ist in den meisten Fällen ein Zeiger, wäre gleich unsinnig wie zu sagen ein String-Literal wäre meistens ein Zeiger. Oder wie zu sagen dasschar
Variablen oftint
s wären.Wenn sie aus Sicht der Sprache genau das sind, wieso ist dann deine Interpretation die Wahrheit? Da steht die Zeichenkette
str1
im Quelltext. Dann, wenn der Quelltext übersetzt wird, ist das ein Zeiger. Dazwischen steht eine Interpretationskette in der Sprachdefinition. Diese Kette ist aber abstrakt und nicht beobachtbar. Es kann sogar gut sein, dass die Zwischenzustände in den Datenstrukturen des Compilers überhaupt nicht existieren. Wieso ist solch ein willkürlich gewählter Zwischenschritt die Wahrheit, und nicht das Endergebnis dieser Kette?PS: Du hast aber Recht in dem Punkt, dass es im C++-Standard andersherum steht. Da steht sinngemäß, dass dieser Ausdruck genau dann zu einem Pointer konvertiert wird, wenn die Arrayinterpretation in dem Kontext keinen Sinn ergibt.
-
@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 einchar
, ausser wenn er nicht an einenchar
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
-
@Finnegan sagte in Aufruf strcat C++:
Hmmm.. ein
double
ist einchar
, ausser wenn er nicht an einenchar
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 einchar
, ausser wenn er nicht an einenchar
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 extrasize
-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.
-
Fair.
Aber die Antwort auf die Frage des OP ist immer noch, dass das für den Funktionsaufruf ein Pointer ist, auch wenn da nurstr1
(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 deswegenstr1
schreiben kann, trotz dem dassstr1
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 einchar*
, keine Frage.str1
ist jedoch einchar[50]
. Wenn man eine Funktion wiestrcat
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 vonstrcat
Zeiger sind wurde nie bestritten.
-
Alles klar...vielen Dank für eure Antworten