Menu
Coddy logo textTech

Übergabe von Struct-Zeigern

Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 47 von 63.

Während das Übergeben von Strukturen als Wert gut zum Lesen von Daten funktioniert, wird es bei großen Strukturen ineffizient, da die gesamte Struktur kopiert wird. Noch wichtiger ist, dass du die ursprüngliche Struktur innerhalb der Funktion nicht ändern kannst. Hier wird das Übergeben von Zeigern auf Strukturen unerlässlich.

Wenn du einen Zeiger auf eine Struktur statt der Struktur selbst übergibst, erhält die Funktion die Speicheradresse der ursprünglichen Struktur. Dieser Ansatz bietet zwei wesentliche Vorteile: Er ist effizienter (keine Kopie) und ermöglicht der Funktion, die ursprünglichen Daten zu ändern.

Die Syntax für eine Funktion, die einen Zeiger auf eine Struktur akzeptiert, lautet:

void functionName(struct StructureName *ptr) {
    // Funktionskörper unter Verwendung von ptr->member
}

Innerhalb der Funktion verwendest du den Pfeiloperator, um auf die Strukturmitglieder zuzugreifen und sie zu ändern. Alle über den Zeiger vorgenommenen Änderungen wirken sich direkt auf die ursprüngliche Struktur in der aufrufenden Funktion aus, wodurch dieser Ansatz perfekt für Funktionen geeignet ist, die Strukturdaten aktualisieren oder umwandeln müssen.

Diese Technik ist grundlegend für die Erstellung effizienter C-Programme, die mit komplexen Datenstrukturen arbeiten, da sie die Leistungsfähigkeit von Zeigern mit der Organisation von Structs kombiniert.

challenge icon

Aufgabe

Einfach

Erstelle ein C-Programm, das demonstriert, wie Zeiger auf Strukturen an Funktionen übergeben werden, um Daten effizient zu ändern. Dein Programm sollte:

  1. Eine struct namens BankAccount mit den folgenden Mitgliedern definieren:
    • Eine Ganzzahl accountNumber zum Speichern der Kontonummer
    • Ein Zeichenarray ownerName der Größe 30 zum Speichern des Namens des Kontoinhabers
    • Eine Gleitkommazahl balance zum Speichern des Kontostands
    • Eine Ganzzahl transactionCount zum Speichern der Anzahl der Transaktionen
  2. Eine Funktion namens depositMoney schreiben, die:
    • Einen Zeiger auf eine BankAccount-Struktur und einen Gleitkommawert als Parameter entgegennimmt
    • Den Betrag mithilfe des Pfeiloperators zum Kontostand addiert
    • Die Anzahl der Transaktionen um 1 erhöht
    • Deposit successful. New balance: [balance] ausgibt
  3. Eine Funktion namens withdrawMoney schreiben, die:
    • Einen Zeiger auf eine BankAccount-Struktur und einen Gleitkommawert als Parameter entgegennimmt
    • Prüft, ob der Abhebungsbetrag größer als der aktuelle Kontostand ist
    • Bei unzureichendem Guthaben Insufficient funds. Current balance: [balance] ausgibt
    • Bei ausreichendem Guthaben den Betrag vom Kontostand abzieht, die Anzahl der Transaktionen erhöht und Withdrawal successful. New balance: [balance] ausgibt
  4. Eine Funktion namens displayAccount schreiben, die:
    • Einen Zeiger auf eine BankAccount-Struktur als Parameter entgegennimmt
    • Die Kontoinformationen in diesem exakten Format ausgibt:
      • Account Information:
      • Account Number: [accountNumber]
      • Owner: [ownerName]
      • Balance: [balance]
      • Transactions: [transactionCount]
  5. In der main-Funktion:
    • Eine BankAccount-Variable namens account erstellen
    • Die Kontonummer, den Namen des Kontoinhabers und den anfänglichen Kontostand aus der Eingabe einlesen
    • Die Anzahl der Transaktionen auf 0 setzen
    • displayAccount aufrufen, um den anfänglichen Kontostand anzuzeigen
    • Einen Einzahlungsbetrag einlesen und depositMoney aufrufen
    • Einen Abhebungsbetrag einlesen und withdrawMoney aufrufen
    • displayAccount aufrufen, um den endgültigen Kontostand anzuzeigen

Diese Aufgabe demonstriert die Vorteile der Übergabe von Zeigern auf Strukturen an Funktionen. Im Gegensatz zur Übergabe per Wert erhalten die Funktionen die Speicheradresse der ursprünglichen Struktur, wodurch sie die ursprünglichen Daten direkt ändern können. Dieser Ansatz ist effizienter (es wird nichts kopiert) und ermöglicht es Funktionen, Strukturwerte in der aufrufenden Funktion dauerhaft zu ändern.

Probier es selbst

#include <stdio.h>
#include <string.h>

// TODO: Definiere hier das BankAccount-Struct

// TODO: Schreibe hier die depositMoney-Funktion

// TODO: Schreibe hier die withdrawMoney-Funktion

// TODO: Schreibe hier die displayAccount-Funktion

int main() {
    // Eingabe lesen
    int accountNum;
    char ownerName[30];
    float initialBalance;
    float depositAmount;
    float withdrawAmount;
    
    scanf("%d", &accountNum);
    scanf("%s", ownerName);
    scanf("%f", &initialBalance);
    scanf("%f", &depositAmount);
    scanf("%f", &withdrawAmount);
    
    // TODO: BankAccount-Variable erstellen und initialisieren
    
    // TODO: displayAccount aufrufen, um den Anfangszustand anzuzeigen
    
    // TODO: depositMoney mit dem Einzahlungsbetrag aufrufen
    
    // TODO: withdrawMoney mit dem Auszahlungsbetrag aufrufen
    
    // TODO: displayAccount aufrufen, um den Endzustand anzuzeigen
    
    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-C-Compiler