Menu
Coddy logo textTech

Pointeur vs Valeur

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 9 sur 61.

Lorsque tu passes une structure à une fonction, C te donne deux options : la passer par valeur (copier la structure entière) ou la passer par pointeur (copier uniquement l’adresse). Ce choix a une incidence importante sur les performances.

Le passage par valeur crée une copie complète de la structure sur la pile. Pour une petite structure contenant quelques entiers, cela convient. Mais imagine une structure de centaines de octets : chaque appel de fonction copie toutes ces données :

typedef struct {
    char name[100];
    int scores[50];
    double average;
} Student;

// Par valeur : copie ~308 octets à chaque appel
void print_by_value(Student s) {
    printf("%s: %.2f\n", s.name, s.average);
}

// Par pointeur : ne copie que 8 octets (l'adresse)
void print_by_pointer(const Student *s) {
    printf("%s: %.2f\n", s->name, s->average);
}

La syntaxe diffère également. Avec un paramètre de valeur, vous utilisez l’opérateur point (s.name). Avec un pointeur, vous utilisez l’opérateur flèche (s->name).

La version avec pointeur est plus efficace, car elle ne transmet qu’une adresse mémoire, généralement de 8 octets quelle que soit la taille de la structure.

C’est pourquoi les programmeurs en C transmettent presque toujours les structures par pointeur. Utilisez const lorsque la fonction ne doit pas modifier les données, et un pointeur ordinaire lorsqu’elle le doit. Vous obtenez ainsi à la fois de l’efficacité et une intention claire.

challenge icon

Défi

Facile

Construisons un module Product qui illustre la différence entre le passage de structures par valeur et par pointeur. Tu vas créer deux fonctions d’affichage : l’une qui reçoit la structure entière sous forme de copie, et l’autre qui reçoit simplement un pointeur vers celle-ci.

Tu vas créer trois fichiers :

  • product.h : déclarer une structure Product avec trois membres : char name[50], double price et int quantity. Déclarer également deux fonctions :
    • display_by_value : prend un Product par valeur et affiche ses informations
    • display_by_pointer : prend un const Product * et affiche les mêmes informations
    Utiliser des gardes d’inclusion avec le symbole PRODUCT_H.
  • product.c : implémenter les deux fonctions. Remarque la différence de syntaxe : la version par valeur utilise l’opérateur point (p.name), tandis que la version avec pointeur utilise l’opérateur flèche (p->name). Les deux fonctions doivent afficher les informations dans le même format.
  • main.c : créer un Product, puis appeler les deux fonctions d’affichage pour montrer qu’elles produisent une sortie identique malgré l’utilisation de styles de paramètres différents.

Tu recevras trois entrées : le nom du produit (une chaîne de caractères), le prix (un double) et la quantité (un entier).

Dans ton fichier main, initialise un Product avec ces valeurs, puis appelle display_by_value suivi de display_by_pointer.

Les deux fonctions doivent afficher les informations dans ce format :

Product: {name}, Price: {price}, Qty: {quantity}

Utilise %.2f pour le prix afin d’afficher deux décimales.

Par exemple, avec les entrées Laptop, 999.99 et 5, la sortie serait :

Product: Laptop, Price: 999.99, Qty: 5
Product: Laptop, Price: 999.99, Qty: 5

Essayez vous-même

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

int main() {
    char name[50];
    double price;
    int quantity;
    
    // Lire les entrées
    scanf("%s", name);
    scanf("%lf", &price);
    scanf("%d", &quantity);
    
    // TODO: Créer une variable Product et l'initialiser avec les valeurs d'entrée
    // Indice : Utilisez strcpy pour copier le name dans le champ name de la structure
    
    // TODO: Appeler display_by_value avec le Product
    
    // TODO: Appeler display_by_pointer avec un pointeur vers le Product
    
    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 Programmation Orientée Objet

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