Sunteți pe pagina 1din 21

Notions de base

Exemples
Exercices

M. Mahjoub Eniso 2014/2015

LES POINTEURS
Le matriel
Organisation de la mmoire
Paramtres des fonctions
Variables dynamiques
(les pointeurs)

Variables statiques
(toutes les variables sauf les pointeurs)
Programme rel (toto.exe)
Comprend le code et les constantes

FILE (FIFO) : first in first out


PILE (LIFO) Last in first out
M. Mahjoub Eniso 2014/2015

Pointeurs
Un pointeur, cest une variable dont la valeur est

l'adresse d'une cellule de la mmoire


Traduction :
Imaginons que la mmoire de lordinateur, cest un

grand tableau.
Un pointeur, cest alors une variable de type int (un
nombre) qui permet de se souvenir dune case
particulire.

On comprend bien que le pointeur ne se soucis pas de

savoir ce quil y a dans la case, mais bien de ladresse de


la case.
M. Mahjoub Eniso 2014/2015

P est un pointeur qui


pointe (adresse) une
variable de type char

Syntaxe
Dclaration : *

type *idPtr;

exemple : char *p;


Nom de la variable

Le type peut tre un type


simple (int, float) ou un
objet (nimporte quelle classe).

Ce petit signe indique que lon


ne travaille plus sur une
variable normale, mais sur un
pointeur

M. Mahjoub Eniso 2014/2015

Syntaxe
Oprateur dadresse : &
Cout << &idVar;

int x; cout << &x;


Nom dune variable de
nimporte quel type

Plutt que dafficher la valeur


de la variable, on affiche
ladresse de la case mmoire

Ce petit signe indique que lon


veux rcuprer ladresse dune
variable

cin et cout en C++ correspondent scanf et printf en C


M. Mahjoub Eniso 2014/2015

Syntaxe
Oprateur de drfrencement : *
cout<<*ptr;
Nom dun pointeur

Plutt que dafficher ladresse


du pointeur, on affiche la
valeur qui est dans la case
mmoire

Ce petit signe indique que lon


veux rcuprer la valeur situe
une adresse prcise

M. Mahjoub Eniso 2014/2015

Syntaxe

On dclare une variable


normale de type caractre

Exemple :

char c = a;
char *p;
p=&c;
cout << *p;
*p = c;

On dclare un pointeur sur une


case de type caractre
On donne ladresse de la
variable c au pointeur p

On affiche la valeur de la case


pointe par p (a)

M. Mahjoub Eniso 2014/2015

Exemple :
Fonction de permutation de deux variables :
void echanger_valeur(int *ptr_v1, int *ptr_v2)
{
int tmp = *ptr_v1;
*ptr_v1 = *ptr_v2;
*ptr_v2 = tmp;
}
//exemple dappel
int x = 5;
int y = 7;
echanger_valeur(&x, &y);
printf( %d %d ,x,y); //x vaudra 7 et y vaudra 5 aprs lexcution
M. Mahjoub Eniso 2014/2015

Exercice
Soit P un pointeur qui "pointe" sur un tableau A: un entier = un octet
int A[9] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;

Quelles valeurs ou adresses fournissent ces expressions:


a- *P+2
= ??
b- *(P+2)
= ??
c- &P+1
= ??
d- &A[4]-3
= ??
e- A+3
= ??
f- &A[7]-P
= ??
g- *(P+(*P-10)) = ??

M. Mahjoub Eniso 2014/2015

Exercice
Soit P un pointeur qui "pointe" sur un tableau A: un entier = un octet
int A[] = {12, 23, 34, 45, 56, 67, 78, 89, 90};
int *P;
P = A;

Quelles valeurs ou adresses fournissent ces expressions:


a- *P+2
= 14
b- *(P+2)
= 34
c- &P+1
= &A[0]+1
d- &A[4]-3
= &A[1]
e- A+3
= &A[3]
f- &A[7]-P
= &A[7] &A[0] = (&A[0]+7) - &A[0] = 7
g- *(P+(*P-10)) = *(p+2) = 34

M. Mahjoub Eniso 2014/2015

Exercice
Quels rsultats fournira ce programme :
#include <iostream>
using namespace std ;
main()
{ int t[4] = {10, 20, 30, 40} ;
int * ad [4] ;
int i ;
for (i=0 ; i<4 ; i++) ad[i] = t+i ; /* 1 */
for (i=0 ; i<4 ; i++) cout << * ad[i] << " " ; /* 2 */
cout << "\n" ;
cout << * (ad[1] + 1) << " " << * ad[1] + 1 << "\n" ; /* 3 */
}
M. Mahjoub Eniso 2014/2015

Exercice
Quels rsultats fournira ce programme :
#include <iostream>
using namespace std ;
main()
{ int t[4] = {10, 20, 30, 40} ;
int * ad [4] ;
int i ;
for (i=0 ; i<4 ; i++) ad[i] = t+i ; /* 1 */
for (i=0 ; i<4 ; i++) cout << * ad[i] << " " ; /* 2 */
10 20 30 40
cout << "\n" ;
cout << * (ad[1] + 1) << " " << * ad[1] + 1 << "\n" ; /* 3 */
}

30 21
M. Mahjoub Eniso 2014/2015

Exercice
Ecrire un programme qui lit deux tableaux A et B et leurs
dimensions N et M au clavier et qui ajoute les lments de B
la fin de A ?

