Bonjour,
Je débute et en cours on est arrivé aux pointeurs. Le soucis c'est qu'on programme en java et qu'apparemment ils n'existent pas en tant que tel
Voici un code que j'ai recopié bêtement sur mon voisin
Quelqu'un pour me réexpliquer vite fait svp ?
package listes;
import edu.princeton.cs.introcs.StdOut;
public class theorie_liste {
public static void main(String[] args) {
DataPtr maillon1 = new DataPtr();
DataPtr tete = null;
maillon1.Data=27;
DataPtr maillon2 = new DataPtr();
maillon2.Data=15;
maillon1.ptr=maillon2;
tete=maillon1;
maillon1.ptr.Data=15; // maillon1.ptr c'est maillon2 // maillon.ptr.data c'est qu'on demande les données du maillon suivant
DataPtr maillon3 = new DataPtr();
maillon3.Data=22;
maillon2.ptr=maillon3;
DataPtr maillon4 = new DataPtr();
maillon4.Data=54;
maillon3.ptr=maillon4;
maillon4.ptr=null; //pointe vers null
AfficheTete(tete);
}
public static void AfficheTete(DataPtr tete) { ///AFFICHER LA TETE///
while (tete!=null) {
StdOut.println(tete.Data);
tete=tete.ptr;
}
}
}
J'ai l'impression que ce qu'ils appellent pointeur est simplement une variable d'objet.
Parceque là ton code ce qu'il fait c'est :
Créer un objet, lui assigner un nombre. Créer un second objet, lui assigner un nombre et le stocker dans le 1er objet. Créer un troisième objet, lui assigner un nombre et le stocker dans le 2ème objet. Etc...
Puis la méthode "afficherTete" va afficher le nombre de l'objet, puis "change d'objet" en récupérant l'objet stocker dans celui qu'il vient de lire.
Comme ils sont tous reliés entre eux (le premier stock le 2nd etc), c'est comme une chaîne et c'est simple à parcourir.
On ne parle pas vraiment de "pointeurs" en Java.
Il y a des types simples (nombre, caractère, booléen), où la variable contient une valeur directement (3,"a",true par exemple) et des types objet (tous les autres), où la variable contient une référence vers un objet.
Par exemple, avec un type primitif, si tu fais quelque chose comme
int a = 5;
int b = a;
Tu copies la valeur de a (qui est 5) vers b, donc a et b sont deux variables indépendantes qui valent toutes les deux 5.
Mais avec un type objet, quand tu fais
a = new DataPtr();
b = a;
new DataPtr() crée un objet de type DataPtr et sa référence est enregistrée dans a. Ensuite, b = a;
copie cette référence dans b, et donc a et b contiennent donc tous les deux une référence vers le même objet.
Donc techniquement toute variable de type objet est une sorte de "pointeur" vers un objet.
En ce qui concerne ton code, il construit une liste chaînée, où chaque maillon est un objet de type DataPtr, qui contient une valeur propre (le membre Data) et une référence vers le maillon suivant, le membre ptr.
Quand le code faitDataPtr maillon2 = new DataPtr();
maillon1.ptr=maillon2;
Il crée un nouveau maillon et met sa référence dans le membre ptr de maillon1.
Quand il faitDataPtr maillon3 = new DataPtr();
maillon2.ptr=maillon3;
Il ajoute un troisième maillon et met sa référence dans maillon2. On se retrouve donc avec une suite de maillons (objets DataPtr) où chaque maillon contient une référence vers le maillon suivant, ce qui constitue une sorte de chaîne qu'on peut parcourir en remontant de maillon en maillon grâce aux références.
La "tête" de la chaîne est le dernier maillon, on la trouve en remontant la chaîne jusqu'à trouver un maillon qui n'a pas de maillon suivant, donc où son membre ptr est null.
Le code, c'est le code d'une liste chainee avec des maillons, pas d'un pointeur vraiment.
Merci arsh22 c'est hyper bien expliqué.
Donc en gros en Java comme tu l'as dis, tout est pointeurs ?
Le 13 décembre 2017 à 16:44:06 Skywaaalker a écrit :
Merci arsh22 c'est hyper bien expliqué.Donc en gros en Java comme tu l'as dis, tout est pointeurs ?
Tous les objets sont des pointeurs.
Les types de base (int, char, boolean, float, double, ...) n'en sont pas, ils sont stockés directement dans ta variable.
Pour les reconnaître, les types objets commencent par une majuscule (String, Integer, DataPtr) et les types de base par une minuscule.