diff --git a/slides/pointeurs_avances.md b/slides/pointeurs_avances.md new file mode 100644 index 0000000000000000000000000000000000000000..0eea725dc00afb54874ce92535c49ec096a51e61 --- /dev/null +++ b/slides/pointeurs_avances.md @@ -0,0 +1,92 @@ +--- +title: "Pointeurs avancés" +date: "2025-03-21" +--- + +# Pointeurs et `const` + +\footnotesize + +- Le mot-clé `const` permet de déclarer des valeurs **constantes** qui ne changeront plus en cours d'exécution du programme. + + ```C + const int a = 1; + a = 2; // interdit, erreur de compilation! + ``` + +## Deux niveaux de constance + +- Mais qu'est-ce que cela veut dire pour les pointeurs? +* Constance de la valeur de l'adresse? de la valeur pointée? des deux? + + ```C + int n = 12; + const int *p = &n; // la valeur *p est const, p non + int const *p = &n; // la valeur *p est const, p non + int *const p = &n; // la valeur p est const, *p non + const int *const p = &n; // la valeur p et *p sont const + ``` + +# Pointeurs et `const` + +## Exemples + +```C +int n = 12; int m = 13; +const int *p = &n; // la valeur *p est const, p non +*p = m; // erreur de compilation. +p = &m; // OK +int const *p = &n; // la valeur *p est const, p non +*p = m; // erreur de compilation. +p = &m; // OK +int *const p = &n; // la valeur p est const, *p non +*p = m; // OK +p = &m; // erreur de compilation. +const int *const p = &n; // la valeur p et *p sont const +*p = m; // erreur de compilation. +p = &m; // erreur de compilation. +``` + +# Rappel: pointeurs et fonction + +## Faites un dessin de ce qui se passe en mémoire + +```C +void foo(int *a) { + *a = 3; +} +void bar(int a) { + a = 12; +} +int main() { + int a = 1; + foo(&a); // Que vaut a? + bar(a); // Que vaut a? +} +``` + +# Pointeurs et `const` + +## Fonctions + +```C +void foo(int *a); +void foo(const int *a); // on pourra pas changer *a +void foo(int *const a); // inutile on peut pas changer a +void foo(const int *const a); // identique à ci-dessus +``` + +## Mais..... + +```C +const int a = 0; +int *b = (int *)&a; +*b = 7; +printf("a = %d\n", a); // affiche quoi? +``` + +# Utilité + +* Permet d'empêcher une mauvaise utilisation des arguments, +* Permet de documenter le code: on sait que la variable ne sera pas modifiée. +