Skip to content
Snippets Groups Projects
pointeurs_avances.md 1.9 KiB
Newer Older
---
title: Pointeurs avancés
orestis.malaspin's avatar
orestis.malaspin committed
date: 2020-02-19

# Pointeurs avancés

## Pointeurs de fonctions (1/2)

orestis.malaspin's avatar
orestis.malaspin committed
- Considérons la fonction `max` retournant la valeur maximale d'un tableau

    ```C
    int max(int *t, int size) {
        int val_max = t[0];
orestis.malaspin's avatar
orestis.malaspin committed
        for (int i = 1; i < size; ++i) {
            if (t[i] > val_max) {
                val_max = t[i];
            }
        }
orestis.malaspin's avatar
orestis.malaspin committed
        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.
orestis.malaspin's avatar
orestis.malaspin committed
- 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.