NB : Utiliser le formalisme pointeur chaque fois que cela est


possible.
scanf("%d",&A[i]); scanf("%d",A+i);

M. Mahjoub Eniso 2014/2015

Solution
#include <stdio.h>
main()
{
int I,N,M,A[100], B[50];
printf("Dimension du tableau A ");
scanf("%d", &N );
for (I=0; I<N; I++)
{
printf("Elment %d : ", I);
scanf("%d", A+I); }
//scanf("%d", A+I); scanf("%d", &A[I]);
printf("Dimension du tableau B: ");
scanf("%d", &M );
for (I=0; I<M; I++) {
printf("Elment %d : ", I);
scanf("%d", B+I); }
M. Mahjoub Eniso 2014/2015

/* Affichage des tableaux */


printf("Tableau donn A :\n");
for (I=0; I<N; I++)
printf("%d ", *(A+I)); printf("\n");
printf("Tableau donn B :\n");
for (I=0; I<M; I++)
printf("%d ", *(B+I)); printf("\n");
/*Copie de B la fin de A */
for (I=0; I<M; I++)
*(A+N+I) = *(B+I);
// A[N+I] = B[I]
N = N+M; /* Edition du rsultat */
printf("Tableau rsultat A :\n");
for (I=0; I<N; I++)
printf("%d ", *(A+I));
printf("\n");
return 0;}

Exercice
crire un programme en langage C qui range les
lments d'un tableau A du type int dans l'ordre inverse.
Le programme utilisera des pointeurs P1 et P2 et une
variable numrique Aux pour la permutation des
lments.

M. Mahjoub Eniso 2014/2015

Solution
crire un
programme en
langage C qui
range les
lments d'un
tableau A du type
int dans l'ordre
inverse.
Le programme
utilisera des
pointeurs P1 et P2
et une variable
numrique AIDE
pour la
permutation des
lments.

#include<stdio.h>
main()
{ int t[10],*p1,*p2,n,aux,i;
printf("donnez la dimension du tab");
scanf("%d",&n);
p1=t;
for(i=0;i<n;i++)
{printf("donnez les valeurs t[%d]=",i);
scanf("%d",p1+i);}
p2=t+n-1;
while (p1<p2)
{ aux=*p1;
*p1=*p2;
*p2=aux;
++p1;
x=y++;
p2--;}
for(i=0;i<n;i++)
printf("t[%d]=%d",i,t[i]);
}
M. Mahjoub Eniso 2014/2015

Allocation dynamique
Un tableau est allou de manire statique : nombre d'lments
constant.
Allou lors de la compilation (avant excution)

Problme pour dterminer la taille optimale, donne


l'excution :
surestimation et perte de place
de plus, le tableau est un pointeur constant.
Il faudrait un systme permettant d'allouer un nombre
d'lments connu seulement l'excution : c'est l'allocation
dynamique.
M. Mahjoub Eniso 2014/2015

Allocation
dynamique
Faire le lien entre le pointeur non initialis et une zone de
mmoire de la taille que l'on veut.
On peut obtenir cette zone de mmoire par l'emploi de malloc,
qui est une fonction prvue cet effet. Il suffit de donner
malloc le nombre d'octets dsirs (attention, utilisation
probable de sizeof), et malloc renvoie un pointeur de type
void* sur la zone de mmoire alloue.

Si malloc n'a pas pu trouver une telle zone mmoire, il renvoie


NULL.
int *pt_int;

pt_int = (int *)malloc(nbElem*sizeof(int));


Demande dallocation de nbElem zones en RAM de taille chacune
sizeof(int) retournant un pointeur sur un entier
M. Mahjoub Eniso 2014/2015

Allocation dynamique
Exemples d'utilisation :

Tableau de la taille requise, pas de perte de mmoire !


#include <stdio.h>
void main()
{
int *pt_int;
int nbElem;

printf("combien d'elements dans le tableau ?:");


scanf("%d",&nbElem);
pt_int = (int *)malloc(nbElem*sizeof(int));
if (pt_int == NULL)
printf( Lallocation n'a pas fonctionn\n");
else{
/* Saisie du contenu du tableau */
for (i=0;i<nbElem; i++)
scanf("%d",&pt_int[i]);
printf ("\n");
}free(pt_int);//librer toute la zone pointe
pt_int
}
M. Mahjoub Eniso 2014/2015

par

Mmoire dynamique (c++)


Allocation de mmoire dynamique

int *tab;
tab = new int [10];
Destruction de la mmoire
delete [] tab;

// Crer un tableau de 10 entiers

Avantage :
Crer des tableaux de taille dfini par lutilisateur

M. Mahjoub Eniso 2014/2015

void afficheToutTableau (int *tab, int taille)


{
for (int i=0; i<taille; i++)
cout<<tab[i];
}
void saisieToutTableau (int *tab, int taille)
{
for (int i=0; i<taille; i++)
cin>>tab[i];
Il est possible dutiliser les
}
crochets, comme pour un
int main(void)
tableau normal
{
int *tab;
int taille;
cin >> taille;
tab = new int [taille];
if (tab!=NULL){
saisieToutTableau(tab, taille);
afficheToutTableau(tab, taille);
delete []tab;
return 0;}
}
M. Mahjoub Eniso 2014/2015

S-ar putea să vă placă și