Vous êtes sur la page 1sur 35

31/01/2013

PROGRAMMATION ORIENTÉE-OBJET
Faten BEN HMIDA
faten.benhmida@ensi.rnu.tn

Cours II1 Université de La Manouba – ENSI – 2012/2013

Présentation du module
2

Volume horaire : 67,5 h réparties sur 15 semaines


4h30/semaine

Nature : Cours Intégré


Cours + Travaux Dirigés + Travaux Pratiques

Evaluation : 35% Contrôle Continu + 65% Examen


Contrôle Continu = Devoir Surveillé + 2ème note

1
31/01/2013

Objectifs du cours
3

Comprendre l’intérêt et les origines du paradigme de


Programmation Orienté-Objet (POO)

Apprendre les nouveaux concepts introduits par le style de


POO

Se familiariser avec le langage de programmation C++ et


apprendre à l’utiliser pour programmer dans un style Objet

Plan du cours
4

Introduction
Rappel du langage C
Du C au C++
Concepts de base de la POO
Classes
Héritage
Polymorphisme
STL
Exceptions

2
31/01/2013

Bibliographie
5

POO
Brad J. Cox, Andrew J. Novobilski. Object-Oriented
Programming: An Evolutionary Approach.
Bertrand Meyer. Conception et programmation orientées
objet.

C++
Bjarne Stroustrup. The C++ Programming Language.
Claude Delannoy, Programmer en langage C++.

INTRODUCTION

Faten BEN HMIDA Université de La Manouba – ENSI – 2012/2013

3
31/01/2013

Enjeux de la programmation
7

Importance croissante de l’usage de l’informatique dans divers


domaines d’application
Applications commerciales, financières et de gestion …
Applications industrielles, commande/contrôle, logistique et transport …
Applications biologiques et médicales …

Programmes de plus en plus complexes


Complexité des problèmes à résoudre
Complexité du processus de développement : travail en équipe, projet
longs, vue partielle du programme, correction/amélioration constantes, …

Comment gérer au mieux cette complexité pour produire des


logiciels de qualité avec des coûts raisonnables ?

Importance de la maintenance
8

Cycle de vie d’un logiciel : Besoin Obsolescence


Analyse et spécifications des besoins
Conceptions globale et détaillée
Codage (Implémentation)
Test et validation
Maintenance

Le développement du logiciel est suivi de son installation, puis


d'une phase d'exploitation et de maintenance.
Maintenance corrective : corriger les défauts du logiciel
Maintenance évolutive : faire évoluer les fonctionnalités du logiciel

4
31/01/2013

Importance de la maintenance
9

Répartition des coûts de développement :


6% : spécification
5% : conception
7% : codage
15% : test et validation
67% : maintenance

La phase de maintenance (phase d’évolution du logiciel), est


économiquement cruciale, puisqu'elle représente souvent plus
des deux tiers du coût global d'un logiciel.

Le succès de la phase de maintenance dépend de plusieurs


facteurs qui relèvent de la qualité du logiciel.

Qualité du logiciel
10

Validité : Le logiciel est capable d’assurer exactement les


fonctions demandées par les spécifications.

Robustesse : Le logiciel est capable de bien fonctionner dans


des conditions anormales.

Extensibilité : Il est possible de modifier le logiciel simplement


pour l'adapter à des modifications dans les spécifications.

Réutilisabilité : Le logiciel peut être utilisé intégralement ou en


partie dans de nouvelles applications.

Efficacité : bonne utilisation des ressources (temps d’exécution,


taille de la mémoire utilisée, …)

5
31/01/2013

Limites de l’approche structurée


11

Programme = Structures de données + Opérations

Programmation structurée : séparation entre les données et les


traitements.

Les données sont généralement en début de programme et


donc visibles de toutes les fonctions qui suivent.

Limites de l’approche structurée


12

Effets de bords (état inattendu des données dans une fonction


suite à leurs modifications par une autre fonction).

Quand les données évoluent, une modification d’une structure


de données est répercutée sur tous les programmes qui la
manipulent.

Nécessité parfois de reconstruire tout le programme.

Maintenance coûteuse, réutilisabilité et extensibilité très


difficiles.

6
31/01/2013

Solutions de la POO
13

Regrouper les données et les opérations qui les manipulent au


