Skip to content
Snippets Groups Projects
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

    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

    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

    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?

    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

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.