POINTEURS GÉNÉRIQUES
Le type void
▪ Un pointeur sur void est considéré comme un pointeur
générique, ce qui signifie qu’il peut référencer n’importe quel
type d’objet.
▪ Dans certaines circonstances, on veut:
▪ Manipuler une adresse.
▪ Sans indiquer le type des éléments pointés.
▪ Pointeur non typé
▪ Le langage C permet de manipuler des pointeurs non typés.
1
POINTEURS GÉNÉRIQUES
▪ Syntaxe:
void* pointeur;
int i;
double x;
pointeur = &i;
pointeur = &x;
▪ Exemple:
int fread (void* buffer, int size, int count);
2
TRANSTYPAGE
▪ Un pointeur void * est inutilisable.
➢ Pour lire ou écrire ce qui est pointé, il faut préciser le type
des éléments pointés.
➢ On change le type du pointeur par transtypage (type cast).
✓ (int*) pointeur;
➢ L’adresse reste inchangée.
➢ Le type des éléments pointés devient connu.
▪ Le transtypage est possible
➢ Entre tous les types de pointeurs.
➢ Il est aussi possible de transtyper un entier en pointeur et
vice versa. 3
TRANSTYPAGE
Exemple:
4
ARITHMÉTIQUE DES POINTEURS
▪ Deux opérateurs possibles :
➢ Somme d’un pointeur est un entier
➢ Différence entre deux pointeurs de même type.
▪ Syntaxe :
type *p, *q; int i;
✓ p+i
➢ C’est l’adresse de la case d’indice i de l’espace pointé par p
➢ Sa valeur = p + i*sizeof(type)
✓ q–p
➢ C’est le nombre de cases entre l’adresse p et l’adresse p
➢ Sa valeur = (q - p)/sizeof(type)
5
POINTEURS ET TABLEAUX
▪ Un tableau à une dimension est un pointeur sur un ensemble
d’éléments de même type contigües en mémoire.
▪ int T[N] ;
▪ T est l’adresse de la première case du tableau
▪ L’adresse de la case d’indice i est &T[i]
▪ C’est aussi T+i
▪ Le contenu de la case d’indice i est T[i]
▪ C’est aussi *(T+i)
6
POINTEURS ET TABLEAUX
▪ Un tableau à une dimension est un pointeur sur un ensemble
d’éléments de même type contigües en mémoire.
▪ int T[N] ;
▪ T est l’adresse de la première case du tableau
▪ L’adresse de la case d’indice i est &T[i]
▪ C’est aussi T+i
▪ Le contenu de la case d’indice i est T[i]
▪ C’est aussi *(T+i)
7
POINTEURS ET TABLEAUX
Exemple:
8
POINTEURS ET STRING
▪ Fonctions de <string.h>
Plus de fonctions: [Link]
9
POINTEURS ET STRING
Exemple:
10
Gestion dynamique de la mémoire
11
INTRODUCTION
12
MÉMOIRE DYNAMIQUE
▪ Comment réserver de l’espace mémoire pendant l’exécution d’un
programme?
➢ la taille de l’espace mémoire est définie au moment de
l’exécution.
▪ Comment créer des structures de données dynamiques?
▪ Les fonctions de stdlib.h de gestion dynamique de la mémoire:
▪ malloc
▪ calloc
▪ realloc
▪ free
13
MÉMOIRE DYNAMIQUE
▪ Etapes :
➢ Allocation : appel de malloc ou calloc pour demander à l’OS
de l’espace mémoire.
➢ Vérification : si l’espace mémoire est bien réservé.
➢ Utilisation : utilisation de l’espace mémoire réservé, et
redimensionnement avec realloc si nécessaire.
➢ Libération: appel de free pour libérer l’espace mémoire
14
RÉSERVATION
La fonction malloc
▪ void * malloc (size_t size)
➢ size_t est un unsigned int
➢ Permet de réserver un espace mémoire avec une taille donnée
en octets.
➢ Retourne un pointeur sur l’espace mémoire réservé en cas de
succès.
➢ En cas d’échec de réservation, la fonction retourne un
pointeur nul (NULL).
➢ L’espace mémoire réservé n’est pas initialisé.
15
RÉSERVATION
▪ void * malloc (size_t size)
▪ Exemples :
▪ float *t = malloc(10*sizeof(float));
➢ Réservation d’un espace mémoire pour stocker
10 float (un tableau)
16
RÉSERVATION
La fonction calloc
▪ void * calloc (size_t num , size_t size)
➢ Réserve l’espace mémoire pour un tableau avec un nombre
d’éléments et la taille de chaque élément donnés, et initialise
l’espace mémoire par 0.
➢ Retourne un pointeur sur l’espace mémoire réservé en cas de
succès.
➢ En cas d’échec de réservation, la fonction retourne un pointeur
nul (NULL).
17
RÉSERVATION
▪ void * calloc (size_t num , size_t size)
▪ Exemples :
▪ float * t = calloc(10, sizeof(float));
➢ Réservation d’un espace mémoire pour stocker
10 float (un tableau)
18
REDIMENSIONNEMENT
La fonction realloc
▪ void * realloc (void *ptr, size_t new_size)
➢ Réallouer un espace mémoire pointé par ptr avec une nouvelle
taille.
➢ La réallocation peut étendre ou réduire l’espace mémoire.
19
REDIMENSIONNEMENT
▪ void * realloc (void *ptr, size_t new_size)
▪ Exemple :
▪ float * p = calloc(10, sizeof(float));
▪ p = realloc (p, 15*sizeof(float));
➢ Extension de l’espace mémoire pour 15 float.
20
LIBÉRATION
La fonction free
▪ void free (void * ptr)
➢ Libère l'espace mémoire précédemment alloué par malloc,
calloc ou realloc.
➢ Si ptr est nul, la fonction ne fait rien.
➢ La fonction ne retourne rien.
▪ Exemple :
▪ free(p);
▪ Libère l’espace mémoire pointé par p.
21
TABLEAUX À UNE DIMENTION
22
TABLEAUX À DEUX DIMENTION
Méthode 1
23
TABLEAUX À DEUX DIMENTION
Méthode 2
24