Unterschied zw. Zeiger und Vektoren
-
Danke, die Sache ist jetzt klarer geworden.
Der Name eines Arrays ist also eine symbolische Anfangsadresse des Beginns eines zusammenhängenden Speicherbereiches, kein wirklicher Pointer, mit dem sich Adressarithmetik durchführen lässt. Um trotzdem mit den Adressen der Felder zu rechnen, muss der Wert des Arraynamens in eine als Pointer explizit definierte Variable kopiert werden.Korrekt soweit?
Chiao
-
/bin/bash0R schrieb:
Danke, die Sache ist jetzt klarer geworden.
Der Name eines Arrays ist also eine symbolische Anfangsadresse des Beginns eines zusammenhängenden Speicherbereiches, kein wirklicher Pointer, mit dem sich Adressarithmetik durchführen lässt. Um trotzdem mit den Adressen der Felder zu rechnen, muss der Wert des Arraynamens in eine als Pointer explizit definierte Variable kopiert werden.Korrekt soweit?
Chiao
Einem Pointer gleichen Typs muss die Startadresse des Speicherbereich, an welchem
das Array beginnt, zugewiesen werden. Das passiert i.d.R. durch eine simple
Zuweisung: pointer = arraymfg
v R
-
Also ist:
a=src; b=dst;
Das gleiche wie:
a = &src[0]; b = &dst[0];
-
flyingCoder schrieb:
Also ist:
a=src; b=dst;
Das gleiche wie:
a = &src[0]; b = &dst[0];
imho ja, ich mache jedenfalls immer nur so. Ich finde Pointers bequemer als Arrays und deshalb deklariere ich gleichzeitig ein pointer, wenn ich ein Array brauche. Schau mein beispiel auf der anderen Seite, da hab ich auch so gemacht.
-
Oder lies dir nochmal Humes Zitat durch
mfg
v R
-
chille07 schrieb:
- Bei der Funktion strcpy() brauchst du kein '\0' anzuhängen. Das macht die Funktion selbst.
Was dein Programm macht:
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { char src[20], dst[20]; //Deklaration (speicherreservierung der Felder) strcpy(src,"Hallo Welt!\0"); // Initialisierung( '\0' weglassen!) while ( *(dst++) = *(src++) ); // Hier werden Sie Startadressen der Felder um eins erhöht. //Das ist gefählich, weil der Pointer um (ich glaube) 4 erhöht wird. //Dieser Speicherbereich kann bereits von einem anderen Programm verwendet werden. // dann giebt es ein Prob: das ist eine Zuweisung in einer While-Schleife // *) weiter gehts unten printf("%s\n", dst); return 0; }
Das müsste lauten:
while(dst++=src++);
weil du kein 2-dimensionales Feld deklariert hast.
das ist in einer while scheife aber sinnlos, also:
dst++=src++;
die Erhöhung der Adressen ist gefählich und wird nicht benötigt.
Wenn ich das richtig gesehen habe, sollest du auf "virtuell Realisticer" hören!kleine frage, wenn er das \0 schon manuell anghängt, kommt dann von der funktion auch noch eins hinzu? also stehen dann plötzlich 2 im string?
-
Nein, die zweite '\0' wird nicht kopiert, da bereits die erste '\0' als Terminator für den String zählt.
-
chille07 schrieb:
while ( *(dst++) = *(src++) ); // Hier werden Sie Startadressen der Felder um eins erhöht. //Das ist gefählich, weil der Pointer um (ich glaube) 4 erhöht wird. //Dieser Speicherbereich kann bereits von einem anderen Programm verwendet werden. // dann giebt es ein Prob: das ist eine Zuweisung in einer While-Schleife // *) weiter gehts unten printf("%s\n", dst);
so viel blödsinn auf einem haufen hab' ich noch hier nie gelesen...
-
Ist ja auch schon über zwei Jahre her
-
Hab hier was für dich, weiss aber nicht ob es das, ist wonach du gesucht hast:
#include <stdio.h> #include <string.h> int main(int argc, char **argv) { char src[20], dst[20],*zeiger=&src[0]; int i=0; strcpy(src,"Hallo Welt!"); while ((dst[i]=*(zeiger+i))&&(i<20)) i++; printf("%s\n",dst); return 0; }
ist jetzt halt auch mit ner zählervariable aber ne andere variante wie die von virtuell Realisticer
mfg
ode