OVH Cloud OVH Cloud

questions élémentaires

2 réponses
Avatar
Bernard Bergeron
Pour ne pas trop encombrer, je pose mes questions (de débutant) en une fois
:
1. j'implémente l'exemple classique (il me semble en tous cas!) du type
Pile, dans la fonction dépile :

ligne1: void depile(Pile& p){
ligne2: Pile_elt* nouveau=p.tete;
ligne3: p.tete=p.tete-> suivant;
ligne4: delete nouveau;}


----> je ne comprends pas quand on doit utiliser le symbole . et le
symbole -> ?
----> quel est l'intérêt des lignes 2 et 4, pourquoi ne pas écrire
uniquement la ligne 3?

2. quand doit-on écrire :
Pile_elt* nouveau=new Pile_elt;
ou :
Pile_elt* nouveau

ne ne vois pas vraiment la différence...

2 réponses

Avatar
Twxs
Bernard Bergeron wrote:

1. j'implémente l'exemple classique (il me semble en tous cas!) du type
Pile, dans la fonction dépile :

ligne1: void depile(Pile& p){
ligne2: Pile_elt* nouveau=p.tete;
ligne3: p.tete=p.tete-> suivant;
ligne4: delete nouveau;}


----> je ne comprends pas quand on doit utiliser le symbole . et le
symbole -> ?
la -> quand la variable est un pointeur, le . lorsque c'est un objet ou

une référence

----> quel est l'intérêt des lignes 2 et 4, pourquoi ne pas écrire
uniquement la ligne 3?
tu as besoin de detruire (pour liberer la memoire allouee) l'element au

sommet de la pile lorsque tu depiles.
dans ton cas p.tete pointe sur un emplacement en memoire, si tu ne mets
que la ligne 2, tu ne pourras plus deleter l'ancienne tete


2. quand doit-on écrire :
Pile_elt* nouveau=new Pile_elt;
pour creer un nouvel element

ou :
Pile_elt* nouveau
pour acceder a un element existant (deja alloue)


ne ne vois pas vraiment la différence...




Avatar
Jean-Noël Mégoz
"Bernard Bergeron" a écrit dans le message de
news:40a12ff1$0$31941$
Pour ne pas trop encombrer, je pose mes questions (de débutant) en une
fois

:


Je me trompe peut-être, mais la réponse déjà donnée à ce message me parait
un peu laconique pour être vraiment comprise par un novice. Car ce sont en
effet des questions de novice !

1. j'implémente l'exemple classique (il me semble en tous cas!) du type
Pile, dans la fonction dépile :

ligne1: void depile(Pile& p){
ligne2: Pile_elt* nouveau=p.tete;
ligne3: p.tete=p.tete-> suivant;
ligne4: delete nouveau;}

----> je ne comprends pas quand on doit utiliser le symbole . et le
symbole -> ?


Pour accéder à un membre d'un objet (ou d'une référence comme, ici, p), on
utilise le point. Si on écrivait "tete.suivant", ça voudrait dire qu'on veut
accéder au membre "suivant" de "tete". Or un pointeur n'a pas de membre :
c'est un type simple, au même titre qu'un entier par exemple, une variable
qui sert à stocker l'adresse mémoire d'un objet.
On utilise donc la flèche dans "tete->suivant" pour dire <<le membre
"suivant" de l'objet pointé par "tete">>.

----> quel est l'intérêt des lignes 2 et 4, pourquoi ne pas écrire
uniquement la ligne 3?



Si on n'écrit que la ligne 3, la pile change bien de tête, mais alors
l'adresse l'objet pointé initialement par "p.tete" est perdue, et il est
impossible de faire le delete voulu pour libérer la mémoire qu'il occupe.
La ligne 2 sert donc à garder temporairement l'adresse de la tete intiale.
Ceci dit, nommer ce pointeur "nouveau" n'est pas l'idéal dans ce cas car il
pointe sur un objet qui n'a rien de nouveau. J'aurais trouvé plus judicieux
d'écrire :
Pile_elt* ancienne_tete = p.tete;
p.tete = p.tete-> suivant;
delete ancienne_tete;

2. quand doit-on écrire :
Pile_elt* nouveau=new Pile_elt;
ou :
Pile_elt* nouveau

ne ne vois pas vraiment la différence...



La différence est que "nouveau" est initialisé dans le 1er cas et pas dans
le 2nd.
— "Pile_elt* nouveau = new Pile_elt;" crée un nouvel objet de classe
Pile_elt, et stocke son adresse mémoire dans un pointeur nommé "nouveau".
— "Pile_elt* nouveau;" crée un pointeur nommé "nouveau" mais ne lui donne
pas de valeur. Il faudra ensuite l'initialiser en le faisant pointer sur un
objet de classe Pile_elt.

Tu pourrais renconter aussi la notation "Pile_elt nouveau;", qui créerait un
objet de classe Pile_elt, nommé "nouveau".
Pour connaitre l'adresse de cet objet, il faudrait écrire "&nouveau". Ainsi
:
Pile_elt nouvel_objet;
Pile_elt* nouveau_pointeur;
nouveau_pointeur = &nouvel_objet;