sein d’un même entité : Objet

Objet = caractéristiques (attributs) + actions (méthodes)

Vision plus proche de la notre perception du monde réel

Abstraction des données

Fonction 1 Fonction 2

Fonction Fonction
6
DONNEES 3

Fonction 5 Fonction 4

Solutions de la POO
14

Programme = collection d’objets indépendants coopérant


ensemble.

Meilleure modularité du programme donc extensibilité,


réutilisation et maintenance considérablement améliorées.

POO réduction des coûts et meilleure qualité des logiciels !

7
31/01/2013

CHAPITRE 1

RAPPEL DU LANGAGE C

Faten BEN HMIDA Université de La Manouba – ENSI – 2012/2013

Plan
16

Bref historique
Caractéristiques du langage C
Structure d’un programme C
Compilation et exécution d’un programme C
Adressage des variables
Pointeurs
Allocation dynamique de la mémoire
Passage de paramètres à une fonction

8
31/01/2013

Bref historique
17

1972 : Dennis Ritchie développe le langage C dans les laboratoires Bell


d’AT&T (dans le but d’écrire une version portable du système d’exploitation
UNIX)

1978 : Dennis Ritchie et Brian Kernighan publient la définition classique du


langage C dans un livre intitulé « The C Programming Language ».

1983 : l’ANSI (American National Standards Institute) met au point une


version standard et portable du langage C baptisée ANSI-C.

1988 : Dennis Ritchie et Brian Kernighan publient la seconde édition du livre


« The C Programming Language » respectant le standard ANSI-C.
http://net.pku.edu.cn/~course/cs101/2008/resource/The_C_Programming
_Language.pdf

Caractéristiques du langage C
18

Avantages
Universel : non orienté vers un domaine d'application particulier
(ex: FORTRAN pour applications scientifiques et techniques, COBOL
pour applications commerciales ou traitant de grandes quantités de
données).

Compact : basé sur un noyau de fonctions et d'opérateurs limité


permettant la formulation d'expressions simples mais efficaces.

Moderne : c’est un langage structuré, déclaratif et récursif; il offre


des structures de contrôle et de déclaration comparables à celles
des autres grands langages (FORTRAN, ALGOL68, PASCAL)

9
31/01/2013

Caractéristiques du langage C
19

Avantages
Près de la machine : étant développé dans le but de programmer
le système d'exploitation UNIX, il offre des fonctions permettant un
accès simple et direct aux fonctions internes de l'ordinateur (gestion
de la mémoire).

Portable : en respectant le standard ANSI-C, il est possible d'utiliser


le même programme sur tout autre système simplement en le
recompilant.

Extensible : C ne se compose pas seulement des fonctions standard;


le langage est animé par des bibliothèques de fonctions privées ou
livrées par de nombreuses maisons de développement.

Caractéristiques du langage C
20

Limites
Compréhensibilité : l’utilisation des expressions compactes entraîne le
risque de produire du code incompréhensible d’où l’intérêt de bien
commenter les programmes.

Portabilité : le répertoire des fonctions standards étant limité, un


programmeur peut donc être amené à utiliser des bibliothèques de
fonctions prédéfinies non standards d’où le risque de perte en portabilité.

Discipline de programmation : C n’impose pas un style de programmation


strict, il offre beaucoup de liberté de codage et donc requiert beaucoup
de responsabilité de la part du programmeur qui doit veiller à la propreté,
la solidité et la compréhensibilité de son code.

10
31/01/2013

Structure d’un programme C


21

#include <stdio.h> Directives du préprocesseur


#define TAUX 2.063

float convert(float euro); Déclarations des fonctions


main()
{ Programme principal
float somme;
printf("Somme à convertir (en euros) : ");
scanf("%f", &somme);
printf("%f euros = %f dinars", somme, convert(somme));
}

float convert(float euro) Définitions des fonctions


{
return(euro*TAUX);
}

Compilation et exécution d’un programme C


22

Fichiers en-tête .h Programme principal .c


stdio.h #include<stdio.h>
/*déclarations*/
#include<math.h>
math.h #include<graphics.h>
/*déclarations*/
Préprocesseur main()
graphics.h {
/*déclarations*/

… Code prétraité }

Le préprocesseur

Assure une phase préliminaire de traitement textuel sur le code source.


