Structs per Wert übergeben
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 46 von 63.
Da du nun weißt, wie man mit Strukturen und Zeigern auf Strukturen arbeitet, ist es an der Zeit zu lernen, wie man ganze Strukturen an Funktionen übergibt. Wenn du eine Struktur als Parameter an eine Funktion übergibst, verwendet C die Wertübergabe, was bedeutet, dass die Funktion eine vollständige Kopie der Struktur erhält.
Hier ist die Syntax für eine Funktion, die einen Struct-Parameter akzeptiert:
void functionName(struct StructureName parameterName) {
// Funktionskörper
}Unter Verwendung unserer bekannten Point-Struktur als Beispiel:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}Das zentrale Konzept, das du verstehen solltest, ist, dass alle Änderungen, die du an der Struktur innerhalb der Funktion vornimmst, die ursprüngliche Struktur in der aufrufenden Funktion nicht beeinflussen werden. Das liegt daran, dass die Funktion mit ihrer eigenen Kopie der Daten arbeitet.
Dieser Ansatz ist nützlich, wenn du Struct-Daten lesen oder anzeigen möchtest, ohne versehentliche Änderungen am Original zu riskieren. Denke jedoch daran, dass das Kopieren großer Structs in Bezug auf Speicher und Leistung ineffizient sein kann.
Aufgabe
EinfachErstelle ein C-Programm, das die Übergabe von Strukturen an Funktionen per Wert demonstriert. Dein Programm sollte:
- Eine
structnamensRectanglemit den folgenden Mitgliedern definieren:- Eine Ganzzahl
width, um die Breite des Rechtecks zu speichern - Eine Ganzzahl
height, um die Höhe des Rechtecks zu speichern - Ein Zeichen-Array
colormit der Größe 15, um die Farbe des Rechtecks zu speichern
- Eine Ganzzahl
- Eine Funktion namens
displayRectangleschreiben, die:- Eine
Rectangle-Struktur als Parameter entgegennimmt (Übergabe per Wert) - Die Informationen zum Rechteck in genau diesem Format ausgibt:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- Die Fläche berechnet und ausgibt (Breite × Höhe)
- Eine
- Eine Funktion namens
modifyRectangleschreiben, die:- Eine
Rectangle-Struktur als Parameter entgegennimmt (Übergabe per Wert) - Sowohl die Breite als auch die Höhe des Rechtecks verdoppelt
- Die Farbe in "Modified" ändert
Inside modifyRectangle function:ausgibtdisplayRectangleaufruft, um das geänderte Rechteck anzuzeigen
- Eine
- In der main-Funktion:
- Eine
Rectangle-Variable namensrecterstellt - Die Breite, Höhe und Farbe aus der Eingabe liest und den Strukturmitgliedern zuweist
Original rectangle:ausgibtdisplayRectangleaufruft, um das ursprüngliche Rechteck anzuzeigenmodifyRectanglemit dem Rechteck aufruftAfter modifyRectangle call:ausgibtdisplayRectangleerneut aufruft, um zu zeigen, dass das ursprüngliche Rechteck unverändert ist
- Eine
Diese Aufgabe demonstriert das zentrale Konzept der Übergabe per Wert bei Strukturen: Wenn du eine Struktur an eine Funktion übergibst, erhält die Funktion eine vollständige Kopie der Struktur. Alle innerhalb der Funktion vorgenommenen Änderungen wirken sich nur auf die Kopie aus, nicht auf die ursprüngliche Struktur in der aufrufenden Funktion.
Probier es selbst
#include <stdio.h>
#include <string.h>
// TODO: Definieren Sie hier das Rectangle-Struct
// TODO: Schreiben Sie hier die displayRectangle-Funktion
// TODO: Schreiben Sie hier die modifyRectangle-Funktion
int main() {
// Eingabe lesen
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: Rectangle-Variable erstellen und Eingabewerte zuweisen
// TODO: "Original rectangle:" ausgeben und displayRectangle aufrufen
// TODO: modifyRectangle aufrufen
// TODO: "After modifyRectangle call:" ausgeben und displayRectangle erneut aufrufen
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