Pointeurs et adresses - PowerPoint PPT Presentation

1 / 27
About This Presentation
Title:

Pointeurs et adresses

Description:

Un pointeur est simplement une variable qui contient une adresse m moire. ... Une valeur (une adresse cod e sur 1, 2 ou 4 octets). Le type pointeur ... – PowerPoint PPT presentation

Number of Views:148
Avg rating:3.0/5.0
Slides: 28
Provided by: Hom82
Category:

less

Transcript and Presenter's Notes

Title: Pointeurs et adresses


1
Pointeurs et adresses
2
Intérêt des pointeurs
  • Manipulation directe de la mémoire
  • Programmes compacts et efficaces
  • Un moyen, pour une fonction appelée, de manipuler
    des variables de la fonction appelante

3
Les adresses (1)
  • Un tableau de cases mémoire (octets) consécutives
    numérotées (adressées) que lon peut manipuler
    individuellement ou par groupe de cases
    contiguës.
  • Une adresse est codée sur un ou deux octets.

Pointeur_int

0000 0000
0001 0010
0000 0000 0001 0100
0000 0000 0001 0011
0000 0000 0001 0010
0000 0000 0001 0001
0000 0000 0000 0001
0000 0000 0000 0010
0000 0000 0000 0011
4
Les adresses (2)
  • La déclaration int i 10 se traduit par
  • La réservation dun espace mémoire (4 octets
    consécutifs) pour y stocker un entier, puis
  • Association du nom i à cette zone.
  • Ladresse du premier octet de cette zone est
    i.
  • Rappel Lecture dun entier scanf(d, i)

5
Les pointeurs
  • Un pointeur est simplement une variable qui
    contient une adresse mémoire.
  • Cest en fait
  • Un nom
  • Un type dobjet pointé
  • Une valeur (une adresse codée sur 1, 2 ou 4
    octets).
  • Le type pointeur nexiste pas, il faut connaître
    le type de lobjet pointé.
  • char p
  • int p_int
  • struct nud k, p_k
  • int pp_int

6
Affectation des pointeurs
int p,q,i3 p3 / provoque erreur!/
pi qp
7
Affectation des pointeurs(2)
int i,p,q
pi
qp
p
23
i
3
adresse
p3
adresse
q
Un pointeur est une adresse, la seule constante
que lon peut lui affecter est 0 (NULL)
8
Mathématiques de pointeurs
  • Pourquoi le type de lobjet pointé est il précisé
    à la déclaration du pointeur?
  • Il est possible deffectuer des additions (et des
    soustractions) sur les pointeurs
  • pp1 p-- ptN
  • Les valeurs ajoutées sont converties en multiples
    de la taille de lobjet pointé!
  • Exemple
  • char p
  • p /équivaut à calculer adresseadresse1sizeo
    f(char)/
  • Attention p_i , p_i , (p_i) ,
    p_i

9
Retour sur les tableaux
  • int tab10
  • Associe au nom tab ladresse du début de zone
    alloué.
  • tab est équivalent à tab0
  • En fait, tab est un pointeur sur le premier octet
    du tableau
  • tab est équivalent à tab0

10
Parcours dun tableau
  • On peut donc parcourir un tableau grâce aux
    pointeurs
  • short tab5
  • tab est donc équivalent à tab0
  • (tab3) est équivalent à tab3
  • Mise à zéro des éléments dun pointeur
  • int t100, p
  • for(i0i?100i) ti0
  • for(p t0 p ? p100 p) p0
  • for(p t p ? t100 p) p0
  • for(p t p ? t100 (p)0)

11
Les pointeurs de caractères
  • Une constante de type chaîne
  • je suis une chaîne
  • Est un tableau de caractères.
  • j,e, ,s,u,i,s, , n,e,\0
  • On y accède par des pointeurs.
  • Attention à la différence
  • char mess un message
  • char p_mess un message
  • On peut changer les caractères
  • de mess, mais pas de la chaîne
  • pointé par p_mess

un message\0
mess
p_mess
un message\0
12
Tableaux multidimensionnels
  • Un tableau bidimensionnel est un tableau de
    tableaux de dimensions identiques.
  • int tNbLiNbCol
  • Réservation de NbLi tableaux de NbColsizeof(int)
    octets chacun
  • Association des noms t0, t1,aux adresses de
    début des tableaux monodimensionnels
  • Association du nom t à ladresse de début du
    tableau des NbLI tableaux monodimensionnels
  • Donc t2 est un tableau de NbCol.

