Dies ist eine alte Version des Dokuments!
Umgang mit Arrays (Wertelisten) und Zeichenfolgen (Buchstabenlisten) in C.
Die Variablen, die wir bisher betrachtet haben, sind alle einzelne numerische Werte. In diesem Kapitel werden wir uns ansehen, wie C mit Wertelisten umgeht. Dies führt dazu, dass Buchstabenlisten zum Speichern und Bearbeiten von Textzeichenfolgen verwendet werden.
Ein Array ist eine einzelne Variable, in der mehrere unterschiedliche Werte desselben Typs gespeichert sind. Auf die einzelnen Werte wird durch Indizieren des Arrays zugegriffen. Ein Array kann eine oder mehrere Dimensionen haben. Ein eindimensionales Array ist eine einzelne Liste von Werten, während ein zweidimensionales Array eine Liste von Wertelisten usw. ist. Ein Array wird in C deklariert, indem die Größe jeder Dimension in eckige Klammern nach dem Variablennamen gesetzt wird. Daher ist
int a[10];
eine Liste von 10 Integern, während
int b[5][6];
eine Liste ist, die 5 Listen mit jeweils 6 Integern beïnhaltet.
Beim Zugriff auf die Elemente innerhalb eines Arrays beginnt der Array-Index, die Zahl in der eckigen Klammer, bei 0. Die 10 im Array a, siehe oben, enthaltenen Ganzzahlen werden daher als a[0], a[1], a[2] und so weiter bezeichnet bis zu einem a[9]. Der Compiler erlaubt Ihnen, eine a[10], eine a[11] oder eine a[beliebige Zahl] zu lesen oder zu schreiben, aber diese befinden sich alle außerhalb des Speichers, der bei der Deklaration des Arrays zugewiesen wurde. In diesen Speicherberich zu schreiben ist eine sehr schlechte Idee.
Dies bringt uns zu der Beziehung zwischen Zeigern und Arrays. Der Name eines Arrays ist effektiv ein Zeiger auf das erste Element des Arrays. Denken sie daran, dass ein Zeiger die Adresse einer Variablen im Speicher ist?
Nun, ein Array ist ein zusammenhängender Speicherblock, der alle Elemente des Arrays der Reihe nach enthält, sodass sie mit einem Zeiger darauf zugreifen können. (selbst wenn sie Werte in eckigen Klammern verwenden, um darauf zuzugreifen, behandelt der Compiler diese ohnehin als Zeiger.) Hier ein Beispiel:
#include <stdio.h> void main (void) { int a[10]; int count; for (count = 0; count < 10; count++) { a[count] = count * 10 + count; } printf ("Das erste und zweite Element von a haben den Wert %d und %d\n", a[0], a[1]); printf ("Oder, als Pointer, %d and %d\n", *a, *(a+1)); }
Dies füllt die 10 Werte von a mit den Zahlen 0, 11, 22, 33 usw. und liest dann a[0] und a[1]. Anschließend werden dieselben Werte mit a als Zeiger gelesen, und sie können feststellen, ob der Code identisch ist. Bei einem zweidimensionalen Array oder höher müssen sie berücksichtigen, wie der Compiler die Dimensionen im Speicher anordnet. Dazu werden die Elemente am Index ganz rechts des Arrays zusammengefasst. Mit dem obigen Array b[5][6] zeigt b selbst auf b[0][0]. b + 1 Punkte bei b[0][1]; b+5 Punkte bei b[0][5]; und b+6 Punkte bei b[1][0].
Man kann ein Array gleichzeitig mit der Deklaration initialisieren, indem man die Werte in geschweifte Klammern setzt.
int a[10] = { 0, 11, 22, 33, 44, 55, 66, 77, 88, 99 };
Allerdings ist zu beachten, dass dies nur funktioniert, wenn das Array zum ersten Mal deklariert wird. Sobald es vorhanden ist, kann man diese Verknüpfung nicht mehr verwenden und man muss die Array-Indizes durchlaufen und jeden Wert nacheinander festlegen.
Oben: Array-Elemente werden nacheinander im Speicher gespeichert, wobei der Array-Name ein Zeiger auf das erste Element ist. Mehrdimensionale Array-Elemente werden mit den Elementen mit benachbarten Werten im Index ganz rechts nebeneinander gespeichert.
In C ist eine Zeichenfolge nur ein anderes Array. Es handelt sich um eine Reihe einzelner Zeichen. Ein Zeichen ist ein bestimmter Typ in C, der als char bezeichnet wird. Dies enthält ein einzelnes Byte, das ausreicht, um ein alphanumerisches Zeichen aufzunehmen. Ein String mit zehn Bytes wäre also:
char mystring[10];
Oder um es gleichzeitig zu initialisieren:
char mystring[10] = "thestring";
Eine wichtige Sache, die man beachten sollten, ist, dass eine Zeichenfolge in C immer mit einem auf Null gesetzten Byte enden muss und dass der Speicher, der zum Halten dieser letzten Null erforderlich ist (als Zeichenfolgenabschluss
bezeichnet), zugewiesen werden muss, wenn man die Zeichenfolge deklariert. mystring
, das als Array mit 10 Zeichen deklariert ist, kann also nur Text mit 9 oder weniger Zeichen enthalten.
Oben: Zeichenfolgen werden als Array einzelner Zeichen gespeichert, wobei das Element nach dem letzten Zeichensatz auf Null gesetzt wird.
sie können den Index in eckigen Klammern verwenden, um auf einzelne Zeichen in einer Zeichenfolge zuzugreifen, oder sie können einen Zeiger verwenden. Hier ist ein Beispiel für die Verwendung von Zeigern, um zwei Zeichenfolgen miteinander zu verbinden:
#include <stdio.h> void main (void) { char str1[10] = "first"; char str2[10] = "second"; char str3[20]; char *src, *dst; src = str1; dst = str3; while (*src != 0) { *dst = *src; src++; dst++; } src = str2; while (*src != 0) { *dst = *src; src++; dst++; } *dst = 0; printf ("%s + %s = %s\n", str1, str2, str3); }
Zuerst erstellen wir zwei Zeichenfolgen - str1 ist „first“ und str2 ist „second“ - und wir weisen eine leere Zeichenfolge, str3, zu, um das Ergebnis einzugeben. Anschließend erstellen wir ein Paar Zeichenzeiger und zeigen src am Anfang von str1 (das „f“ von „first“) und dst am Anfang des leeren str3. Wir gehen in eine schleife, kopieren den Inhalt von src nach dst und bewegen dann beide Zeiger um eins vorwärts, bis wir die Null finden, die str1 beendet.
Wir zeigen dann src2 nach str und machen dasselbe noch einmal, bis wir die Null am Ende von str2 finden. Schließlich schreiben wir eine Null an das Ende von str3, um es zu beenden. Beachten sie den neuen Formatbezeichner zum Drucken von Zeichenfolgen.
%s wird zum Drucken einer Zeichenfolge verwendet und zeigt jedes Zeichen vom als Argument angegebenen Zeiger bis zur ersten gefundenen, abschließenden, Null an. (Wenn sie ein einzelnes Zeichen drucken möchten, können sie den Formatbezeichner %c verwenden.)
Die Ausgabe des obigen Programms:
first + second = firstsecond
Da der Name einer String-Variablen nur ein Zeiger auf das erste Zeichen der Zeichenfolge ist, können sie nicht einfach ein Gleichheitszeichen verwenden, um den Wert einer vollständigen Zeichenfolge festzulegen. sie können eine Zeichenfolgenvariable wie oben zum Zeitpunkt der Deklaration initialisieren. Was ist jedoch, wenn sie sie später festlegen oder ändern möchten?
Es gibt einige Möglichkeiten, dies zu tun, aber die nützlichste ist die sprintf Funktion. Dies ist eine Version der bereits gesehenen Funktion printf, die beliebigen Text in Zeichenfolgenvariablen schreibt. Der einzige Unterschied besteht darin, dass das erste Argument der Name einer String-Variablen ist und in diese anstatt in das Terminal geschrieben wird:
#include <stdio.h> void main (void) { int val = 12; char string[50]; sprintf (string, "Der Wert von val ist %d\n", val); printf ("%s", string); }
Die sprintf Funktion fügt am Ende jeder Zeichenfolge, die sie damit erstellen, automatisch die abschließende Null hinzu.
Im nächsten Kapitel werden einige der Funktionen in der String-Handhabungs Libary von C vorgestellt, um die Arbeit mit Strings zu vereinfachen.