BESTE WEBSITE FÜR WEBENTWICKLER
C Sprache. W3Schools auf Deutsch. Unterricht für Anfänger

Ua En Es

C Zeiger und Arrays


Zeiger und Arrays

Sie können auch Zeiger verwenden, um auf Arrays zuzugreifen.

Betrachten Sie das folgende Array von Ganzzahlen:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};

Aus dem Kapitel Arrays haben Sie gelernt, dass Sie die Array-Elemente mit einer for-Schleife durchlaufen können:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", myNumbers[i]);
}

Ergebnis:

25
50
75
100
Try it Yourself »

Anstatt den Wert jedes Array-Elements auszudrucken, drucken wir die Speicheradresse jedes Array-Elements aus:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%p\n", &myNumbers[i]);
}

Ergebnis:

0x7ffe70f9d8f0
0x7ffe70f9d8f4
0x7ffe70f9d8f8
0x7ffe70f9d8fc
Try it Yourself »

Beachten Sie, dass die letzte Zahl der Speicheradressen der einzelnen Elemente unterschiedlich ist und 4 hinzufügt.

Das liegt daran, dass die Größe eines int-Typs normalerweise 4 Byte beträgt. Denken Sie daran:

Beispiel

// Erstellen Sie eine int-Variable
int myInt;

// Ermitteln Sie die Speichergröße eines int
printf("%lu", sizeof(myInt));

Ergebnis:

4
Try it Yourself »

Aus dem „Speicheradressen-Beispiel“ oben können Sie also ersehen, dass der Compiler 4 Byte Speicher für jedes Array-Element reserviert, was bedeutet, dass das gesamte Array 16 Byte (4 * 4) Speicher belegt:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};

// Ermitteln Sie die Größe des myNumbers-Arrays
printf("%lu", sizeof(myNumbers));

Ergebnis:

16
Try it Yourself »

Wie hängen Zeiger mit Arrays zusammen?

Ok, wie ist also die Beziehung zwischen Zeigern und Arrays? Nun, in C ist der Name eines Arrays tatsächlich ein Zeiger auf das erste Element des Arrays.

Verwirrt? Versuchen wir, dies besser zu verstehen, und verwenden wir noch einmal unser „Beispiel für Speicheradressen“ oben.

Die Speicheradresse des ersten Elements ist dieselbe wie der Name des Arrays:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};

// Rufen Sie die Speicheradresse des myNumbers-Arrays ab
printf("%p\n", myNumbers);

// Rufen Sie die Speicheradresse des ersten Array-Elements ab
printf("%p\n", &myNumbers[0]);

Ergebnis:

0x7ffe70f9d8f0
0x7ffe70f9d8f0
Try it Yourself »

Das bedeutet im Grunde, dass wir mit Arrays über Zeiger arbeiten können!

Wie? Da myNumbers ein Zeiger auf das erste Element in myNumbers ist, können Sie den Operator * verwenden, um darauf zuzugreifen:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};

// Rufen Sie den Wert des ersten Elements in myNumbers ab
printf("%d", *myNumbers);

Ergebnis:

25
Try it Yourself »

Um auf die restlichen Elemente in myNumbers zuzugreifen, können Sie den Zeiger/das Array erhöhen (+1, +2 usw.):

Beispiel

int myNumbers[4] = {25, 50, 75, 100};

// Rufen Sie den Wert des zweiten Elements in myNumbers ab
printf("%d\n", *(myNumbers + 1));

// Rufen Sie den Wert des dritten Elements in myNumbers ab
printf("%d", *(myNumbers + 2));

// und so weiter

Ergebnis:

50
75
Try it Yourself »

Oder durchschleifen:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};
int *ptr = myNumbers;
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", *(ptr + i));
}

Ergebnis:

25
50
75
100
Try it Yourself »

Es ist auch möglich, den Wert von Array-Elementen mit Zeigern zu ändern:

Beispiel

int myNumbers[4] = {25, 50, 75, 100};

// Ändern Sie den Wert des ersten Elements auf 13
*myNumbers = 13;

// Ändern Sie den Wert des zweiten Elements auf 17
*(myNumbers +1) = 17;

// Ermitteln Sie den Wert des ersten Elements
printf("%d\n", *myNumbers);

// Ermitteln Sie den Wert des zweiten Elements
printf("%d\n", *(myNumbers + 1));

Ergebnis:

13
17
Try it Yourself »

Diese Art der Arbeit mit Arrays könnte etwas übertrieben erscheinen. Besonders bei einfachen Arrays wie in den obigen Beispielen. Bei großen Arrays kann es jedoch wesentlich effizienter sein, mit Zeigern auf Arrays zuzugreifen und diese zu bearbeiten.

Es gilt auch als schneller und einfacher, mit Zeigern auf zweidimensionale Arrays zuzugreifen.

Und da Strings eigentlich Arrays sind, können Sie auch Zeiger verwenden, um auf Strings zuzugreifen.

Im Moment ist es großartig, dass Sie wissen, wie das funktioniert. Aber wie wir im vorherigen Kapitel angegeben haben; Zeiger müssen mit Vorsicht behandelt werden, da es möglich ist, andere im Speicher gespeicherte Daten zu überschreiben.