Introduction aux pointeurs et aux chaînes de caractères en C
Les pointeurs sont au cœur du langage C. Ils permettent d’accéder directement à la mémoire, de manipuler des tableaux dynamiques et de travailler avec les chaînes de caractères. Cette formation reprend les notions essentielles testées dans le quiz, en les illustrant par des exemples concrets et des bonnes pratiques pour éviter les erreurs fréquentes.
1. L’opérateur d’adresse & : obtenir l’adresse d’une variable
L’opérateur & renvoie l’adresse mémoire d’une variable. Cette adresse peut être stockée dans un pointeur du même type.
- Syntaxe :
type *ptr = &variable; - Utilité : passer une variable à une fonction qui doit la modifier directement (passage par référence).
Exemple pratique
int valeur = 10; int *p = &valeur; printf("Adresse de valeur : %p\n", (void*)p);
Dans le quiz, la bonne réponse était &, car les autres propositions (*, sizeof, malloc) n’ont pas cette fonction.
2. Allocation dynamique avec malloc et libération avec free
L’allocation dynamique permet de réserver de la mémoire pendant l’exécution du programme. La fonction malloc renvoie un pointeur void* qui doit être casté ou assigné à un pointeur du type souhaité.
- Allocation d’un tableau de
short:short *tab = malloc(sizeof(short) * taille); - Libération :
free(tab);
Calcul de la taille avec sizeof
Le bon calcul est sizeof(short) * taille. sizeof(taille) donne la taille du compteur lui‑même, pas le nombre d’éléments. Cette confusion est l’un des pièges les plus courants.
L’explication du quiz souligne que free est la seule fonction standard C capable de libérer la zone obtenue avec malloc. Les mots remove, release ou delete n’existent pas dans la bibliothèque C.
3. Affichage d’un pointeur avec printf : le format %p
Pour afficher l’adresse d’un pointeur, on utilise le spécificateur %p. Il attend un argument de type void*. Exemple :
int x = 5; int *p = &x; printf("%p\n", (void*)p);
Les autres formats (%d, %s, %x) ne sont pas adaptés et peuvent produire des résultats imprévisibles.
4. Parcourir des tableaux avec la notation *(A+i)
En C, l’expression *(A+i) équivaut à A[i]. Elle accède à l’élément i‑ème du tableau pointé par A. Cette notation est très utilisée dans les algorithmes qui manipulent des vecteurs.
Produit scalaire (dot product) – exemple complet
Considérons deux vecteurs A et B de même taille n :
int dot_product(int *A, int *B, int n) {
int result = 0;
for (int i = 0; i < n; ++i) {
result += *(A+i) * *(B+i); // produit des éléments i‑èmes
}
return result;
}
Dans le quiz, la bonne réponse était « Produit des éléments i‑èmes des deux vecteurs », ce qui montre que la notation pointeur‑arithmétique donne exactement le même résultat que A[i] * B[i].
5. Chaînes de caractères : terminateur nul \0 et fonctions de string.h
En C, une chaîne de caractères est un tableau de char terminé par le caractère nul \0. Sans ce caractère, les fonctions de la bibliothèque ne savent pas où s’arrêter.
- Création :
char texte[] = "Bonjour";(le compilateur ajoute automatiquement\0). - Fonction de comparaison :
strcmprenvoie 0 lorsque les deux chaînes sont identiques.
Exemple d’utilisation de strcmp
if (strcmp(s1, s2) == 0) {
printf("Les chaînes sont identiques\n");
} else {
printf("Différence détectée\n");
}
L’explication du quiz rappelle que strcmp compare caractère par caractère jusqu’au \0. Les fonctions strcpy, strcat ou strlen n’ont pas ce rôle.
6. Bonnes pratiques et pièges courants
Vérifier toujours le retour de malloc : si la fonction renvoie NULL, la mémoire n’a pas pu être allouée.
Libérer chaque zone allouée avec free avant de perdre le pointeur, afin d’éviter les fuites de mémoire.
Utiliser le bon spécificateur de format (%p pour les adresses, %s pour les chaînes, %d ou %ld pour les entiers) pour garantir un affichage fiable.
Ne jamais oublier le caractère nul lors de la construction manuelle d’une chaîne. Un oubli de \0 conduit à des dépassements de tampon et à des comportements indéfinis.
Préférer la notation tableau (A[i]) pour la lisibilité, sauf lorsqu’une manipulation de pointeurs est explicitement requise (ex. : algorithmes génériques, fonctions de rappel).
Conclusion
Maîtriser les pointeurs, l’allocation dynamique et les chaînes de caractères constitue une étape indispensable pour tout développeur C. En appliquant les concepts présentés – opérateur &, malloc/free, sizeof, %p, notation *(A+i), strcmp et le terminateur \0 – vous serez capable d’écrire du code robuste, lisible et performant. N’hésitez pas à réviser chaque section, à reproduire les exemples et à expérimenter avec vos propres programmes pour consolider vos connaissances.