Ü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.
Aufgabe
EinfachErstelle ein C-Programm, das demonstriert, wie Zeiger auf Strukturen an Funktionen übergeben werden, um Daten effizient zu ändern. Dein Programm sollte:
- Eine
structnamensBankAccountmit den folgenden Mitgliedern definieren:- Eine Ganzzahl
accountNumberzum Speichern der Kontonummer - Ein Zeichenarray
ownerNameder Größe 30 zum Speichern des Namens des Kontoinhabers - Eine Gleitkommazahl
balancezum Speichern des Kontostands - Eine Ganzzahl
transactionCountzum Speichern der Anzahl der Transaktionen
- Eine Ganzzahl
- Eine Funktion namens
depositMoneyschreiben, 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
- Einen Zeiger auf eine
- Eine Funktion namens
withdrawMoneyschreiben, 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
- Einen Zeiger auf eine
- Eine Funktion namens
displayAccountschreiben, 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]
- Einen Zeiger auf eine
- In der main-Funktion:
- Eine
BankAccount-Variable namensaccounterstellen - Die Kontonummer, den Namen des Kontoinhabers und den anfänglichen Kontostand aus der Eingabe einlesen
- Die Anzahl der Transaktionen auf 0 setzen
displayAccountaufrufen, um den anfänglichen Kontostand anzuzeigen- Einen Einzahlungsbetrag einlesen und
depositMoneyaufrufen - Einen Abhebungsbetrag einlesen und
withdrawMoneyaufrufen displayAccountaufrufen, um den endgültigen Kontostand anzuzeigen
- Eine
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;
}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