diff --git a/base_2.md b/base_2.md index b3f34fcebc1b553716140e34d2d9aeece2a96d1e..1f5189a56714beb8b31f3691c56e1f0d007dacfb 100644 --- a/base_2.md +++ b/base_2.md @@ -67,6 +67,82 @@ } ``` +# Les fonctions (4/N) + +## Arguments de fonctions + +- Les arguments d'une fonction sont toujours passés **par copie**. +- Les arguments d'une fonction ne peuvent **jamais** être modifiés. + + ```C + void set_to_two(int a) { // a est une nouvelle variable + // la valeur de a une copie de celle passée en argument + // lorsque la fonction est appelée, ici -1 + + a = 2; // la valeur de a est fixée à 2 + } // a est détruite + + int main() { + int x = -1; + set_to_two(x); // -1 est passé en argument + // x vaudra toujours -1 ici + } + ``` + +# Les fonctions (5/N) + +## Arguments de fonctions: pointeurs + +- Pour modifier un variable, il faut passer son **adresse mémoire**. +- L'adresse d'une variable, `x`{.C}, est accédé par `&x`{.C}. +- Un **pointeur** vers une variable entière a le type, `int *x`{.C}. +- La sytaxe `*x`{.C} sert à **déréférencer** le pointeur. + + ```C + void set_to_two(int *a) { + // a contient une copie de l'adresse de la + // variable passée en argument + + *a = 2; // on accède à la valeur pointée par a, + // et on lui assigne 2 + } // le pointeur est détruit, pas la valeur pointée + int main() { + int x = -1; + set_to_two(&x); // l'adresse de x est passée + // x vaudra 2 ici + } + ``` + +<!-- TODO quiz; +```C +void set_to_two(int *a) { + a = 2; +} +int main() { + int x = -1; + set_to_two(&x); +} + + +void add_two(int *a) { + *a += 2; +} + +int main() { + int x = -1; + add_two(&x); +} + +void add_two(int a) { + a += 2; + printf("%d", a); +} +int main() { + int x = -1; + add_two(&x); +} +``` --> + # La fonction `main()` (1/N) ## Généralités @@ -101,3 +177,104 @@ $ echo $? $ if [ $? -eq 0 ]; then echo "OK" ; else echo "ERROR"; fi ERROR # si tout s'est mal passé ``` + +# Les tableaux (1/N) + +## Généralités + +- C offre uniquement des tableaux statiques + - Un tableau est un "bloc" de mémoire contigüe 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/N) + +## 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 + +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/N) + +## Les tableaux comme argument + +- Un tableau n'est rien d'autre que le pointeur vers sa première case. +- Pas moyen de connaître sa taille: `sizeof()`{.C} inutile. +- Quand on passe un tableau en argument à une fonction: toujours spécifier sa taille. + + ```C + void foo(int tab[]) { // sans taille... + for (int i = 0; i < ?; ++i) { // on sait pas + printf("tab[%d] = %d\n", i, tab[i]); + } + } + // avec taille, [n] pas obligatoire + void bar(int tab[n], int n) { + for (int i = 0; i < n; ++i) { + printf("tab[%d] = %d\n", i, tab[i]); + } + } + ``` + +<!-- TODO quiz: --> + +<!-- que retourne sizeof(tab[]) -->