diff --git a/base_2.md b/base_2.md
index 800e115564ec7779cc5210fd43611a18671ecbcc..88025fd9abb6f2799997d162c7e304320aa798d5 100644
--- a/base_2.md
+++ b/base_2.md
@@ -18,7 +18,7 @@ switch (expression) {
 }
 ```
 
-**Que se passe-t-il si `break`{C} est absent?**
+**Que se passe-t-il si `break`{.C} est absent?**
 
 # Structures de contrôle: `switch`{.C} .. `case`{.C} (2/2)
 
@@ -43,7 +43,7 @@ switch (x) {
 
 ## [Quiz: `switch ... case`{.C}](https://cyberlearn.hes-so.ch/mod/evoting/view.php?id=1033916)
 
-# Structures de contrôle: `for`{.C} (1/2)
+# Structures de contrôle: `for`{.C}
 
 ## La boucle `for`{.C}
 
@@ -66,7 +66,7 @@ for (int i = 0; i != 1; i = rand() % 4) { // ésotérique
 }
 ```
 
-# Structures de contrôle: `continue`{.C}, `break`{.C} (2/2)
+# Structures de contrôle: `continue`{.C}, `break`{.C}
 
 - `continue`{.C} saute à la prochaine itération d'une boucle.
 
@@ -92,6 +92,36 @@ for (int i = 0; i != 1; i = rand() % 4) { // ésotérique
     }
     ```
 
+# Représentation des variables en mémoire (1/2)
+
+## La mémoire
+
+* La mémoire est:
+    - ... un ensemble de bits,
+    - ... accessible via des adresses,
+
+  +------+----------+----------+------+----------+------+------+
+  | bits | 00110101 | 10010000 | .... | 00110011 | .... | .... |
+  +======+==========+==========+======+==========+======+======+
+  | addr | 2000     | 2001     | .... | 4000     | .... | .... |
+  +------+----------+----------+------+----------+------+------+
+
+    - ... gérée par le système d'exploitation.
+    - ... séparée en deux parties: **la pile** et **le tas**.
+
+## Une variable
+
+* Une variable, `type a = valeur`{.C}, possède:
+    - un type (`char`{.C}, `int`{.C}, ...),
+    - un contenu (une séquence de bits qui encode `valeur`{.C}),
+    - une adresse mémoire (accessible via `&a`{.C}),
+    - une portée.
+
+
+# Représentation des variables en mémoire (2/2)
+
+![Les variables en mémoire.](figs/memory.svg){#fig:memory width=100%}
+
 # Les fonctions (1/7)
 
 - Les parties indépendantes d'un programme.
@@ -280,169 +310,3 @@ $ echo $?
 $ if [ $? -eq 0 ]; then echo "OK" ; else echo "ERROR"; fi
 ERROR # si tout s'est mal passé
 ```
