From 294c558a6189a332e6c25a991ebee129465c3e3e Mon Sep 17 00:00:00 2001
From: Orestis <orestis.malaspinas@pm.me>
Date: Thu, 20 Mar 2025 21:54:23 +0100
Subject: [PATCH] 2025 rulz

---
 slides/pointeurs_avances.md | 92 +++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)
 create mode 100644 slides/pointeurs_avances.md

diff --git a/slides/pointeurs_avances.md b/slides/pointeurs_avances.md
new file mode 100644
index 0000000..0eea725
--- /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.
+
-- 
GitLab