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.
Aufgabe
EinfachErstellen Sie ein C-Programm, das die Übergabe von Structs an Funktionen per Wert (pass-by-value) demonstriert. Ihr Programm sollte:
- Ein
structnamensRectanglemit 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)
colorder Größe 15, um die Farbe des Rechtecks zu speichern
- Ein Integer
- Eine Funktion namens
displayRectangleschreiben, 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
- Ein
- Eine Funktion namens
modifyRectangleschreiben, 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:ausgibtdisplayRectangleaufruft, um das modifizierte Rechteck anzuzeigen
- Ein
- In der main-Funktion:
- Eine
Rectangle-Variable namensrecterstellt - Die Breite, Höhe und Farbe von der Eingabe liest und sie den Struct-Elementen 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 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;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
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