15
Rappel: les pointeurs en C INFO2009 Introduction à l’informatique Année académique 2015-2016

Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Rappel: les pointeurs en C

INFO2009 – Introduction à l’informatique

Année académique 2015-2016

Page 2: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Qu’est-ce qu’un pointeur ?

Il s’agit d’une variable contenant l’adresse d’une autre variable.

Dans l’exemple (simplifié) suivant… x est la variable (par exemple, un entier)

y est un pointeur vers x

y est donc égal à 10

Mémoire

x y

10 11 12 13 14 15 16 17

1

Page 3: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Qu’est-ce qu’un pointeur ? (2)

Analogie: un panneau sur une autoroute. Il donne une information sur la position d’une ville.

Le panneau lui-même n’est pas une ville!

2

Page 4: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Qu’est-ce qu’un pointeur ? (3)

Plus formellement, en C…

T étant un type, T* désigne un pointeur vers une variable de type T.

L’opérateur * (dit « de déréférencement »), placé à gauche d’un pointeur, permet de récupérer la valeur de la variable pointée.

L’opérateur & (dit « de référencement »), placé à gauche d’une variable, permet d’en récupérer l’adresse.

3

Page 5: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Qu’est-ce qu’un pointeur ? (4)

Si x est un pointeur (type: int*) vers y (int)…

L’expression x désigne l’adresse de y

L’expression (*x) désigne la valeur de y

Si x est une variable de type int…

L’expression x désigne la valeur de x

L’expression &x désigne l’adresse de x

4

Page 6: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Les effets du pointeur

Prenons le code suivant:

Que vaut x après l’instruction 3 ?

1. int x = 36, y = 24;

2. int z = pgcd(x, y);

3. x += y;

int pgcd(int a, int b)

{

while (b != 0)

{

int tmp = b;

b = a % b;

a = tmp;

}

return a;

}

5

Page 7: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Les effets du pointeur

Prenons le code suivant:

Que vaut x après l’instruction 3 ? 60 (36 + 24) !

1. int x = 36, y = 24;

2. int z = pgcd(x, y);

3. x += y;

int pgcd(int a, int b)

{

while (b != 0)

{

int tmp = b;

b = a % b;

a = tmp;

}

return a;

}

6

Page 8: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Les effets du pointeur (2)

Lorsqu’on entre dans une fonction/procédure, le code appelant est suspendu.

Les valeurs des paramètres (variables ou constantes) de la fonction/procédure sont copiées au moment d’exécuter le code de la fonction/procédure.

On parle de passage par valeur.

Les éventuelles variables d’origine qui ont servi de paramètres ne sont PAS manipulées.

Ce pourquoi x vaut 60 (36 + 24) et non 36 (12 + 24).

7

Page 9: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Les effets du pointeur (3)

Si on passe un pointeur plutôt qu’une variable…

La valeur du pointeur (une adresse) est copiée…

… mais elle pointe toujours vers cette variable.

On peut donc manipuler cette variable.

De manière informelle, cela revient à dire à la fonction où se trouve la variable pour qu’elle puisse la lire ET la modifier, plutôt que d’utiliser une copie.

8

Page 10: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Les effets du pointeur (4)

Modifions notre exemple:

Que vaut x après l’instruction 3 ? 36 (12 + 24) !

1. int x = 36, y = 24;

2. pgcdPtr(&x, y);

3. x += y;

void pgcdPtr(int *a, int b)

{

while (b != 0)

{

int tmp = b;

b = (*a) % b;

(*a) = tmp;

}

}

9

Page 11: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

A quoi ça sert ?

On peut retourner plusieurs résultats avec une seule et même fonction.

A cette fin, on utilise des pointeurs vers ce qu’il faut modifier: on parle de passage par adresse.

passage par adresse passage par valeur (copie de la valeur)

void pgcdPtr(int *a, int b)

{

}

10

Page 12: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

A quoi ça sert ? (2)

Il est possible d’allouer des zones de mémoire de la taille qu’on veut pour y placer tableaux, structures…

malloc() (note: inclure stdlib.h au préalable)

reçoit en paramètre la taille en octets de la zone à allouer

retourne un pointeur vers la zone de mémoire allouée

sizeof() retourne la taille en octets d’une variable d’un type donné

malloc(sizeof(int) * 10) retourne un pointeur vers un tableau d’entiers de 10 cellules.

11

Page 13: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

A quoi ça sert ? (3)

Connaître l’adresse de ces zones de mémoire plutôt que ce qu’elles contiennent permet de créer des structures de données complexes mais flexibles.

Un exemple de structure tirant parti des pointeurs sera vu avec le chapitre 7 (listes chaînées).

N.B.: à la fin d’un programme, tout bloc alloué grâce à malloc() doit être libéré avec free(), tout comme il faut utiliser fclose() après avoir manipulé un fichier.

12

Page 14: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Arithmétique de pointeurs

Les opérateurs arithmétiques de base (+, -,*, /, ++, --…) valent aussi pour les pointeurs.

Incrémenter une adresse revient à passer à l’adresse suivante, donc la variable suivante.

13

Page 15: Rappel: les pointeurs en C - uliege.begrailet/docs/... · Arithmétique de pointeurs (2) Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à

Arithmétique de pointeurs (2)

Si on alloue un bloc continu de variables d’un même type, on peut donc passer d’une à l’autre en manipulant la valeur du pointeur.

Cela équivaut à des tableaux!

L’opérateur d’indice [] peut s’utiliser à droite d’un pointeur pour sélectionner un élément d’un bloc continu (0 = premier élément, 1 = second, etc.).

int *arr = malloc(sizeof(int) * 10);

arr[2] = 42;

printf("%d\n", arr[2]); // Affiche « 42 »

14