Qu'est-ce qu'un pointeur ?
Une case qui contient une adresse
Une variable est une maison qui contient quelque chose ; un pointeur est un papier où est écrite l'adresse de cette maison.
& = opérateur d'adresse · * = accès à la valeur pointée. &a et p valent la même adresse ; a et *p la même valeur.Pointeurs & fonctions
Passage par valeur contre passage par adresse
En C, une fonction reçoit par défaut une copie de ses arguments. Pour modifier l'original, il faut passer son adresse.
void modifier(int x){
x = 20;
}
void modifier(int *x){
*x = 20;
}
C'est le vrai intérêt des pointeurs : swap, retours multiples, gros tableaux qu'on ne veut pas copier — tout repose sur le passage par adresse.
L'allocation dynamique
Réserver de la mémoire à l'exécution
La taille d'un tableau statique est fixée à la compilation. Avec malloc, on réserve la mémoire pendant l'exécution, sur le tas.
Règle d'or : un free pour chaque malloc. Oublier free = fuite de mémoire.
malloc réserve, calloc réserve et met à zéro, realloc redimensionne, free libère. Toujours vérifier NULL et libérer.
Les structures
Regrouper des données sous un même nom
Comment représenter un étudiant (nom, âge, note) ? Aucun type unique ne convient : on crée une structure qui regroupe ces champs.
Une structure regroupe des champs de types différents sous un seul nom.
struct Etudiant e1;
e1.age = 20; // opérateur point
e1.note = 14.5;
printf("%d", e1.age);. via la variable, -> via un pointeur. p->age est juste un raccourci plus lisible pour (*p).age.typedef struct {
char nom[50];
int age;
} Etudiant; // alias : plus besoin de "struct"La récursivité en C
Le cas de base et la pile d'appels
Une fonction qui s'appelle elle-même, avec un cas de base obligatoire et un appel qui s'en rapproche.
int factorielle(int n){
if (n == 0)
return 1; // cas de base
return n * factorielle(n-1); // appel récursif
}Sans cas de base, la pile déborde (Stack Overflow). La descente décompose, la remontée assemble.
Exercices pratiques
Les cinq exercices du guide
À taper, compiler et exécuter — la théorie seule ne suffit pas en C.
struct Livre {
char titre[100];
char auteur[50];
float prix;
};int puissance(int x, int n){
if (n == 0) return 1; // x^0 = 1
return x * puissance(x, n-1); // x^n = x · x^(n-1)
}Etudiant tab[5];
for (int i=0; i<5; i++)
scanf("%f", &tab[i].note);
for (int i=0; i<5; i++)
printf("%f\n", tab[i].note);int n, somme = 0, *tab;
scanf("%d", &n);
tab = malloc(n * sizeof(int));
if (tab == NULL) return 1;
for (int i=0; i<n; i++){
scanf("%d", &tab[i]);
somme += tab[i];
}
printf("Somme = %d\n", somme);
free(tab); tab = NULL;void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
// appel : swap(&x, &y);