IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

les pointeurs ?


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 146
    Par défaut les pointeurs ?
    bonjour a tous

    je suis entrain d'apprendre les pointeurs et ce n'est pas évident de comprendre, comme j'ai commencé a programmer mes début avec PHP je ne croit pas que cela existe mais je peux me tromper.

    les pointeurs sont il beaucoup utiliser ? sont t'il utiliser que si on ne peut pas modifier a volonté la taille des tableaux ?

    les pointeurs sont il comme des mémoire tampon qui ressemble a un tableau? le pointeur peut t'il remplacer un tableau?

    avec php je crois que je pouvais faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (i = 0 , i <10, i++)
       la question ....
       tab_rep[] = reponse
    FinTantQue
    en java il est interdit de modifier un tableau donc cette methode est a proscrire, donc on utilise un pointeur.

    pourrait-on me donner un exemple simple qui utilise un pointeur en algorithme et en java?

    merci d'avance pour votre réponse.

  2. #2
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut Attention : description volontairement simpliste :aie:
    Houla. Beaucoup de confusion sur le sujet.

    Personnellement, je fais un parallèle entre le pointeur et l'adresse mémoire.

    Imaginons que la mémoire soit un grand tableau d'octets, l'adresse mémoire serait l'index de ce tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    byte[] RAM = new byte[1000000000];
     
    int index = 120;
    RAM[index] = 0xFF;  // "index" représente l'adresse mémoire, ici l'adresse 120
    Le pointeur est une structure qui permet de manipuler l'adresse mémoire (donc de manipuler l'index du tableau). En particulier, on peut créer un pointeur, modifier sa valeur d'adresse (= la valeur de l'index), aller a la position suivante/précédente (index+1 ou index-1), récupérer le contenu de la mémoire (= le contenu du tableau pour l'index courant), ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Pointer {
    	int index=0; // représente l'adresse mémoire
     
    	void set(int i) {index = i ;}
    	void next() {index++;}
    	byte getContent() {return RAM[index];}
    	void setContent(byte b) {RAM[index]=b;}
    }
    Le C utilise beaucoup les pointeurs (en particulier pour les tableaux dynamiques et les chaines de caractères). Les pointeurs en C sont extrêmement puissants (on peut effectuer des opérations arithmétiques avec). Ils permettent également de manipuler des types (struct/union) et pas seulement des octets.

    En java, il n'y a pas cette notion de pointeur. La notion la plus proche est la référence, mais on ne peut pas la manipuler.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  3. #3
    Membre Expert
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Par défaut
    Le pointeur n'est pas un outil algorithmique, ce n'est qu'une solution technologique à la représentation de données ou au besoin d'unicité (de non redondance) de données ... Son usage dépend parfois du langage utilisé et parfois même du matériel sur lequel sera exécuté le programme.

    Pour simplifier un peu les choses, on peut dire qu'une variable simple est un contenu alors qu'un pointeur est un conteneur. Lorsque tu appelles la fonction truc() en lui soumettant une variable, tu ne fais que lui communiquer le contenu de ladite variable à partir duquel elle pourra effectuer des opérations et retourner une valeur. En revanche, lorsque tu communiques un pointeur vers une variable (ou autre chose) à machin(), tu transmets à celle-ci le conteneur d'une donnée et/ou le lieu de sauvegarde d'une autre. Libre à machin() d'aller lire ce qu'il y a dans le conteneur, voire de modifier son contenu.

    En général, un pointeur est en fait l'adresse physique, le lieu d'existence d'une donnée.

    En C, comme dans d'autres langages, le pointeur peut représenter un tableau. C'est l'adresse du premier élément dudit tableau. On ne sait par contre rien sur la taille dudit tableau.

    L'utilisation des pointeurs dépend du langage. En C et C++, ils sont abondamment utilisés. En Java, ils ne sont pas accessibles au programmeur (bien que derrière tout le système de classes, de tableaux, de références ... se cachent des pointeurs). Avec les langages fonctionnels (Lisp, Caml, Prolog, ...), les pointeurs bien que (parfois) existants sont souvent inutiles.



    Ne pouvant pas te donner d'exemple en Java et en algo pour les raisons cités ci-avant, je vais te donner un exemple en C. Nous voudrions stocker un certains nombre d'éléments (appelons les e) ; mais ce nombre est inconnu à la compilation et peut être très important.
    Une solution est de créer une structure de données (appelons la s) constituée d'un élément e et d'un pointeur vers l'éventuelle structure suivante. Ainsi, quelque soit le nombre d'éléments déjà définis, je peux toujours en ajouter un en :
    1/ demandant au système de m'allouer un espace mémoire de la taille d'un s
    2/ modifier le dernier s de la chaine pour que son pointeur indique l'emplacement de la nouvelle s
    3/ modifier le e du s nouvellement créé (qui est le e que l'on souhaite ajouter).


    Si tu veux en apprendre plus sur les pointeurs et leur utilisation, je peux te conseiller d'apprendre le langage C sur le site développez.com.

    Bonne continuation.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 146
    Par défaut
    merci beaucoup de toutes ces réponses (merci pour le lien je vais jeter un oeil)

    j'ai effectivement tout mélang,, je suis un cour en algorithme java, c'est pour cela que je demandais un algo en java, le prof a du nous donner cette partie pour surement pouvoir être capable de crée un algo quelque soit le langage utiliser. Je n'ai encore pas appris a faire du c ou c++, je me concentre pour le moment a faire des algorithmes.

    donc si j'ai bien compris par rapport a un tableau:

    on peut considérer un pointeur comme un tableau et son indice mais qui ne contient que des adresse mémoire, on pourra donc a volonté modifier cettte adresse ou modifier son indice.

    le tableau de variable quand a lui, on doit fixer le nombre d'indice, on ne peut pas changer l'indice ni les variables qui sont dedans, on ne peut pas ajouter des variables en plus

    Donc en java on ne peut donc pas connaître ou la variable à été mis dans la mémoire?

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    tu mélanges encore...

    C'est la mémoire qu'on considère comme un BLOC (ou un tableau) de n octets (bytes, bits,..)


    Comme tout ce qui touche à la mémoire, il faut pouvoir s'y déplacer et s'y retrouver.

    Pour cela on se réfère à des adresses, qui sont une position dans la mémoire.

    L'élément d'un langage (quelconque) dans lequel on stocke une adresse s'appelle un pointeur.


    Un pointeur est donc une adresse (une position) dans un bloc de mémoire (en général dans le bloc de mémoire alloué au programme. Il peut être dans le bloc total de mémoire de l'ordi, et on appelle alors cela "mémoire partagée")



    On peut donc faire de l'arithmétique - élémentaire - sur les pointeurs, puisque ce sont des positions : on peut les additionner (on augmente la position), les soustraire (on la diminue, ou bien on calcule une longueur), éventuellement diviser un pointeur (pour obtenir une taille), ou mutiplier une différence de pointeurs (pour obtenir une taille)



    Donc un tableau de variables est traité de manière identique à un tableau de mémoire :

    il a une adresse de départ, une adresse de fin, et une taille d'élément (un entier, un réel, un caractère, une structure...)

    On peut donc se référer à un élément d'un tableau par :

    - son indice
    - l'adresse de départ + son indice * la taille de l'élément
    - son adresse directe

    La seule différence est qu'en général il est peu utile d'utiliser la mémoire comme un tableau (sauf pour faire un dump (comme un coredump)) car on ne sait pas où on tombera..

    Par contre, pour répondre à ta dernière question, si, il y a un opérateur (je n'ai plus en tête comment on le nomme en Java. En C ou C++ c'est "&") qui donne l'adresse d'un élément... Et un autre opérateur qui retourne la VALEUR pointée par ce pointeur (en C c'est "*").


    Soit donc un tableau d'entier Tab de 10 éléments, et p un pointeur sur un entier.

    int Tab[10] ;
    int *pTab ;


    On peut avoir l'adresse de départ du tableau :

    Tab = &(Tab[0])

    ou

    pTab = &(Tab[0])


    On veut obtenir l'adresse du 4ième élément.

    On peut alors écrire :

    pTab = &(Tab[3])

    ou (en ayant le pTab plus haut)


    pTab = pTab + 3 * sizeof(int)

  6. #6
    Membre très actif
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Billets dans le blog
    1
    Par défaut
    Pour comprendre les pointeurs quand l'esprit est recalcitrant, il faut utikliser une analogie simple de tout les jours.
    L'informatique n'est que la miniaturisation des concepts et mécanismes du monde réel:

    Chaque courrier dans la boite au lettres = un élément d'une donnée

    contenu de la boite au lettre = donnée

    adresse postale de la boite au lettre = adresse

    référence de l'adresse dans l'annuaire = pointeur

    référence à l'annuaire dans un index des volumes = pointeur vers un tableau de pointeur

    étagère pleine d'annuaires = base de donnée

    pièce pleine d'étagères = serveur de bases de données

    etc...

    Une infinité de niveau de pointage est possible, c'est le coté abstraction de la chose, et seule l'imagination est une limite car les machines de maintenant sont quasi illimitées. internet représente un univers entier contenant plusieurs millions de pièces pleines d'étagères.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 146
    Par défaut
    merci de toutes ces questions.
    dans mon court on me parle de chaine et c'est cela qui m'a gener dans la compréhension des ponteurs donc pour le moment tous ce que j'ai compris c'est;

    on crée une variable un par exemple
    donc on fait
    si l'on appelle le pointeur il va appeller l'adresse mémoire de cette variable aléatoirement donc j'écrit par exemple:
    donc pour m'y retrouver j'ai mis que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pointeur = Ox 111;
    donc j'ai une variable qui s'appelle "un" son contenu est un chiffre "1" et son adresse "111";

    Maintenant on me dit qu'on peut chainer tous cela j'ai essayer de le traduire en schema ?



    par contre la tête l'adresse du pointeurs ?, elle est définit aléatoirement ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [LG]Les pointeurs: Forme en "Anneaux"
    Par k o D dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2004, 07h29
  2. Réponses: 4
    Dernier message: 13/08/2004, 18h39
  3. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  4. pointeurs, toujours les pointeurs :/
    Par giviz dans le forum C
    Réponses: 16
    Dernier message: 08/10/2003, 15h02
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo