Wenn man ein Array (zB. char a[10]) hat, dann ist der Name (also a) für sich alleine ein Pointer auf das erste Element des Arrays - oder nicht? Wenn man zum Beispiel eine Funktion hat, die alle Elemente verarbeiten soll, braucht man nur den Pointer zu übergeben - fertig. Doch nun die eigentliche Frage: Bei einem Char-Array erkennt man das Ende, indem man auf ein \0 - Zeichen trifft - aber wie schaut die Situation bei anderen Array-Typen aus? Wie erkennt man zum Beispiel bei einem Integer-Array das Ende? Diese werden ja nicht mit 0-geschlossen?!
Christian H. schrieb: > Wie erkennt man zum Beispiel bei > einem Integer-Array das Ende? überhaupt nicht. Man muss die länge mit übergeben.
Christian H. schrieb: > Bei einem Char-Array erkennt man das > Ende, indem man auf ein \0 - Zeichen trifft wie kommst du darauf? das st ieine spezielle vereinbarung für c-strings, die auf charakter-Array abgebildet werden, was aber nicht automatisch heißt, dass alle char-Arrays \0-terminiert sind.
Mit der '\0' wird das Ende der Zeichenkette (String) gekennzeichnet. Das muss nicht das Ende des Array sein.
1 | char welt[10] = "Hallo"; |
Platz für 10 Zeichen (ohne '\0'), belegt sind 6 (mit '\0')
Christian H. schrieb: > Wenn man ein Array (zB. char a[10]) hat, dann ist der Name (also a) für > sich alleine ein Pointer auf das erste Element des Arrays - oder nicht? In den meisten Fällen verhält er sich so, aber er ist kein Zeiger. Ein typischer Unterschied ist z.B. bei sizeof zu finden. Ein Zeiger ist nicht das selbe wie ein Array. > Doch nun die eigentliche Frage: Bei einem Char-Array erkennt man das > Ende, indem man auf ein \0 - Zeichen trifft - aber wie schaut die > Situation bei anderen Array-Typen aus? Wie erkennt man zum Beispiel bei > einem Integer-Array das Ende? Diese werden ja nicht mit 0-geschlossen?! Das hat mit dem Typ überhaupt nichts zu tun. Es ist einfach nur eine Konvention, das Strings mit \0 abgeschlossen werden. Das ist keine spezielle Eigenschaft vom Typ char. Ich kann auch schreiben:
1 | char x[] = { 1, 2, 3, 4 }; |
Dann kommt in diesem Array keine Null vor. Das ist also kein bischen anders, als wenn es ein Array aus int wäre. Unabhängig vom Typ muß man sich bei Arrays aber immer überlegen, wie man die Länge erkennt, wenn man einen Zeiger auf den Anfang des Arrays hat. Eine Möglichkeit ist, einen Wert als Ende-Marker zu verwenden, wie man es bei Strings tut. Eine andere ist, die Länge zusätzlich mit zu übergeben. Oder man verwendet eine bestimme feste Länge. Die Länge als zusätzlicher Wert ist die allgemeinste Variante, erfordert aber, daß man die überall mitzieht. Bei den anderen hängt's vom Anwendungsfall ab, ob man sie nutzen kann.
Wenn das Array immer ganz gefüllt wird, kann man sich die Übergabe derLänge auch sparen und sizeof verwenden. Für das obige Beispiel: sizeof(x) Man muss da aber wissen was man tut; je nach Datentyp kann auch was falsches rauskommen. ;-)
Johnny B. schrieb: > Wenn das Array immer ganz gefüllt wird, kann man sich die Übergabe > derLänge auch sparen und sizeof verwenden. > Für das obige Beispiel: sizeof(x) Nein kannst du nicht. Eine Funktion kann grundsätzlich nicht die Länge eines übergebenen Arrays bestimmen. Die ganze Arraysyntax in der Argumentliste einer Funktion ist nur Augenauswischerei und syntaktischer Zucker. Arrays werden in C immer per Pointer übergeben, d.h. eine Funktion kann vom Argument mit einem sizeof immer nur die Größe eines Pointers feststellen. Das ist aber wenig hilfreich.
Johnny B. schrieb: > Wenn das Array immer ganz gefüllt wird, kann man sich die Übergabe > derLänge auch sparen und sizeof verwenden. Was willst du sparen? 10 Tastendrücke? Oder kostet jede Übergabevariable Lizenzgebühren? Wo ist das Problem. Man gewöhnt sich an bei einem Pointer auf ein Array immer auch die Größe mit zu übergeben. Das kostet kein Geld.
Danke für die vielen Antworten. Das die größe mitübergeben werden muss, ergibt Sinn. danke!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.