6 Pointeurs

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 21

Introduction

Les pointeurs

Programmation en C

Laila AMIR

Filière d’ingénieurs génie civile (IGC)

Année universitaire 2017/2018

Laila AMIR
Introduction
Les pointeurs

Plan

1 Introduction
Intérêt des pointeurs
Adressage de variables

2 Les pointeurs
Notion d’un pointeur
Les opérateurs de base &, *
Déclaration d’un pointeur
Initialisation d’un pointeur
Accéder à une variable pointée

Laila AMIR
Introduction Intérêt des pointeurs
Les pointeurs Adressage de variables

Outline

1 Introduction
Intérêt des pointeurs
Adressage de variables

2 Les pointeurs
Notion d’un pointeur
Les opérateurs de base &, *
Déclaration d’un pointeur
Initialisation d’un pointeur
Accéder à une variable pointée

Laila AMIR
Introduction Intérêt des pointeurs
Les pointeurs Adressage de variables

Intérêt des pointeurs

Les pointeurs ont un grand nombre d’intérêts :


Ils permettent de manipuler de façon simple des données
importantes (au lieu de passer à une fonction un élément de
taille très grande on pourra lui fournir un pointeur vers cet
élément)
Le passage des paramètres en C se fait toujours par la valeur, les
pointeurs sont le seul moyen de changer le contenu de variables
déclarées dans d’autres fonctions.

Laila AMIR
Introduction Intérêt des pointeurs
Les pointeurs Adressage de variables

Intérêt des pointeurs

La notion de pointeur est une technique de programmation très


puissante, permettant de définir des structures dynamiques, c-à-d
qui évoluent au cours du temps (par opposition aux tableaux qui
sont des structures de données statiques, dont la taille est figée,
fixée à la définition).

Ainsi le traitement de tableaux et de chaı̂nes de caractères dans


des fonctions serait impossible sans l’utilisation de pointeurs.

Il est possible de créer des structures chaı̂nées, c’est-à-dire


comportant des maillons

Laila AMIR
Introduction Intérêt des pointeurs
Les pointeurs Adressage de variables

Accés à une variable

Il est possible d’accéder à une variable par :

son nom ou identificateur,

son adresse en utilisant un pointeur.

Laila AMIR
Introduction Intérêt des pointeurs
Les pointeurs Adressage de variables

Adressage direct

On utilise des variables pour stocker des informations.


La valeur d’une variable se trouve à un endroit spécifique dans
la mémoire interne de l’ordinateur.
Le nom de la variable permet d’accéder directement à cette
valeur.

Adressage direct
Accès au contenu d’une variable par le nom de la variable.

Laila AMIR
Introduction Intérêt des pointeurs
Les pointeurs Adressage de variables

Adressage indirect

Si on ne veut ou ne peut pas utiliser le nom d’une variable A :


on peut copier l’adresse de cette variable dans une variable
spéciale P, appelée pointeur.
Ensuite, on peut retrouver l’information de la variable A en
passant par le pointeur P.

Adressage indirect
Accès au contenu d’une variable, en passant par un pointeur qui contient
l’adresse de la variable.

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Outline

1 Introduction
Intérêt des pointeurs
Adressage de variables

2 Les pointeurs
Notion d’un pointeur
Les opérateurs de base &, *
Déclaration d’un pointeur
Initialisation d’un pointeur
Accéder à une variable pointée

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Notion d’un pointeur

Un pointeur est une variable spéciale qui peut contenir l’adresse d’une
autre variable.

Un pointeur est limité à un type de données. Il peut contenir


l’adresse d’une variable simple de ce type ou l’adresse d’une
composante d’un tableau de ce type.
Si un pointeur P contient l’adresse d’une variable A, on dit que ”P
pointe sur A”.

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Notion d’un pointeur

Remarque :

Il faut faire la différence entre un pointeur et le nom d’une variable :


Un pointeur est une variable qui peut ’pointer’ sur différentes
adresses.
Le nom d’une variable reste toujours lié à la même adresse.

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Les opérateurs de base

Lors du travail avec des pointeurs, nous avons besoin


d’un opérateur ’adresse de’: &
pour obtenir l’adresse d’une variable.
d’un opérateur ’contenu de’: *
pour accéder au contenu d’une adresse.
d’une syntaxe de déclaration
pour pouvoir déclarer un pointeur.

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

