diff --git a/base_3.md b/base_3.md index 5b4cf42fe61a315e41629da0ceaaff55c3e517ef..79ba40c504210444e836c2a94da1f9516917ce1f 100644 --- a/base_3.md +++ b/base_3.md @@ -123,6 +123,27 @@ p[0] == *p; // rappel, le pointeur est le premier élément ``` +# Allocation dynamique de mémoire (5/N) + +## Pointeur de pointeur + +- Tout comme une valeur a une adresse, un pointeur a lui-même une adresse: + + ```C + int a = 2; + int *b = &a; + int **c = &b; + ``` +- Chaque `*`{.C} ou `&`{.C} rajoute une indirection. +- Avec `malloc()`, on peut allouer dynamiquement des tableaux de pointeurs: + + ```C + int **p = malloc(50 * sizeof(int*)); + for (int i = 0; i < 50; ++i) { + p[i] = malloc(70 * sizeof(int)); + } + ``` + # Prototypes de fonctions (1/N) ## Principes généraux de programmation @@ -269,3 +290,54 @@ La compilation séparée se fait en plusieurs étapes. ```bash $ gcc main.o sum.o -o prog ``` + +# Préprocesseur (1/N) + +## Généralités + +- Première étape de la chaîne de compilation. +- Géré automatiquement par `gcc` ou `clang`. +- Lit et interprète certaines directives: + 1. Les commentaires (`//`{.C} et `/* ... */`{.C}). + 2. Les commandes commençant par `#`{.C}. +- Le préprocesseur ne compile rien, mais subtitue uniquement du texte. + +## La directive `define`{.C} + +- Permet de définir un symbole: + + ```C + #define PI 3.14159 + #define _SUM_H_ + ``` +- Permet de définir une macro. + + ```C + #define NOM_MACRO(arg1, arg2, ...) [code] + ``` + +# Préprocesseur (2/N) + +## La directive `include`{.C} + +- Permet d'inclure un fichier. +- Le contenu du fichier est ajouté à l'endroit du `#include`{.C}. +- Inclusion de fichiers "globaux" ou "locaux" + + ```C + #include <file.h> // LD_LIBRARY_PATH + #include "other_file.h" // local path + ``` +- Les inclusions multiples peuvent poser problème: définitions multiples. Les headers commencent par: + + ```C + #ifndef _VAR_ + #define _VAR_ + /* + commentaires + */ + #endif + ``` + + +