-
-# Les tableaux (1/6)
-
-## Généralités
-
-- `C` offre uniquement des tableaux statiques
-    - Un tableau est un "bloc" de mémoire contiguë associé à un nom
-        - taille fixe déterminée à la déclaration du tableau
-        - la taille ne peut pas être changée.
-    - Pas d’assignation de tableaux.
-    - Un tableau déclaré dans une fonction ou un bloc est détruit à la sortie de celle/celui-ci
-        - $\Rightarrow$ Un tableau local à une fonction ne doit **jamais être retourné** (aussi valable pour toute variable locale)!
-- Les éléments d’un tableau sont accédés avec `[i]`{.C} où `i`{.C} est l’index de l’élément.
-- Le premier élément du tableau à l’index `0`{.C}!
-- Lorsqu’un tableau est déclaré, la taille de celui-ci doit toujours être spécifiée, sauf s’il est initialisé lors de sa déclaration.
-
-# Les tableaux (2/6)
-
-## Exemple
-
-```C
-float tab1[5]; // tableau de floats à 5 éléments
-               // ses valeurs sont indéfinies
-
-int tab2[] = {1, 2, 3}; // tableau de 3 entiers, 
-                        // taille inférée
-
-int val = tab2[1]; // val vaut 2 à présent
-
-int w = tab1[5]; // index hors des limites du tableau
-                 // comportement indéfini!
-                 // pas d'erreur du compilateur
-```
-
-<!-- TODO QUIZ:
-
-```C
-int a1[5]; // OK
-int a2[] = { 1, 2, 3 }; // OK
-int a3[4][5]; // OK
-int [] a4;  // Erreur
-int a5[];   // Erreur
-
-int[] function(void) {  // Erreur
-	int array[5];   // OK
-	return array;   // Erreur
-}
-
-void foo(int a[]) {  // OK
-	a[3] = 0;  // OK
-}
-
-void bar(void) {
-	int a[5]; // OK
-	foo(a);   // OK
-	a = a5;   // Erreur
-}
-``` -->
-
-<!-- ```C
-#include <stdio.h>
-
-int main(void) {
-	char i;
-	char a1[] = { 100,200,300,400,500 };
-	char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
-	a2[10] = 42;
-
-	for (i = 0; i < 5; i++) {
-		printf("a1[%d] = %d\n", i, a1[i]);
-	}
-
-	return 0;
-}
-``` -->
-# Les tableaux (3/6)
-
-## Itérer sur les éléments d'un tableau
-
-```C
-int x[10];
-for (int i = 0; i < 10; ++i) {
-    x[i] = 0;
-}
-int j = 0;
-while (j < 10) {
-    x[j] = 1;
-    j += 1;
-}
-int j = 0;
-do {
-    x[j] = -1;
-    j += 1;
-} while (j < 9)
-```
-
-
-# Les tableaux (4/6)
-
-## Les tableaux comme argument
-
-- Un tableau est le pointeur vers sa première case.
-- Pas moyen de connaître sa taille: `sizeof()`{.C} inutile.
-- Toujours spécifier la taille d'un tableau passé en argument.
-
-    ```C
-    void foo(int tab[]) { // sans taille...
-        for (int i = 0; i < ?; ++i) {
-            // on sait pas quoi mettre pour ?
-            printf("tab[%d] = %d\n", i, tab[i]);
-        }
-    }
-    // n doit venir avant tab, [n] optionnel
-    void bar(int n, int tab[n]) {
-        for (int i = 0; i < n; ++i) {
-            printf("tab[%d] = %d\n", i, tab[i]);
-        }
-    }
-    ```
-
-# Les tableaux (5/6)
-
-## Quels sont les bugs dans ce code?
-
-```C
-#include <stdio.h>
-
-int main(void) {
-	char i;
-	char a1[] = { 100,200,300,400,500 };
-	char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
-	a2[10] = 42;
-
-	for (i = 0; i < 5; i++) {
-		printf("a1[%d] = %d\n", i, a1[i]);
-	}
-
-	return 0;
-}
-```
-
-# Les tableaux (6/6)
-
-## Quels sont les bugs dans ce code?
-
-```C
-#include <stdio.h>
-
-int main(void) {
-	char i;
-    // 200, .., 500 char overflow
-	char a1[] = { 100,200,300,400,500 };
-	char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
-	a2[10] = 42; // [10] out of bounds
-
-	for (i = 0; i < 5; i++) {
-		printf("a1[%d] = %d\n", i, a1[i]);
-	}
-
-	return 0;
-}
-```
-
-<!-- TODO quiz:  -->
-
-<!-- que retourne sizeof(tab[]) -->
diff --git a/base_3.md b/base_3.md
index ed52aeb57cf2565c7ac0fd9478fe4085adcf33e0..0bef38e4aa447f3ae8b304a2ee0915f9ae3c225f 100644
--- a/base_3.md
+++ b/base_3.md
@@ -2,6 +2,172 @@
 % Inspirés des slides de F. Glück
 % 2 octobre 2019
 
