diff --git a/slides/pointeurs_rappel.md b/slides/pointeurs_rappel.md new file mode 100644 index 0000000000000000000000000000000000000000..6cf48b8ce151ea998e49718fb43551f8a855270b --- /dev/null +++ b/slides/pointeurs_rappel.md @@ -0,0 +1,129 @@ +--- +title: "Rappel sur les pointeurs" +date: "2023-02-21" +--- + +# Rappel sur les pointeurs (1/2) + +Pour reprendre dans la joie après les ~~vacances~~ **semaines sans cours**. + +. . . + +## Qu'est-ce qu'un pointeur? + +. . . + +* Un objet qui stocke une adresse mémoire et le type des données pointées. + +. . . + +## Comment déclare-t-on les pointeurs en C? + +. . . + +```C +// type *variable; +double *d; +struct element *e; +``` + +* `double *` est le **type** de `d` et `struct element *` est le **type** de `e`. + +## Comment accède-t-on à la valeur se trouvant à une adresse mémoire? + +. . . + +```C +int c = 2; +// On assigne l'adresse de c au pointeur p_c +int *p_c = &c; +// On déréférence un pointeur +*p_c = 4; +``` + +# Rappel sur les pointeurs (2/2) + +## Quelle est la seule adresse "interdite"? + +. . . + +```C +// l'adresse 0 ou NULL +double *e = NULL; +*e = 10; // Runtime error... +double *e; +*e = 10; // Maybe error (e has a random value)... +``` + +## Qu'est-ce qu'un pointeur n'est pas? + +* Un pointeur **n'est pas** entier (mais bien plus)... +* même si en C on peut convertir un pointeur en entier. +* D'ailleurs, on ne **peut pas** déréférencer un entier + +```C +uint64_t c = 2; +*c = 3; // ERREUR! +``` + +# Comment utilise-t-on les pointeurs? (1/2) + +## Dans les arguments des fonctions + +```C +void modif_argument(int *val) { + *val = 5; +} +int main() { + int var = 4; + modif_argument(&var); // on passe l'adresse de var +} +``` + +. . . + +## Pour allouer de la mémoire sur le tas + +```C +int main() { + int *var = malloc(sizeof(*var)); + struct element *revar = malloc(sizeof(struct element)); + double *tab = malloc(10 * sizeof(*tab)); + free(var); + free(revar); + free(tab); // oui il faut pas oublier de désallouer +} +``` + +# Comment utilise-t-on les pointeurs? (2/2) + +## Allouer de la mémoire sur le tas dans fonction + +```C +void modif_argument(int **val) { + *val = malloc(sizeof(int)); +} +int main() { + int *var = NULL; + modif_argument(&var); // on passe l'adresse de var et donc on alloue +} +``` + +. . . + +## Que se passerait-il si.... + +```C +void modif_argument(int *val) { + val = malloc(sizeof(int)); +} +int main() { + int *var = NULL; + modif_argument(var); +} +``` + +. . . + +* Un code buggé (99.9% du temps) **et** une fuite mémoire... +* Mais avec un peu de chance le code va marcher (comportement indéfini). \ No newline at end of file