diff --git a/essential_rust.tex b/essential_rust.tex
index 1987c6f0a7abdbf71b96f20d18cc77402b152f70..c65c3744e946de2dd5889b97967e14c91a6e1bb3 100644
--- a/essential_rust.tex
+++ b/essential_rust.tex
@@ -1109,7 +1109,7 @@ fn main() {
     let handle = thread::spawn(move || {
         println!("{:?}", vector);   // "[1, 2, 3]"
     });
-    
+
     // \textbf{vector} est inutilisable, vu que cette scope n'a plus l'appartenance de cette variable.
 
     handle.join().unwrap();
@@ -1323,4 +1323,83 @@ struct User {
 }
 \end{lstlisting}
 
+\section{Notions avancées}
+
+\subsection{Tout est une expression}
+\label{expressionsEverywhere}
+
+\subsection{Déstructuration}
+\label{advancedDestructuring}
+
+\subsection{Chaînes de caractères}
+\label{advancedStrings}
+
+\subsection{Macros}
+\label{advancedMacros}
+
+\subsection{Lifetimes}
+\label{advancedLifetimes}
+
+\subsection{Conteneurs}
+
+Les conteneurs sont des structures permettant de stocker des données.
+
+Toute variable qui a une taille connue (types primitifs, tableaux de taille fixe, ...)
+sera stockée dans la pile.
+
+\begin{lstlisting}[style=Rust, language=Rust]
+fn main() {
+    // Tuple contenant des données de différents types.
+    let t: (i32, &str, f64) = (1, "Hello", 3.4);
+
+    // Il est possible de déstructurer le tuple...
+    let (a, b, c) = t;
+
+    // ... ou bien de récupérer des éléments grâce à des index.
+    let s = t.1;
+
+    println!("{} {} {} {}", a, b, c, s);   // "1 Hello 3.4 Hello"
+}
+\end{lstlisting}
+
+\vspace{.5cm}
+
+Toute variable qui n'a pas de taille connue (vecteurs, chaîne de caractères...) sera stockée dans le tas.
+
+\begin{lstlisting}[style=Rust, language=Rust]
+fn main() {
+    // Tableau de 5 éléments de \textbf{i32}.
+    let array: [i32; 5] = [1, 2, 3, 4, 5];
+
+    // Pour les tableaux, il n'existe pas une façon unique de les représenter.
+    // Ainsi, on utilise \textbf{{:?}} permettant d'afficher dans un format de débug.
+    println!("{:?}", array);   // "[1, 2, 3, 4, 5]"
+
+    // Vecteur de \textbf{i32}.
+    // \textbf{vec!} permet d'initialiser des valeurs.
+    let mut vector: Vec<i32> = vec![1, 2, 3, 4];
+
+    // Ajout de la valeur \textbf{5} à la fin du vecteur.
+    vector.push(5);
+
+    // Slice d'un vecteur, cela fonctionne comme un slice d'une chaîne de caractères.
+    let slice: &[i32] = &vector;
+    
+    println!("{:?} {:?}", vector, slice);   // "[1, 2, 3, 4, 5] [1, 2, 3, 4, 5]"
+}
+\end{lstlisting}
+
+\vspace{.5cm}
+
+Pour forcer le passage vers le tas, la structure de donnée \texttt{Box} doit être utilisée.
+
+\begin{lstlisting}[style=Rust, language=Rust]
+fn main() {
+    // Box de \textbf{i32}
+    let a: Box<i32> = Box::new(5);
+
+    println!("a = {}", a);   // "a = 5"
+}
+\end{lstlisting}
+
 \end{document}