Se connecter

Informatique

Programmation

Sujet : J'arrive pas à saisir les "pointeurs" en Java
1
Skywaaalker
Niveau 10
12 décembre 2017 à 12:12:59

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 https://image.noelshack.com/fichiers/2016/24/1466366197-risitas10.png

Quelqu'un pour me réexpliquer vite fait svp ? https://image.noelshack.com/fichiers/2016/30/1469541959-risitas206.png


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;
        }
    }


}

sentrance
Niveau 10
12 décembre 2017 à 18:45:44

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.

arsh222
Niveau 10
12 décembre 2017 à 20:09:10

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 fait
DataPtr 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 fait
DataPtr 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.

godrik
Niveau 22
12 décembre 2017 à 20:12:15

Le code, c'est le code d'une liste chainee avec des maillons, pas d'un pointeur vraiment.

Skywaaalker
Niveau 10
13 décembre 2017 à 16:44:06

Merci arsh22 c'est hyper bien expliqué.

Donc en gros en Java comme tu l'as dis, tout est pointeurs ?

JeanCroutenard
Niveau 10
13 décembre 2017 à 18:56:13

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.

1
Sujet : J'arrive pas à saisir les "pointeurs" en Java
   Retour haut de page
Consulter la version web de cette page