t
t0
t1
tNBLIS-2
tNBLIS-1
13
Tableaux multidimensionnels et pointeurs
  • Initialisation
  • short t54 0, 1, 2, 3, 4, 5, 6, 7, 8,
    9, 10, 11
  • Accès
  • it24 correspond à
  • i ( t2 4)
  • i ( ( t 2 ) 4)
  • i ( t 2NBCOLS 4 )

14
Tableaux de pointeurs
  • char nom incorek, jan, fev,
    mar, , sep, oct, nov, dec
  • Les pointeurs sont des variables peuvent être
    contenues dans des tableaux
  • Taille variable
  • Plus souple
  • Gains de place et de vitesse

defghi
defghi
jklmnoparst
jklmnopqrst
abc
abc
15
Allocation de mémoire(Statique)
  • Lors de la déclaration de tableaux
  • Les dimensions des tableaux doivent être connu à
    la compilation.
  • Impossible int fonc(int a)
  • int taa2
  • Possible define N 10
  • int tN100

16
Allocation de mémoire(Dynamique)
  • Gérée par le programmeur
  • Demande despace malloc(), calloc()
  • Manipulation du pointeur indiquant lespace
  • Libération de lespace free()
  • void malloc(unsigned size) (inclure stdlib.h)
  • typedef struct noeud int val nud suivant
  • nud liste
  • liste (noeud ) malloc( (unsigned)
    sizeof(noeud) )
  • Toujours tester!
  • if(p_point NULL) exit(1)
  • Toujours libérer!
  • free(p_point)

17
Allocation de mémoire dynamique (2)
  • char malloc(unsigned size)
  • char calloc(unsigned size)
  • char realloc(char p, unsigned size)
  • void free(char p)

18
Erreurs courantes
  • Ne pas mélanger les 2 types de mémoire
  • int tab10, p
  • tab est interdit
  • tab malloc() aussi
  • tab p également.
  • Attention, ne pas utiliser de pointeurs sur des
    espaces libérés! (sauf pour laffecter à une
    nouvelle zone mémoire)

19
Erreurs courantes(2)
  • Référence à un bloc non alloué
  • int a
  • int i a
  • Référence à la valeur dun pointeur non
    initialisé
  • int a (int) malloc(sizeof(int))
  • int i a
  • Référence à un pointeur sur une variable libérée
  • int i
  • int a (int) malloc(sizeof(int))
  • free(a)
  • I a
  • Libèrer un pointeur non alloué.
  • int a
  • free(a)

20
Erreurs courantes(3)
  • Libérer une variable allouée statiquement
  • int a10
  • free(a)
  • Désallouer deux fois le même pointeur
  • free(a)
  • free(a)
  • Oublier de libérer la mémoire allouée
  • int main(void)
  • int a (int)malloc(sizeof(int))
  • Déclarer un pointeur sur une variable locale
  • int a, i
  • int b
  • a b
  • ia

21
Quelles sont les valeurs des variables aux
différentes étapes de ce programme?
  • int main(void)
  • int t2
  • int a, b c
  • t03
  • t15
  • a10
  • bt
  • ca
  • cb
  • a
  • b
  • b 2a

22
Quel est le résultat du programme suivant?
  • int main(void)
  • char x10 0123456789
  • char pa, pb
  • pa x
  • pb pa 3
  • printf(s \npb)

23
Quelles sont les valeurs des variables après
lexécution du programme suivant?
  • int f(int x, int y, int z)
  • x x y
  • y y x
  • z x - y
  • return z
  • int main(void)
  • int a5, b9, c, d, e
  • c e
  • c 23
  • d f(a, b , c)

24
Pointeurs et tableaux
  • Ecrivez la procédure strcat qui concatène la
    chaîne t à la chaîne s, passées en paramètre.
  • En utilisant la notation tableau
  • En utilisant des pointeurs

25
Notation tableau
  • void strcat(char s, char t)
  • int i,j
  • ij0
  • while (si ! \0)
  • i
  • while ((si tj) ! \0)

26
Notation pointeur
  • void strcat(char s, char t)
  • while(s)
  • s
  • while(s t)

27
(No Transcript)
Write a Comment
User Comments (0)
About PowerShow.com