Supprime les commentaires (/* …*/)
Procède à une évaluation des directives (commandes commençant par #)
• Inclusion des fichiers d’en-tête (#include)
• Remplacement des constantes (#define)

11
31/01/2013

Compilation et exécution d’un programme C


23

Fichiers en-tête .h Programme principal .c


stdio.h #include<stdio.h>
/*déclarations*/
#include<math.h>
math.h #include<graphics.h>
/*déclarations*/
Préprocesseur main()
graphics.h {
/*déclarations*/

… Code prétraité }

Le compilateur
Compilateur
Effectue une analyse lexicale et
.obj sémantique sur le code source pour
Programme compilé
.o détecter les éventuelles erreurs.

Transforme le code source en code


objet (langage intermédiaire)

Compilation et exécution d’un programme C


24

Fichiers en-tête .h Programme principal .c


stdio.h #include<stdio.h>
/*déclarations*/
#include<math.h>
math.h #include<graphics.h>
/*déclarations*/
Préprocesseur main()
graphics.h {
/*déclarations*/

… Code prétraité }

L’éditeur des liens


Compilateur
Bibliothèques
précompilées Lie les fichiers objets (fichiers
.obj simplement compilés) avec les fichiers
Programme compilé
.o précompilés d'une ou de plusieurs
stdio.lib
bibliothèques.
Editeur des
math.lib liens
Produit du code binaire directement
graphics.lib exécutable par la machine.
Programme exécutable .exe

12
31/01/2013

Adressage des variables


25

Adressage direct : Accès au contenu d'une variable par le nom


de la variable.

Adressage indirect : Accès au contenu d'une variable en


passant par un pointeur qui contient l'adresse de cette
variable.

Variables simples
26

Code Source Mémoire


char a = 1; Adresse Nom Contenu
short int b = 32000; 0123456 a 1
long int c = 65536;
0123457 b
32000
0123458
0123459 c
0123460
65536
0123461
0123462
0123463 ?
0123464 ?

13
31/01/2013

Tableaux
27

Code Source Mémoire


short int tab[4]; Adresse Nom Contenu
0123456 tab ?
0123457 ?
0123458 ?
0123459 ?
0123460 ?
0123461 ?
0123462 ?
0123463 ?
0123464 ?

Tableaux
28

Code Source Mémoire


short int tab[4]; Adresse Nom Contenu
0123456 tab [0]
?
0123457
0123458 [1]
?
0123459
0123460 [2]
?
0123461
0123462 [3]
?
0123463
0123464 ?

14
31/01/2013

Structures
29

Code Source Mémoire


Struct record Adresse Nom Contenu
{ 0123456 rec ?
int a;
0123457 ?
short int b;
char c;
0123458 ?
} rec; 0123459 ?
0123460 ?
0123461 ?
0123462 ?
0123463 ?
0123464 ?

Structures
30

Code Source Mémoire


Struct record Adresse Nom Contenu
{ 0123456 rec a
int a;
0123457
short int b; ?
char c;
0123458
} rec; 0123459
0123460 b
?
0123461
0123462 c ?
0123463 ?
0123464 ?

15
31/01/2013

Adressage des variables


31

Adressage direct : Accès au contenu d'une variable par le nom


de la variable.

Adressage indirect : Accès au contenu d'une variable, en


passant par un pointeur qui contient l'adresse de la variable.

Pointeurs
32

Code Source Mémoire


int *ptr; Adresse Nom Contenu
int b; 0123456 ptr
0123457
?
0123458
0123459
0123460 b
0123461
?
0123462
0123463
0123464 0

16
31/01/2013

Pointeurs
33

Code Source Mémoire


int *ptr; Adresse Nom Contenu
int b; 0123456 ptr
0123457
ptr = &b; 0123460
0123458
0123459
0123460 b
0123461
?
0123462
0123463
0123464 0

Pointeurs
34

Code Source Mémoire


int *ptr; Adresse Nom Contenu
int b; 0123456 ptr
0123457
ptr = &b; 0123460
*ptr = 1;
0123458
b = 2; 0123459
b = b + *ptr; 0123460 b
0123461
1
0123462
0123463
0123464 0

17
31/01/2013

Pointeurs
35

Code Source Mémoire


int *ptr; Adresse Nom Contenu
int b; 0123456 ptr
0123457
ptr = &b; 0123460
*ptr = 1;
0123458
b = 2; 0123459
b = b + *ptr; 0123460 b
0123461
2
0123462
0123463
0123464 0

Pointeurs
36

Code Source Mémoire


int *ptr; Adresse Nom Contenu
int b; 0123456 ptr
0123457
ptr = &b; 0123460
*ptr = 1;
0123458
b = 2; 0123459
b = b + *ptr; 0123460 b
0123461
4
0123462
0123463
0123464 0

18
31/01/2013

Pointeurs sur tableaux


37

Code Source Mémoire


short int *ptr; Adresse Nom Contenu
short int tab[4]; 0123456 ptr
0123457
?
0123458
0123459
0123460 tab
?
0123461
0123462
?
0123463
0123464
?
0123465
0123466
?
0123467

Pointeurs sur tableaux


38

Code Source Mémoire


short int *ptr; Adresse Nom Contenu
short int tab[4]; 0123456 ptr
0123457
ptr = tab; 0123460
*ptr = 3141;
0123458
0123459
ptr += 2; 0123460 tab [0]
*ptr = 512; ?
0123461
0123462 [1]
tab[3] = ptr – tab; ?
0123463
0123464 [2]
?
0123465
0123466 [3]
?
0123467

19
31/01/2013

Pointeurs sur tableaux


39

Code Source Mémoire


short int *ptr; Adresse Nom Contenu
short int tab[4]; 0123456 ptr
0123457
ptr = tab; 0123460
*ptr = 3141;
0123458
0123459
ptr += 2; 0123460 tab [0]
*ptr = 512; 3141
0123461
0123462 [1]
tab[3] = ptr – tab; ?
0123463
0123464 [2]
?
0123465
0123466 [3]
?
0123467

Pointeurs sur tableaux


40

Code Source Mémoire


short int *ptr; Adresse Nom Contenu
short int tab[4]; 0123456 ptr
0123457
ptr = tab; 0123464
*ptr = 3141;
0123458
0123459
ptr += 2; 0123460 tab [0]
*ptr = 512; 3141
0123461
0123462 [1]
tab[3] = ptr – tab; ?
0123463
0123464 [2]
?
0123465
0123466 [3]
?
0123467

20
31/01/2013

Pointeurs sur tableaux


41

Code Source Mémoire


short int *ptr; Adresse Nom Contenu
short int tab[4]; 0123456 ptr
0123457
ptr = tab; 0123464
*ptr = 3141;
0123458
0123459
ptr += 2; 0123460 tab [0]
*ptr = 512; 3141
0123461
0123462 [1]
tab[3] = ptr – tab; ?
0123463
0123464 [2]
512
0123465
0123466 [3]
?
0123467

Pointeurs sur tableaux


42

Code Source Mémoire


short int *ptr; Adresse Nom Contenu
short int tab[4]; 0123456 ptr
0123457
ptr = tab; 0123464
*ptr = 3141;
0123458
0123459
ptr += 2; 0123460 tab [0]
*ptr = 512; 3141
0123461
0123462 [1]
tab[3] = ptr – tab; ?
0123463
0123464 [2]
512
0123465
0123466 [3]
2
0123467

21
31/01/2013

Pointeurs sur structures


43

Code Source Mémoire


struct record Adresse Nom Contenu
{ 0123456 ptr
short int a;
0123457
short int b; ?
} rec, *ptr;
0123458
0123459
ptr = &rec; 0123460 rec a
ptr->b = 16384; ?
0123461
0123462 b
?
0123463
0123464 0

Pointeurs sur structures


44

Code Source Mémoire


struct record Adresse Nom Contenu
{ 0123456 ptr
short int a;
0123457
short int b; 0123460
} rec, *ptr;
0123458
0123459
ptr = &rec; 0123460 rec a
ptr->b = 16384; ?
0123461
0123462 b
?
0123463
0123464 0

22
31/01/2013

Pointeurs sur structures


45

Code Source Mémoire


struct record Adresse Nom Contenu
{ 0123456 ptr
short int a;
0123457
short int b; 0123460
} rec, *ptr;
0123458
0123459
ptr = &rec; 0123460 rec a
ptr->b = 16384; ?
0123461
0123462 b
16384
0123463
0123464 0

Allocation dynamique de la mémoire


46

Opérateur : sizeof
sizeof(<type>)
sizeof(<variable>)

Type : size_t (~ unsigned long int)


Exemple : size_t len = sizeof(int);

Fichier <stdlib.h>
void *malloc(size_t) allocation d’un bloc
void *calloc(size_t, size_t) allocation & initialisation d’un bloc
void *realloc(void *, size_t) modification de la taille d’un bloc
void free(void *) libération d’un bloc

23
31/01/2013

Allocation dynamique de la mémoire


47

Code Source Mémoire


#include <stdlib.h>
Adresse Nom Contenu
0123456 ptr
{
void *ptr;
0123457
?
0123458
ptr = malloc(5); 0123459
ptr = realloc(ptr, sizeof(int));
free(ptr);

ptr = calloc(2, sizeof(short int));


free(ptr);
}

Allocation dynamique de la mémoire


48

Code Source Mémoire


#include <stdlib.h>
Adresse Nom Contenu
0123456 ptr
{
void *ptr;
0123457
0065536
0123458
ptr = malloc(5); 0123459
ptr = realloc(ptr, sizeof(int));
free(ptr); Adresse Contenu
0065536 ?
ptr = calloc(2, sizeof(short int));
free(ptr);
0065537 ?
} 0065538 ?
0065539 ?
0065540 ?
0065541 ?

24
31/01/2013

Allocation dynamique de la mémoire


49

Code Source Mémoire


#include <stdlib.h>
Adresse Nom Contenu
0123456 ptr
{
void *ptr;
0123457
0065662
0123458
ptr = malloc(5); 0123459
ptr = realloc(ptr, sizeof(int));
free(ptr); Adresse Cont. Adresse Cont.
0065536 ? 0065662 ?
ptr = calloc(2, sizeof(short int));
free(ptr);
0065537 ? 0065663 ?
} 0065538 ? 0065664 ?
0065539 ? 0065665 ?
0065540 ? 0065666 ?
0065541 ? 0065667 ?

Allocation dynamique de la mémoire


50

Code Source Mémoire


#include <stdlib.h>
Adresse Nom Contenu
0123456 ptr
{
void *ptr;
0123457
0065662
0123458
ptr = malloc(5); 0123459
ptr = realloc(ptr, sizeof(int));
free(ptr); Adresse Cont.
0065662 ?
ptr = calloc(2, sizeof(short int));
free(ptr);
0065663 ?
} 0065664 ?
0065665 ?
0065666 ?
0065667 ?

25
31/01/2013

Allocation dynamique de la mémoire


51

Code Source Mémoire


#include <stdlib.h>
Adresse Nom Contenu
0123456 ptr
{
void *ptr;
0123457
0065790
0123458
ptr = malloc(5); 0123459
ptr = realloc(ptr, sizeof(int));
free(ptr); Adresse Contenu
0065790
ptr = calloc(2, sizeof(short int)); 0
0065791
free(ptr);
} 0065792
0
0065793
0065794 ?
0065795 ?

Allocation dynamique de la mémoire


52

Code Source Mémoire


#include <stdlib.h>
Adresse Nom Contenu
0123456 ptr
{
void *ptr;
0123457
0065790
0123458
ptr = malloc(5); 0123459
ptr = realloc(ptr, sizeof(int));
free(ptr); Adresse Contenu
0065790 0
ptr = calloc(2, sizeof(short int));
free(ptr);
0065791 0
} 0065792 0
0065793 0
0065794 ?
0065795 ?

26
31/01/2013

Appel de fonctions
53

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 ?
a += b; 0123464 ?
} 0123463 ?
0123462 ?
void main()
{
0123461 ?
char x = 6; 0123460 ?
f(x); 0123459 ?
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

passage de paramètres par valeur


54

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 6
a += b; 0123464 ?
} 0123463 ?
0123462 ?
void main()
{
0123461 ?
char x = 6; 0123460 ?
f(x); 0123459 ?
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

27
31/01/2013

passage de paramètres par valeur


55

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 6
a += b; 0123464 @Retour
} 0123463
<adresse>
0123462
void main()
0123461
{
char x = 6; 0123460 a ?
f(x); 0123459 b ?
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

passage de paramètres par valeur


56

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 6
a += b; 0123464 @Retour
} 0123463
<adresse>
0123462
void main()
0123461
{
char x = 6; 0123460 a 6
f(x); 0123459 b ?
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

28
31/01/2013

passage de paramètres par valeur


57

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 6
a += b; 0123464 @Retour
} 0123463
<adresse>
0123462
void main()
0123461
{
char x = 6; 0123460 a 6
f(x); 0123459 b 2
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

passage de paramètres par valeur


58

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 6
a += b; 0123464 @Retour
} 0123463
<adresse>
0123462
void main()
0123461
{
char x = 6; 0123460 a 8
f(x); 0123459 b 2
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

29
31/01/2013

passage de paramètres par valeur


59

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 6
a += b; 0123464 ?
} 0123463 ?
0123462 ?
void main()
{
0123461 ?
char x = 6; 0123460 8
f(x); 0123459 2
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

passage de paramètres par valeur


60

Code Source Mémoire


void f(char a)
Adresse Nom Contenu
{
char b = 2;
0123465 x 9
a += b; 0123464 ?
} 0123463 ?
0123462 ?
void main()
{
0123461 ?
char x = 6; 0123460 8
f(x); 0123459 2
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

30
31/01/2013

passage de paramètres par adresse


61

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
char b = 2;
0123465 ?
*a += b; 0123464 ?
} 0123463 ?
0123462 ?
void main()
{
0123461 ?
char x = 6; 0123460 ?
f(&x); 0123459 ?
x += 3; 0123458 ?
}
0123457 ?
0123456 ?

passage de paramètres par adresse


62

Code Source Mémoire


void f(char *a) Adresse Nom Contenu
{
0123465 ?
char b = 2;
*a += b;
0123464 ?
} 0123463 ?
0123462 ?
void main()
0123461 ?
{
0123460 ?
char x = 6;
f(&x); 0123459 ?
x += 3; 0123458 ?
} 0123457 ?
0123456 ?

31
31/01/2013

passage de paramètres par adresse


63

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 6
char b = 2;
*a += b;
0123464 ?
} 0123463 ?
0123462 ?
void main()
0123461 ?
{
0123460 ?
char x = 6;
f(&x); 0123459 ?
x += 3; 0123458 ?
} 0123457 ?
0123456 ?
0123455

passage de paramètres par adresse


64

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 6
char b = 2;
*a += b;
0123464 @retour
} 0123463
<adresse>
0123462
void main()
0123461
{
0123460 a
char x = 6;
f(&x); 0123459
?
x += 3; 0123458
} 0123457
0123456 b ?
0123455

32
31/01/2013

passage de paramètres par adresse


65

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 6
char b = 2;
*a += b;
0123464 @retour
} 0123463
<adresse>
0123462
void main()
0123461
{
0123460 a
char x = 6;
f(&x); 0123459
0123465
x += 3; 0123458
} 0123457
0123456 b ?
0123455

