Array-Elemente - Pointer
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 8 von 63.
Da Sie nun verstehen, wie Array-Namen als Pointer funktionieren, können Sie dieses Wissen nutzen, um auf Array-Elemente auf eine völlig andere Weise zuzugreifen. Anstatt die vertraute Klammerschreibweise wie array[i] zu verwenden, können Sie die Pointer-Notation verwenden, um das gleiche Ergebnis zu erzielen.
Die entscheidende Erkenntnis ist, dass array[i] exakt äquivalent zu *(array + i) ist. Wenn Sie array + i schreiben, weisen Sie C an, i Positionen vom Anfang des Arrays nach vorne zu rücken. Der Dereferenzierungsoperator * ruft dann den Wert an dieser Stelle ab.
int numbers[5] = {10, 20, 30, 40, 50};
// Diese beiden Zeilen machen genau das Gleiche:
printf("%d", numbers[2]); // Gibt 30 aus
printf("%d", *(numbers + 2)); // Gibt ebenfalls 30 ausDiese Zeigernotation funktioniert, weil C die korrekte Speicheradresse automatisch basierend auf der Datentypgröße berechnet. Wenn Sie 2 zu einem Integer-Array-Zeiger hinzufügen, rückt C um 2 × sizeof(int) Bytes vor und landet genau beim dritten Element.
Das Verständnis dieser Äquivalenz gibt Ihnen Flexibilität bei der Arbeit mit Arrays und bereitet Sie auf fortgeschrittenere Pointer-Techniken vor, denen Sie im weiteren Verlauf des Erlernens von C begegnen werden.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das den Zugriff auf Array-Elemente unter Verwendung der Zeigernotation anstelle der herkömmlichen Array-Indizierung demonstriert. Ihr Programm sollte:
- Deklarieren Sie ein Integer-Array namens
valuesmit 6 Elementen und initialisieren Sie es mit den Werten {5, 15, 25, 35, 45, 55} - Verwenden Sie eine for-Schleife, um alle Elemente des Arrays zu durchlaufen
- Verwenden Sie innerhalb der Schleife die Zeigernotation
*(values + i), um auf jedes Element zuzugreifen (verwenden Sie keine Klammernotation wievalues[i]) - Geben Sie jedes Element unter Verwendung der Zugriffsmethode per Zeigernotation aus
- Demonstrieren Sie nach der Schleife die Äquivalenz, indem Sie das dritte Element (Index 2) mit beiden Methoden ausgeben:
- Zuerst unter Verwendung der Zeigernotation:
*(values + 2) - Dann unter Verwendung der herkömmlichen Array-Notation:
values[2]
- Zuerst unter Verwendung der Zeigernotation:
Ihre Ausgabe sollte die Ergebnisse im folgenden Format anzeigen:
Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25Diese Herausforderung testet Ihr Verständnis der Äquivalenz zwischen array[i] und *(array + i) und demonstriert, wie die Zeigerarithmetik es Ihnen ermöglicht, auf Array-Elemente über Speicheradressberechnungen anstelle der herkömmlichen Indizierung zuzugreifen.
Spickzettel
Array-Elemente können mit der Zeigerschreibweise anstelle der Klammerschreibweise aufgerufen werden. Der Ausdruck array[i] ist äquivalent zu *(array + i).
Wenn Sie array + i schreiben, bewegt sich C um i Positionen vom Anfang des Arrays vorwärts. Der Dereferenzierungsoperator * ruft den Wert an dieser Stelle ab.
int numbers[5] = {10, 20, 30, 40, 50};
// Diese beiden Zeilen machen genau das Gleiche:
printf("%d", numbers[2]); // Gibt 30 aus
printf("%d", *(numbers + 2)); // Gibt ebenfalls 30 ausC berechnet automatisch die korrekte Speicheradresse basierend auf der Größe des Datentyps. Das Hinzufügen von 2 zu einem Integer-Array-Zeiger bewegt sich um 2 × sizeof(int) Bytes vorwärts.
Probier es selbst
#include <stdio.h>
int main() {
// TODO: Schreiben Sie hier Ihren Code
// Deklarieren und initialisieren Sie das Array 'values' mit 6 Elementen
// Verwenden Sie eine for-Schleife, um jedes Element mit der Zeigernotation *(values + i) auszugeben
// Geben Sie nach der Schleife das dritte Element sowohl in Zeiger- als auch in Array-Notation aus
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-Funktionen