Un exemple classique : Swap
Fait partie de la section Logic & Flow du Journey C de Coddy — leçon 28 sur 63.
La fonction swap est l'un des exemples les plus célèbres qui démontre pourquoi les pointeurs sont essentiels dans la programmation en C. L'objectif est simple : écrire une fonction qui échange les valeurs de deux variables. Cependant, cette tâche apparemment simple révèle une limitation fondamentale du passage par valeur.
Considérez ce qui se passe si vous essayez d'échanger deux variables en utilisant le passage par valeur classique :
void badSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
// Cela n'échange que les copies, pas les variables d'origine !
}Cette approche échoue car la fonction ne reçoit que des copies des valeurs. Les variables originales dans la fonction appelante restent inchangées.
La solution nécessite de passer des pointeurs vers les variables à la place :
void swap(int *a, int *b) {
int temp = *a; // Stocke la valeur à l'adresse a
*a = *b; // Place la valeur de l'adresse b dans l'adresse a
*b = temp; // Place la valeur stockée dans l'adresse b
}En passant les adresses des variables et en utilisant l'opérateur de déréférencement, la fonction peut modifier directement les valeurs des variables d'origine. Cela fait de la fonction swap une démonstration parfaite de quand et pourquoi vous avez besoin de pointeurs pour accomplir des tâches que le passage par valeur ne peut tout simplement pas gérer.
Défi
FacileÉcrivez un programme en C qui implémente et démontre la fonction classique d'échange (swap) en utilisant des pointeurs. Votre programme doit :
- Créer une fonction nommée
swapqui prend deux pointeurs vers des entiers en paramètres - À l'intérieur de la fonction
swap, échanger les valeurs aux adresses mémoire pointées par les deux pointeurs en utilisant une variable temporaire - Dans la fonction
main, lire deux entiers à partir de l'entrée utilisateur - Afficher les valeurs d'origine au format :
Before swap: a = [value], b = [value] - Appeler la fonction
swapet passer les adresses des deux variables en utilisant l'opérateur d'adresse - Après l'appel de la fonction, afficher les valeurs échangées au format :
After swap: a = [value], b = [value]
Votre sortie doit démontrer que la fonction échange avec succès les valeurs des variables d'origine :
Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]Ce défi démontre pourquoi les pointeurs sont essentiels pour l'opération d'échange - la fonction doit accéder aux emplacements mémoire des variables d'origine pour échanger leurs valeurs de manière permanente, ce qui est impossible avec le passage par valeur.
Aide-mémoire
La fonction swap démontre pourquoi les pointeurs sont essentiels en C. Le passage par valeur ne peut pas échanger les variables originales car les fonctions ne reçoivent que des copies :
void badSwap(int a, int b) {
int temp = a;
a = b;
b = temp;
// Cela n'échange que les copies, pas les variables originales !
}L'approche correcte utilise des pointeurs pour accéder aux variables originales et les modifier :
void swap(int *a, int *b) {
int temp = *a; // Stocke la valeur à l'adresse a
*a = *b; // Met la valeur de l'adresse b dans l'adresse a
*b = temp; // Met la valeur stockée dans l'adresse b
}En passant des adresses et en utilisant l'opérateur de déréférencement (*), la fonction peut modifier directement les valeurs des variables originales.
Essayez vous-même
#include <stdio.h>
// À FAIRE : Écrivez votre fonction d'échange ici
int main() {
int a, b;
// Lire l'entrée
scanf("%d", &a);
scanf("%d", &b);
// Afficher les valeurs originales
printf("Before swap: a = %d, b = %d\n", a, b);
// À FAIRE : Appelez votre fonction d'échange ici
// Afficher les valeurs échangées
printf("After swap: a = %d, b = %d\n", a, b);
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 fonction3Tableaux 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