Menu
Coddy logo textTech

Passage de pointeurs de structures

Fait partie de la section Logique & Flux du Journey C de Coddy. Leçon 47 sur 63.

Bien que le passage de structures par valeur fonctionne bien pour la lecture de données, cela devient inefficace avec de grandes structures car toute la structure est copiée. Plus important encore, vous ne pouvez pas modifier la structure originale depuis l'intérieur de la fonction. C'est là que le passage de pointeurs vers des structures devient essentiel.

Lorsque vous passez un pointeur vers une struct au lieu de la struct elle-même, la fonction reçoit l'adresse mémoire de la struct originale. Cette approche offre deux avantages clés : elle est plus efficace (pas de copie) et permet à la fonction de modifier les données originales.

La syntaxe d'une fonction qui accepte un pointeur vers une structure est :

void functionName(struct StructureName *ptr) {
    // Corps de la fonction utilisant ptr->member
}

À l'intérieur de la fonction, vous utilisez l'opérateur flèche pour accéder aux membres de la struct et les modifier. Toute modification effectuée via le pointeur affectera directement la struct originale dans la fonction appelante, rendant cette approche idéale pour les fonctions qui doivent mettre à jour ou transformer les données de la struct.

Cette technique est fondamentale pour construire des programmes C efficaces qui manipulent des structures de données complexes, car elle combine la puissance des pointeurs avec l'organisation des structs.

challenge icon

Défi

Facile

Créez un programme en C qui démontre le passage de pointeurs vers des structures à des fonctions pour modifier efficacement les données. Votre programme doit :

  1. Définir une struct nommée BankAccount avec les membres suivants :
    • Un entier accountNumber pour stocker le numéro du compte
    • Un tableau de caractères ownerName de taille 30 pour stocker le nom du titulaire du compte
    • Un flottant balance pour stocker le solde du compte
    • Un entier transactionCount pour stocker le nombre de transactions
  2. Écrire une fonction nommée depositMoney qui :
    • Prend en paramètres un pointeur vers une structure BankAccount et un montant flottant
    • Ajoute le montant au solde du compte à l’aide de l’opérateur flèche
    • Incrémente le nombre de transactions de 1
    • Affiche Deposit successful. New balance: [balance]
  3. Écrire une fonction nommée withdrawMoney qui :
    • Prend en paramètres un pointeur vers une structure BankAccount et un montant flottant
    • Vérifie si le montant du retrait est supérieur au solde actuel
    • Si les fonds sont insuffisants, affiche Insufficient funds. Current balance: [balance]
    • Si les fonds sont suffisants, soustrait le montant du solde, incrémente le nombre de transactions et affiche Withdrawal successful. New balance: [balance]
  4. Écrire une fonction nommée displayAccount qui :
    • Prend en paramètre un pointeur vers une structure BankAccount
    • Affiche les informations du compte dans ce format exact :
      • Account Information:
      • Account Number: [accountNumber]
      • Owner: [ownerName]
      • Balance: [balance]
      • Transactions: [transactionCount]
  5. Dans la fonction main :
    • Créer une variable BankAccount nommée account
    • Lire le numéro du compte, le nom du titulaire et le solde initial depuis l’entrée
    • Définir le nombre de transactions à 0
    • Appeler displayAccount pour afficher l’état initial du compte
    • Lire un montant de dépôt et appeler depositMoney
    • Lire un montant de retrait et appeler withdrawMoney
    • Appeler displayAccount pour afficher l’état final du compte

Ce défi démontre la puissance du passage de pointeurs vers des structures à des fonctions. Contrairement au passage par valeur, les fonctions reçoivent l’adresse mémoire de la structure d’origine, ce qui leur permet de modifier directement les données d’origine. Cette approche est plus efficace (aucune copie) et permet aux fonctions de modifier définitivement les valeurs de la structure dans la fonction appelante.

Essayez vous-même

#include <stdio.h>
#include <string.h>

// TODO: Définir la structure BankAccount ici

// TODO: Écrire la fonction depositMoney ici

// TODO: Écrire la fonction withdrawMoney ici

// TODO: Écrire la fonction displayAccount ici

int main() {
    // Lire l'entrée
    int accountNum;
    char ownerName[30];
    float initialBalance;
    float depositAmount;
    float withdrawAmount;
    
    scanf("%d", &accountNum);
    scanf("%s", ownerName);
    scanf("%f", &initialBalance);
    scanf("%f", &depositAmount);
    scanf("%f", &withdrawAmount);
    
    // TODO: Créer la variable BankAccount et l'initialiser
    
    // TODO: Appeler displayAccount pour afficher l'état initial
    
    // TODO: Appeler depositMoney avec le montant du dépôt
    
    // TODO: Appeler withdrawMoney avec le montant du retrait
    
    // TODO: Appeler displayAccount pour afficher l'état final
    
    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 Logique & Flux

Entraînez-vous par vous-même : Compilateur C en ligne