Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Créez un programme en C qui démontre le passage de structures à des fonctions par valeur. Votre programme doit :

  1. Définir une struct nommée Rectangle avec les membres suivants :
    • Un entier width pour stocker la largeur du rectangle
    • Un entier height pour stocker la hauteur du rectangle
    • Un tableau de caractères color de taille 15 pour stocker la couleur du rectangle
  2. Écrire une fonction nommée displayRectangle qui :
    • Prend une structure Rectangle comme 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)
  3. Écrire une fonction nommée modifyRectangle qui :
    • Prend une structure Rectangle comme 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 displayRectangle pour afficher le rectangle modifié
  4. Dans la fonction principale (main) :
    • Créer une variable Rectangle nommée rect
    • 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 displayRectangle pour afficher le rectangle d'origine
    • Appeler modifyRectangle avec le rectangle
    • Afficher After modifyRectangle call:
    • Appeler displayRectangle à nouveau pour montrer que le rectangle d'origine est inchangé

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;
}
quiz iconTestez-vous

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