--- title: Pointeurs avancés date: 2020-02-19 --- # Pointeurs avancés ## Pointeurs de fonctions (1/2) - Considérons la fonction `max` retournant la valeur maximale d'un tableau ```C int max(int *t, int size) { int val_max = t[0]; for (int i = 1; i < size; ++i) { if (t[i] > val_max) { val_max = t[i]; } } return val_max; } ``` - L'appel à `max`, retourne l'adresse de la fonction en mémoire. - On peut affecter cette valeur à un pointeur. ## Pointeurs de fonctions (2/2) - Le type de la fonction `max` est ```C int (*pmax)(int *, int); ``` - Le type doit être déclaré avec la signature de la fonction. - On peut alors utiliser l'un ou l'autre indifféremment ```C int (*pmax)(int *, int); pmax = max; int tab[] = {1, 4, -2, 12}; printf("%d", max(tab, 4)); // retourne 12 printf("%d", pmax(tab, 4)); // retourne 12 aussi ``` # Pointeurs et `const` ## Deux niveaux de constance - Le mot clé `const` permet de déclarer des valeurs "constantes" qui ne changeront plus en cours d'exécution du programme. - Mais qu'est-ce que cela veut dire pour les pointeurs? ```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 ``` ## 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. ```