Zeiger auf Structs
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 44 von 63.
Da du nun sicher im Umgang mit Structs bist, ist es an der Zeit, sie mit einem weiteren leistungsstarken C-Konzept zu kombinieren: Zeigern. Genau wie du Zeiger auf grundlegende Datentypen wie int oder char erstellen kannst, kannst du auch Zeiger erstellen, die die Adresse einer Struct-Variablen enthalten.
Die Syntax zum Deklarieren eines Zeigers auf eine Struktur folgt demselben Muster wie andere Zeigerdeklarationen:
struct StructureName *pointerName;Zum Beispiel mit unserer vertrauten Point-Struktur:
struct Point p1 = {10, 20};
struct Point *ptr;Dadurch wird ein Zeiger namens ptr erstellt, der die Adresse einer Point-Struktur speichern kann. Damit der Zeiger tatsächlich auf unsere Strukturvariable zeigt, verwendest du den Adressoperator:
ptr = &p1;Um über den Zeiger auf ein Element zuzugreifen, dereferenziere ihn und verwende dann den Punktoperator. Die Klammern sind erforderlich, weil . stärker bindet als *:
printf("%d", (*ptr).x); // gleichbedeutend mit p1.xJetzt enthält ptr die Speicheradresse der Strukturvariablen p1. Dadurch eröffnen sich neue Möglichkeiten, mit Strukturen zu arbeiten, insbesondere wenn du sie an Funktionen übergibst oder den Speicher dynamisch verwaltest. Zeiger auf Strukturen sind unverzichtbar, um komplexere Datenstrukturen zu erstellen und effiziente C-Programme zu schreiben.
Aufgabe
EinfachErstelle ein C-Programm, das den Umgang mit Zeigern auf Strukturen demonstriert. Dein Programm sollte Folgendes tun:
- Definiere ein
structnamensProductmit den folgenden Mitgliedern:- Eine Ganzzahl
id, um die Produkt-ID zu speichern - Ein Zeichenarray
namemit der Größe 25, um den Produktnamen zu speichern - Eine Fließkommazahl
price, um den Produktpreis zu speichern - Eine Ganzzahl
quantity, um die verfügbare Menge zu speichern
- Eine Ganzzahl
- Erstelle in der Hauptfunktion eine
Product-Variable namensitemund initialisiere sie mit den folgenden Werten:- ID: 501
- Name: "Laptop"
- Preis: 899.99
- Menge: 15
- Deklariere einen Zeiger auf eine
Product-Struktur namensitemPtr - Weise
itemPtrmithilfe des Adressoperators die Adresse der Variablenitemzu - Gib die ursprünglichen Produktinformationen aus, indem du direkt auf die Strukturmitglieder zugreifst (mit dem Punktoperator), und zwar exakt in diesem Format:
Original Product Info:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Gib dieselben Produktinformationen aus, indem du über den Zeiger auf die Strukturmitglieder zugreifst (mit dem Dereferenzierungsoperator und der Punktnotation:
(*itemPtr).member), und zwar exakt in diesem Format:Product Info via Pointer:ID: [id]Name: [name]Price: [price]Quantity: [quantity]
- Überprüfe, ob der Zeiger korrekt auf die Struktur zeigt, indem du die Speicheradressen exakt in diesem Format ausgibst:
Address of item: [address]Value of itemPtr: [address]Address verification: [result]
Gib bei der Adressüberprüfung Match aus, wenn die Adressen identisch sind, oder No Match, wenn sie unterschiedlich sind.
Diese Aufgabe prüft dein Verständnis der Deklaration eines Zeigers auf eine Struktur, der Adresszuweisung mithilfe des Adressoperators und des Zugriffs auf Strukturmitglieder über Zeiger mithilfe des Dereferenzierungsoperators in Kombination mit der Punktnotation. Außerdem überprüfst du, ob der Zeiger korrekt die Adresse der Strukturvariablen enthält.
Probier es selbst
#include <stdio.h>
#include <string.h>
// TODO: Definiere hier die Product-Struktur
int main() {
// TODO: Schreibe hier deinen Code
// 1. Erstelle und initialisiere die Product-Variable 'item'
// 2. Deklariere einen Zeiger auf Product namens 'itemPtr'
// 3. Weise 'itemPtr' die Adresse von 'item' zu
// 4. Gib die ursprünglichen Produktinformationen mit dem Punktoperator aus
// 5. Gib die Produktinformationen über den Zeiger mit (*itemPtr).member aus
// 6. Gib die Adressen aus und überprüfe sie
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
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Übe selbstständig: Online-C-Compiler