+# Les tableaux (1/6)
+
+## Généralités
+
+- `C` offre uniquement des tableaux statiques
+    - Un tableau est un "bloc" de mémoire contiguë associé à un nom
+        - taille fixe déterminée à la déclaration du tableau
+        - la taille ne peut pas être changée.
+    - Pas d’assignation de tableaux.
+    - Un tableau déclaré dans une fonction ou un bloc est détruit à la sortie de celle/celui-ci
+        - $\Rightarrow$ Un tableau local à une fonction ne doit **jamais être retourné** (aussi valable pour toute variable locale)!
+- Les éléments d’un tableau sont accédés avec `[i]`{.C} où `i`{.C} est l’index de l’élément.
+- Le premier élément du tableau à l’index `0`{.C}!
+- Lorsqu’un tableau est déclaré, la taille de celui-ci doit toujours être spécifiée, sauf s’il est initialisé lors de sa déclaration.
+
+# Les tableaux (2/6)
+
+## Exemple
+
+```C
+float tab1[5]; // tableau de floats à 5 éléments
+               // ses valeurs sont indéfinies
+
+int tab2[] = {1, 2, 3}; // tableau de 3 entiers, 
+                        // taille inférée
+
+int val = tab2[1]; // val vaut 2 à présent
+
+int w = tab1[5]; // index hors des limites du tableau
+                 // comportement indéfini!
+                 // pas d'erreur du compilateur
+```
+
+<!-- TODO QUIZ:
+
+```C
+int a1[5]; // OK
+int a2[] = { 1, 2, 3 }; // OK
+int a3[4][5]; // OK
+int [] a4;  // Erreur
+int a5[];   // Erreur
+
+int[] function(void) {  // Erreur
+	int array[5];   // OK
+	return array;   // Erreur
+}
+
+void foo(int a[]) {  // OK
+	a[3] = 0;  // OK
+}
+
+void bar(void) {
+	int a[5]; // OK
+	foo(a);   // OK
+	a = a5;   // Erreur
+}
+``` -->
+
+<!-- ```C
+#include <stdio.h>
+
+int main(void) {
+	char i;
+	char a1[] = { 100,200,300,400,500 };
+	char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+	a2[10] = 42;
+
+	for (i = 0; i < 5; i++) {
+		printf("a1[%d] = %d\n", i, a1[i]);
+	}
+
+	return 0;
+}
+``` -->
+# Les tableaux (3/6)
+
+## Itérer sur les éléments d'un tableau
+
+```C
+int x[10];
+for (int i = 0; i < 10; ++i) {
+    x[i] = 0;
+}
+int j = 0;
+while (j < 10) {
+    x[j] = 1;
+    j += 1;
+}
+int j = 0;
+do {
+    x[j] = -1;
+    j += 1;
+} while (j < 9)
+```
+
+
+# Les tableaux (4/6)
+
+## Les tableaux comme argument
+
+- Un tableau est le pointeur vers sa première case.
+- Pas moyen de connaître sa taille: `sizeof()`{.C} inutile.
+- Toujours spécifier la taille d'un tableau passé en argument.
+
+    ```C
+    void foo(int tab[]) { // sans taille...
+        for (int i = 0; i < ?; ++i) {
+            // on sait pas quoi mettre pour ?
+            printf("tab[%d] = %d\n", i, tab[i]);
+        }
+    }
+    // n doit venir avant tab, [n] optionnel
+    void bar(int n, int tab[n]) {
+        for (int i = 0; i < n; ++i) {
+            printf("tab[%d] = %d\n", i, tab[i]);
+        }
+    }
+    ```
+
+# Les tableaux (5/6)
+
+## Quels sont les bugs dans ce code?
+
+```C
+#include <stdio.h>
+
+int main(void) {
+	char i;
+	char a1[] = { 100,200,300,400,500 };
+	char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+	a2[10] = 42;
+
+	for (i = 0; i < 5; i++) {
+		printf("a1[%d] = %d\n", i, a1[i]);
+	}
+
+	return 0;
+}
+```
+
+# Les tableaux (6/6)
+
+## Quels sont les bugs dans ce code?
+
+```C
+#include <stdio.h>
+
+int main(void) {
+	char i;
+    // 200, .., 500 char overflow
+	char a1[] = { 100,200,300,400,500 };
+	char a2[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
+	a2[10] = 42; // [10] out of bounds
+
+	for (i = 0; i < 5; i++) {
+		printf("a1[%d] = %d\n", i, a1[i]);
+	}
+
+	return 0;
+}
+```
+
+<!-- TODO quiz:  -->
+
+<!-- que retourne sizeof(tab[]) -->
+
 # Représentation des variables en mémoire (1/N)
 
 ## La mémoire