Menu
Coddy logo textTech

Structs per Wert übergeben

Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 46 von 63.

Nachdem Sie nun wissen, wie man mit Structs und Pointern auf Structs arbeitet, ist es an der Zeit zu lernen, wie man ganze Structs an Funktionen übergibt. Wenn Sie ein Struct als Parameter an eine Funktion übergeben, verwendet C pass-by-value, was bedeutet, dass die Funktion eine vollständige Kopie des Structs 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 entscheidende Konzept, das es zu verstehen gilt, ist, dass alle Änderungen, die Sie an dem struct innerhalb der Funktion vornehmen, das ursprüngliche struct in der aufrufenden Funktion nicht beeinflussen werden. Dies liegt daran, dass die Funktion mit ihrer eigenen Kopie der Daten arbeitet.

Dieser Ansatz ist nützlich, wenn Sie Struct-Daten lesen oder anzeigen möchten, ohne versehentliche Änderungen am Original zu riskieren. Bedenken Sie jedoch, dass das Kopieren großer Structs in Bezug auf Speicher und Leistung ineffizient sein kann.

challenge icon

Aufgabe

Einfach

Erstellen Sie ein C-Programm, das die Übergabe von Structs an Funktionen per Wert (pass-by-value) demonstriert. Ihr Programm sollte:

  1. Ein struct namens Rectangle mit den folgenden Elementen definieren:
    • Ein Integer width, um die Breite des Rechtecks zu speichern
    • Ein Integer height, um die Höhe des Rechtecks zu speichern
    • Ein Zeichen-Array (char array) color der Größe 15, um die Farbe des Rechtecks zu speichern
  2. Eine Funktion namens displayRectangle schreiben, die:
    • Ein Rectangle-Struct als Parameter entgegennimmt (pass-by-value)
    • Die Informationen des Rechtecks in genau diesem Format ausgibt:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Die Fläche (Breite × Höhe) berechnet und ausgibt
  3. Eine Funktion namens modifyRectangle schreiben, die:
    • Ein Rectangle-Struct als Parameter entgegennimmt (pass-by-value)
    • Sowohl die Breite als auch die Höhe des Rechtecks verdoppelt
    • Die Farbe in "Modified" ändert
    • Inside modifyRectangle function: ausgibt
    • displayRectangle aufruft, um das modifizierte Rechteck anzuzeigen
  4. In der main-Funktion:
    • Eine Rectangle-Variable namens rect erstellt
    • Die Breite, Höhe und Farbe von der Eingabe liest und sie den Struct-Elementen zuweist
    • Original rectangle: ausgibt
    • displayRectangle aufruft, um das ursprüngliche Rechteck anzuzeigen
    • modifyRectangle mit dem Rechteck aufruft
    • After modifyRectangle call: ausgibt
    • displayRectangle erneut aufruft, um zu zeigen, dass das ursprüngliche Rechteck unverändert ist

Diese Herausforderung demonstriert das Schlüsselkonzept von pass-by-value bei Structs: Wenn Sie ein Struct an eine Funktion übergeben, erhält die Funktion eine vollständige Kopie des Structs. Alle innerhalb der Funktion vorgenommenen Änderungen betreffen nur die Kopie, nicht das ursprüngliche Struct in der aufrufenden Funktion.

Spickzettel

Beim Übergeben von Structs an Funktionen verwendet C Pass-by-Value (Wertübergabe), was bedeutet, dass die Funktion eine vollständige Kopie des Structs erhält.

Funktionssyntax für die Annahme eines Struct-Parameters:

void functionName(struct StructureName parameterName) {
    // Funktionsrumpf
}

Beispiel mit einem Point-Struct:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

Schlüsselkonzept: Änderungen am Struct innerhalb der Funktion wirken sich nicht auf das ursprüngliche Struct in der aufrufenden Funktion aus, da die Funktion mit ihrer eigenen Kopie der Daten arbeitet.

Dieser Ansatz ist nützlich zum Lesen oder Anzeigen von Struct-Daten, ohne Änderungen am Original zu riskieren, aber das Kopieren großer Structs kann ineffizient sein.

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;
}
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 Logic & Flow