Pointer im Paramenter - Verständnisfrage
-
Ich danke dir, das hat mir sehr weitergeholfen !
-
strcpy gibt einen Wert zurück, damit du damit gleich weiter arbeiten kannst.
char str[5]; printf("%s\n", strcpy(str, "test"));
Strings in C sind eine Vereinbarung, wie sie zu handhaben sind. (Nullterminiert und genug Platz im Ziel)
Wenn du dich nicht daran hälst, ist das dein Problem, nicht das vom Compiler.
-
Hallo nochmal,
ok - so 100%ig klar mit dem Rückgabetyp ist mir das noch nicht. Also ihr sagt, strcpy gibt s1 bzw. "einen Wert" zurück.
Ich habe gerade mal gegoogled und folgende mögliche Implementierung gefunden:
#ifdef _NC_RESTRICT char *strcpy(char *restrict dest, const char *restrict src) #else char *strcpy(char *dest, const char* src) #endif { char *ret = dest; while (*dest++ = *src++) ; return ret; }
Irgendwie sieht das so aus, als würde der Ursprungswert von vom übergebenen String (*dest) nochmal extra gespeichert werden und dieser dann zurückgegeben werden. Mit meinem Java Verständis würde ich sagen, ich könnte sowas machen
str[] = "test123";
str2 = strcpy(str, "cop");dann müsste str den Wert "cop" beinhalten und str2 den UrsprungsWert von str2.
Ich weiß zwar das diese Zuweisung nicht funktioniert ( finde es noch etwas verwirrend wann man etwas zuweisen kann und wann nicht)., aber prinzipell ist das doch richtig gedacht das strcpy den Ursprungswert zurückgibt oder? Meine Frage: Wie kann ich denn damit weiter arbeiten? Weil eigentlich könnte das ja auch eine void funktion sein die nichts zurückgibt sondern einfach die übergebene Zeichenkette in den übergebenen String speichert.
-
am Ende von deinem Beispiel enthält str2 die Adresse von str genauer vom ersten element von str also &str[0], und nicht den Wert "cop".
Ab dieser Adresse wird es so aussehen cop\0123\0 (\0 meint hier Nullbyte)bei dem strcpy wird der Wert von dest in ret gespeicher, weil in der Schleife der Wert von dest verändert wird,
achtung bei der übergabe zerfällt das array zu einem zeiger auf das erste element des arrays
-
so hab ein kleines Programm geschrieben, da kannst du es dir angucken
#include <stdio.h> #include <string.h> int main(void) { char str[] = "test123"; char *str2 = NULL; str2 = strcpy(str, "cop"); printf("str = %p\n", str); printf("str2 = %p\n", str2); for(int i=0; i < 8; i++) { if(str[i] != '\0') putchar(str[i]); else fputs(" \\0 ", stdout); } putchar('\n'); }
-
gary1195 schrieb:
am Ende von deinem Beispiel enthält str2 die Adresse von str genauer vom ersten element von str also &str[1],
Das erste Element hat den Index 0. Immer!
Also&str[0]
Kujuk schrieb:
... finde es noch etwas verwirrend wann man etwas zuweisen kann und wann nicht ...
Variablen (dazu gehören auch Zeiger/Pointer) kannst du etwas zuweisen.
Arrays dagegen nur bei der Definition.
-
Danke euch vielmals - jetzt ists klar
!
-
DirkB schrieb:
Das erste Element hat den Index 0. Immer!
char *gegenbeispiel = str[-1]; gegenbeispiel[1] // erstes Element von str
-
nimmer schrieb:
DirkB schrieb:
Das erste Element hat den Index 0. Immer!
char *gegenbeispiel = str[-1]; gegenbeispiel[1] // erstes Element von str
Er meint wahrscheinlich auch die blanke Adresszuweisung an den Pointer. Klar, dass man durch Spielerreien etwas tricksen kann - verwirr den TE doch nicht unnötig !
-
nimmer schrieb:
DirkB schrieb:
Das erste Element hat den Index 0. Immer!
char *gegenbeispiel = str[-1]; gegenbeispiel[1] // erstes Element von str
undefiniert.
char *gegenbeispiel = str[1]; gegenbeispiel[-1] // erstes Element von str
so funktioniert es.