Array-Namen als Pointer
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 7 von 63.
Arrays und Pointer in C haben eine besondere Beziehung, die grundlegend für das Verständnis dafür ist, wie C mit Daten im Speicher arbeitet. Wenn Sie ein Array deklarieren, fungiert der Array-Name selbst als ein konstanter Pointer auf das erste Element des Arrays.
Das bedeutet: Wenn Sie ein Array wie int numbers[5]; haben, ist der Name numbers im Wesentlichen ein Pointer, der immer auf numbers[0] zeigt. Sie können sich den Array-Namen als einen integrierten Pointer vorstellen, den Sie nicht separat deklarieren müssen.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' zeigt auf das erste Element
// numbers == &numbers[0] // Diese sind äquivalent!Diese Äquivalenz ist entscheidend: numbers und &numbers[0] geben Ihnen beide genau dieselbe Speicheradresse. Der Array-Name ist lediglich eine bequemere Art, auf die Adresse des ersten Elements zu verweisen, ohne den Adressoperator verwenden zu müssen.
Das Verständnis dieser Beziehung öffnet die Tür zur Verwendung von Pointer-Techniken bei Arrays, was Ihren Code flexibler und effizienter machen kann. Der Hauptunterschied besteht darin, dass Array-Namen im Gegensatz zu regulären Pointern konstante Pointer sind – Sie können nicht ändern, worauf sie zeigen.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das die Äquivalenz zwischen Array-Namen und Zeigern auf ihr erstes Element demonstriert. Ihr Programm sollte:
- Ein Integer-Array namens
numbersmit 4 Elementen deklarieren und es mit den Werten {10, 20, 30, 40} initialisieren - Einen Zeiger auf einen Integer namens
ptrdeklarieren - Den Array-Namen
numbersdem Zeigerptrzuweisen - Die in
numbersgespeicherte Adresse mitprintfund dem Formatbezeichner%pausgeben - Die Adresse des ersten Elements
&numbers[0]mitprintfund dem Formatbezeichner%pausgeben - Die in
ptrgespeicherte Adresse mitprintfund dem Formatbezeichner%pausgeben - Den Wert des ersten Elements über den Array-Namen ausgeben:
*numbers - Den Wert des ersten Elements über den Zeiger ausgeben:
*ptr
Ihre Ausgabe sollte die Ergebnisse im folgenden Format anzeigen:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10Diese Herausforderung zeigt, dass der Array-Name als konstanter Zeiger auf das erste Element fungiert und dass numbers, &numbers[0] und ptr alle dieselbe Speicheradresse enthalten, wenn ptr der Array-Name zugewiesen wird.
Spickzettel
Array-Namen in C fungieren als konstante Zeiger auf das erste Element des Arrays.
Wenn Sie ein Array deklarieren, zeigt der Array-Name auf das erste Element:
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' zeigt auf das erste Element
// numbers == &numbers[0] // Diese sind äquivalent!Sie können einen Array-Namen einem Zeiger zuweisen:
int *ptr;
ptr = numbers; // ptr zeigt nun auf das erste ElementGreifen Sie mit der Zeigerschreibweise auf Werte zu:
*numbers // Wert des ersten Elements über den Array-Namen
*ptr // Wert des ersten Elements über den ZeigerHauptunterschied: Array-Namen sind konstante Zeiger – im Gegensatz zu regulären Zeigern können Sie nicht ändern, worauf sie zeigen.
Probier es selbst
#include <stdio.h>
int main() {
// TODO: Schreiben Sie Ihren Code hier
// 1. Deklarieren und initialisieren Sie das Array 'numbers' mit {10, 20, 30, 40}
// 2. Deklarieren Sie einen Zeiger auf einen Integer namens 'ptr'
// 3. Weisen Sie den Array-Namen dem Zeiger zu
// 4. Geben Sie alle erforderlichen Adressen und Werte 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