L’opérateurs : &, *
L’opérateur ’adresse de’ : &
& NomVariable
fournit l’adresse de la variable NomVariable
On a déjà utilisé l’opérateur & dans la fonction scanf, pour désigner
l’adresse de la variable dans laquelle on veut stocker une valeur.
Exemple :
int N;
printf(”Entrez un nombre entier : ”);
scanf(”%d”, &N);
L’opérateur ’contenu de’ : *
* NomPointeur
désigne le contenu de l’adresse référencée par le pointeur NomPointeur
Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Représentation schématique

Alors l’instruction : P = &A;


Soit P un pointeur de type affecte l’adresse de la variable A à la
int non initialisé : variable P.
Nous pouvons illustrer le fait que ’P
pointe sur A’ par une flèche :
=>
et A une variable (du même
type) contenant la valeur 10 :

*P (le contenu de A référencée par P)


vaut 10.

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Exemple 2

Soit A une variable contenant la valeur 10,

B une variable contenant la valeur 50

et P un pointeur non initialisé.

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Exemple 2 (suite)

Après les instructions,

P = &A; P pointe sur A,


B = *P; le contenu de A (référencé par *P) est affecté à B,
*P = 20; le contenu de A (référencé par *P) est mis à 20.

=>

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Déclaration d’un pointeur

Type * NomPointeur;
déclare un pointeur NomPointeur qui peut recevoir des adresses de
variables du type Type.

Le type de variable pointée peut être aussi bien un type primaire


(tel que int, char ...) qu’un type complexe (tel que struct ...).

Il est possible de définir un pointeur sur ’void’, c-à-d sur quelque


chose qui n’a pas de type prédéfini (void * toto). Ce genre de
pointeur sert généralement de pointeur de transition, dans une
fonction générique, avant un transtypage permettant d’accéder
effectivement aux données pointées.
Exemple : int *p1;
Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Initialisation d’un pointeur


Après avoir déclaré un pointeur il faut l’initialiser. Cette démarche est très
importante car lorsque vous déclarez un pointeur, celui-ci risque de pointer
vers une zone hasardeuse de votre mémoire.
Pour initialiser un pointeur, il faut utiliser l’opérateur d’affectation ’=’
suivi de l’opérateur d’adresse ’&’ auquel est accollé un nom de variable
(celle-ci doit bien sûr avoir été définie avant...) :

NomPointeur = &nom-de-la-variable-pointee;

Exemple :
int *p1;
int a = 2;
p1 = &a;

Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Accéder à une variable pointée

Après avoir déclaré et initialisé un pointeur,

il est possible d’accéder au contenu de l’adresse mémoire pointée par le


pointeur grâce à l’opérateur ’*’.

La syntaxe est la suivante : *NomPointeur

Exemple :
int *p1;
int a = 2;
p1 = &a;
*p1 = 10;
Après ces instructions, le contenu de la variable a sera 10.
Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Exemple complet

#include <stdio.h>
int main(){
int a, b, c;
int *x, *y;
a = 98; Exécution :
x = &a;
c = *x + 5; La variable b vaut 108
y = &b; La variable c vaut 103
*y = a + 10;
printf(”La variable b vaut :%d ”, b);
printf(”La variable c vaut :%d”, c);
return 0;
}
Laila AMIR
Notion d’un pointeur
Les opérateurs de base &, *
Introduction
Déclaration d’un pointeur
Les pointeurs
Initialisation d’un pointeur
Accéder à une variable pointée

Explications :
Dans ce programme, on déclare 3 variables a, b et c. On déclare ensuite 2
pointeurs vers des entiers x et y. a est initialisé à 98.
x=&a; permet de mettre dans le un pointeur x l’adresse de a.
*x est la variable pointée par x. a vaut donc 98 après évaluation.
c=*x+5; permet donc de transférer 98+5 donc 103 dans la variable c.
y=&b permet de mettre dans la variable y l’adresse de la variable b. y
est désormais un pointeur vers b.
a+10 vaut 98+10 donc 108.
*y=a+10; permet de transférer dans la variable pointée par y la
valeur de a+10, c’est-à-dire 108. On stocke donc 108 dans b, de
manière indirecte via le pointeur y.
on affiche ensuite les valeurs de b et c c-à-d respect. 108 et 103.

Laila AMIR

You might also like