Passage de structures par valeur
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 46 sur 63.
Maintenant que vous savez comment travailler avec les structures et les pointeurs vers des structures, il est temps d'apprendre comment passer des structures entières à des fonctions. Lorsque vous passez une structure à une fonction en tant que paramètre, le C utilise le passage par valeur, ce qui signifie que la fonction reçoit une copie complète de la structure.
Voici la syntaxe d'une fonction qui accepte une structure comme paramètre :
void functionName(struct StructureName parameterName) {
// Corps de la fonction
}En utilisant notre structure Point habituelle comme exemple :
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}Le concept clé à comprendre est que toute modification que vous apportez à la struct à l'intérieur de la fonction n'affectera pas la struct originale dans la fonction appelante. C'est parce que la fonction travaille avec sa propre copie des données.
Cette approche est utile lorsque vous souhaitez lire ou afficher des données de struct sans risquer de modifications accidentelles de l'original. Cependant, gardez à l'esprit que la copie de grandes structs peut être inefficace en termes de mémoire et de performance.
Défi
FacileCréez un programme en C qui démontre le passage de structures à des fonctions par valeur. Votre programme doit :
- Définir une
structnomméeRectangleavec les membres suivants :- Un entier
widthpour stocker la largeur du rectangle - Un entier
heightpour stocker la hauteur du rectangle - Un tableau de caractères
colorde taille 15 pour stocker la couleur du rectangle
- Un entier
- Écrire une fonction nommée
displayRectanglequi :- Prend une structure
Rectanglecomme paramètre (passage par valeur) - Affiche les informations du rectangle exactement dans ce format :
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- Calcule et affiche l'aire (largeur × hauteur)
- Prend une structure
- Écrire une fonction nommée
modifyRectanglequi :- Prend une structure
Rectanglecomme paramètre (passage par valeur) - Double à la fois la largeur et la hauteur du rectangle
- Change la couleur en "Modified"
- Affiche
Inside modifyRectangle function: - Appelle
displayRectanglepour afficher le rectangle modifié
- Prend une structure
- Dans la fonction principale (main) :
- Créer une variable
Rectanglenomméerect - Lire la largeur, la hauteur et la couleur à partir de l'entrée et les assigner aux membres de la structure
- Afficher
Original rectangle: - Appeler
displayRectanglepour afficher le rectangle d'origine - Appeler
modifyRectangleavec le rectangle - Afficher
After modifyRectangle call: - Appeler
displayRectangleà nouveau pour montrer que le rectangle d'origine est inchangé
- Créer une variable
Ce défi démontre le concept clé du passage par valeur avec les structures : lorsque vous passez une structure à une fonction, la fonction reçoit une copie complète de la structure. Toute modification effectuée à l'intérieur de la fonction n'affecte que la copie, et non la structure originale dans la fonction appelante.
Aide-mémoire
Lors du passage de structures à des fonctions, le C utilise le passage par valeur, ce qui signifie que la fonction reçoit une copie complète de la structure.
Syntaxe de fonction pour accepter un paramètre de structure :
void functionName(struct StructureName parameterName) {
// Corps de la fonction
}Exemple avec une structure Point :
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}Concept clé : les modifications apportées à la structure à l'intérieur de la fonction n'affectent pas la structure originale dans la fonction appelante, puisque la fonction travaille avec sa propre copie des données.
Cette approche est utile pour lire ou afficher les données d'une structure sans risquer de modifier l'original, mais la copie de structures volumineuses peut être inefficace.
Essayez vous-même
#include <stdio.h>
#include <string.h>
// TODO: Définir la structure Rectangle ici
// TODO: Écrire la fonction displayRectangle ici
// TODO: Écrire la fonction modifyRectangle ici
int main() {
// Lire l'entrée
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: Créer la variable Rectangle et assigner les valeurs d'entrée
// TODO: Afficher "Original rectangle:" et appeler displayRectangle
// TODO: Appeler modifyRectangle
// TODO: Afficher "After modifyRectangle call:" et appeler displayRectangle à nouveau
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Les bases des pointeurs
Qu'est-ce qu'un pointeur ?Déclaration de pointeursL'opérateur d'adresse (&)L'opérateur de déréférencement (*)Pointeurs NULLRécapitulatif : Les bases des pointeurs4Projet : Utilitaire de texte simple
Présentation du projetCompter les caractères2Pointeurs et Tableaux
Noms de tableaux comme pointeursÉléments de tableau - PointeursArithmétique des pointeursComparaison de pointeursRécapitulatif : Parcours de tableau par pointeur5Pointeurs et fonctions
Passage par valeurPassage de pointeurs aux fonctionsModifier des variables via des pointeursUn exemple classique : SwapPassage de tableaux aux fonctionsRécapitulatif : Pointeurs comme arguments de fonction8Structures et Pointeurs
Pointeurs vers des structuresL'opérateur flèche (->)Passage de structures par valeurPassage de pointeurs de structuresAllocation dynamique de structuresRécap : Modifier une structure - Ptr3Tableaux de caractères et chaînes
Les chaînes comme tableaux de charLe terminateur nulSaisie de chaînes avec scanfUtilisation de strlen()Utilisation de strcpy()Utilisation de strcat()Utilisation de strcmp()Récapitulatif : Fonctions de base sur les chaînes