Viele Werte in einem Array
Ein Array speichert mehrere Werte desselben Typs direkt hintereinander im Speicher.
#include <stdio.h> int main(void) { int werte[5] = {4, 8, 15, 16, 23}; int n = sizeof(werte) / sizeof(werte[0]); // 20 / 4 = 5 int summe = 0; for (int i = 0; i < n; i++) { summe = summe + werte[i]; } printf("Anzahl: %d, Summe: %d\n", n, summe); printf("erstes: %d, letztes: %d\n", werte[0], werte[n - 1]); return 0; }
$ gcc -Wall array.c -o array $ ./array Anzahl: 5, Summe: 66 erstes: 4, letztes: 23
- Anlegen:
int werte[5] = {…};— Typ, Name, Anzahl der Elemente in eckigen Klammern. - Index:läuft von 0 bis n − 1:
werte[0]ist das erste,werte[4]das letzte Element. - Feste Größe:ein Array kann nach dem Anlegen nicht wachsen — anders als eine Python-Liste.
- Keine Grenzprüfung:
werte[5]wird übersetzt und liefert irgendeinen Wert (undefiniertes Verhalten) — keinIndexErrorwie in Python. - Durchlaufen:
for (int i = 0; i < n; i++)— Bedingung mit<, nicht mit<=. - Anzahl:
sizeof(werte) / sizeof(werte[0])= Byte des Arrays : Byte eines Elements, typisch 20 : 4 = 5. - Array-Name:
wertesteht für die Adresse des ersten Elements, also für&werte[0].
Array: typ name[n]; reserviert n Elemente hintereinander. Zugriff mit name[i] für i = 0 … n − 1 — C prüft die Grenzen nicht.
Zeichenketten mit Endezeichen
In C ist eine Zeichenkette ein char-Array, das mit dem Endezeichen '\0' abschließt.
#include <stdio.h> #include <string.h> int main(void) { char name[] = "Lena"; // 'L' 'e' 'n' 'a' '\0' char kopie[20]; int laenge = strlen(name); // zählt bis vor '\0' int bytes = sizeof(name); // ganzes Array printf("%s: %d Zeichen, %d Byte\n", name, laenge, bytes); strcpy(kopie, name); // kopie = name geht nicht if (strcmp(kopie, "Lena") == 0) { printf("%s ist gleich Lena\n", kopie); } return 0; }
$ ./name Lena: 4 Zeichen, 5 Byte Lena ist gleich Lena
- Endezeichen:
'\0'(Wert 0) markiert das Ende —"Lena"belegt deshalb 5 Byte. - Ausgabe:
%sgibt Zeichen für Zeichen aus, bis'\0'kommt. - strlen(s):zählt die Zeichen ohne
'\0'→ 4. - strcpy(ziel, quelle):kopiert samt
'\0'— das Ziel muss groß genug sein. - Kein =:
kopie = name;→error: assignment to expression with array type. - strcmp(s, t):liefert 0 bei Gleichheit, sonst negativ/positiv (s steht alphabetisch vor/nach t).
==vergliche nur Adressen. - string.h:alle
str…-Funktionen brauchen#include <string.h>.
Wähle oben ein Wort und rolle die Zeichenkette auf die Speicherzellen ab: Rolle nach rechts ziehen, Abrollen ▸ drücken oder die Rolle fokussieren und Pfeiltasten benutzen. Klicke danach eine Zelle an. Vergleiche am Ende die beiden Maßpfeile.
Halte fest: Hinter dem letzten Zeichen steht immer das Endezeichen '\0' (ASCII 0). strlen zählt nur die Zeichen davor, sizeof misst das ganze Array — deshalb ist sizeof bei char name[] = "…" immer um 1 größer. Fehlt der Platz für '\0', weiß niemand, wo die Zeichenkette endet.
Zeichenkette: char s[] = "Text"; belegt Anzahl Zeichen + 1 Byte für '\0'. Länge mit strlen, kopieren mit strcpy, vergleichen mit strcmp(s, t) == 0.
Allgemeine Hinweise
Platz für '\0' einplanen
char s[4] = "Lena"; übersetzt ohne Fehler, aber ohne Endezeichen — %s und strlen lesen dann über das Array hinaus.
Schleifengrenze mit <
Mit i <= n greift die letzte Runde auf werte[n] zu — außerhalb des Arrays, ohne Fehlermeldung.
Einfache oder doppelte Anführungszeichen
'A' ist ein einzelnes char (1 Byte), "A" eine Zeichenkette aus 'A' und '\0' (2 Byte).