passage de paramètres par adresse


66

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 6
char b = 2;
*a += b;
0123464 @retour
} 0123463
<adresse>
0123462
void main()
0123461
{
0123460 a
char x = 6;
f(&x); 0123459
0123465
x += 3; 0123458
} 0123457
0123456 b 2
0123455

33
31/01/2013

passage de paramètres par adresse


67

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 8
char b = 2;
*a += b;
0123464 @retour
} 0123463
<adresse>
0123462
void main()
0123461
{
0123460 a
char x = 6;
f(&x); 0123459
0123465
x += 3; 0123458
} 0123457
0123456 b 2
0123455

passage de paramètres par adresse


68

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 8
char b = 2;
*a += b;
0123464 ?
} 0123463 ?
0123462 ?
void main()
0123461 ?
{
0123460 ?
char x = 6;
f(&x); 0123459 ?
x += 3; 0123458 ?
} 0123457 ?
0123456 2
0123455 ?

34
31/01/2013

passage de paramètres par adresse


69

Code Source Mémoire


void f(char *a)
Adresse Nom Contenu
{
0123465 x 11
char b = 2;
*a += b;
0123464 ?
} 0123463 ?
0123462 ?
void main()
0123461 ?
{
0123460 ?
char x = 6;
f(&x); 0123459 ?
x += 3; 0123458 ?
} 0123457 ?
0123456 2
0123455 ?

35

Vous aimerez peut-être aussi