Forum: PC-Programmierung C Ende eines Arrays wenn nicht vom Typ Char?


von Christian H. (christian_h52)


Lesenswert?

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?!

von Peter II (Gast)


Lesenswert?

Christian H. schrieb:
> Wie erkennt man zum Beispiel bei
> einem Integer-Array das Ende?
überhaupt nicht.

Man muss die länge mit übergeben.

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von DirkB (Gast)


Lesenswert?

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')

von Rolf Magnus (Gast)


Lesenswert?

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.

von Johnny B. (johnnyb)


Lesenswert?

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. ;-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Christian H. (christian_h52)


Lesenswert?

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
Noch kein Account? Hier anmelden.