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

C Discussion :

Question sur les pointeurs.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut Question sur les pointeurs.
    Je ne comprend pas un truc.

    pourquoi pour une listes (liste chainee, file pile,... ). un coup on met un pointeur de pointeur de la structure en argument ici, un coup on met le pointeur de la structurela.


    Ce qui me semble bizard dans la 2nde url, c est que le pointeur de pointeur est seulement utiliser pour liberer la structure.

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    tout dépend des choix fait lors de l'implémentation, par exempe dans le tuto de CGI, la valeur du pointeur peut être modifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int Pop(pile **p)
    {
    [...]
            *p = tmp;       /* Le pointeur pointe sur le dernier élément. */
    [...]
    }
    Ce qui ne doit pas être le cas dans l'autre tuto (sauf pour la fonction sll_delete qui fait les choses proprement en mettant le poiteur à NULL).

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    ok.

    Mais le contenu de lachaine gardera les changement.

    Par contre j ai creer une structure liste avec un pointeur sur le dernier element de la liste.

    J ai cree une fonction add_elem(list *l, int val);
    avec l ma liste chainee et val la valeur a jouter.

    En sortant de la fonction le pointeur de fin de liste est modifie (ce que je veux faire car j ajoute a la fin de la liste).

    Mais pourquoi le dernier element est modifie (il pointe sur le nouveau dernier element) alors que tu as dit que pour cette implementation, le pointeur de debut reste inchangé ???

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    j explique avec plus avec mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    typedef struct elem 
    {
    	int num;
    	struct elem *next;
    } elem_t;
     
     
    typedef struct list 
    {
    	int num;
    	elem_t *list_elem;
    	elem_t *last_elem;
    } list_t;
     
     
    void add_last(list_t *l, int val) 
    {
    	elem_t *elem;
     
    	elem = create_elem(val);
    	if (elem != NULL) 
    	{
    		if (l->list_elem == NULL)
    		{
    			l->list_elem = elem;
    			l->last_elem = elem;
    		}
    		else
    		{
    			l->last_elem->next = elem;
    			l->last_elem = l->last_elem->next;
    		}
    	}
    	else
    	{
    		printf("Error : malloc failed.");
    		fflush(stdout);
    		exit(EXIT_FAILURE);
    	}
    }
    tout dépend des choix fait lors de l'implémentation, par exempe dans le tuto de CGI, la valeur du pointeur peut être modifié :
    d apres ce que tu dis, si on ne met pas un pointeur de pointeur, la valeur du pointeur ne sera pas modifie .... or quand j execute ce code et que apres j affiche la liste, les modification sont faites.

    Le truc est que la liste est passer par valeur (par default en C). Pour que la liste soit modifié apres la fonction, il faudrait la passer par reference (lun pointeur de pointeur). Or dans ce tutoriel la liste est passe par valeur et non par parametre. J ai donc essayer moi meme et ... surprise ca marche !!!!

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par nivose110
    d apres ce que tu dis, si on ne met pas un pointeur de pointeur, la valeur du pointeur ne sera pas modifie ....
    En C, tout est passé par valeur et aucun changement à un paramètre est visible par la fonction appelante.

    Dans ton cas, dans la fonction add_last, tout changement à la variable l ne sera pas visible par la fonction appelante. Par contre, toute modification à la zone pointée par le pointeur l le sera.

    Donc si on veut changer l'adresse pointée par l, il faut passer l'adresse où se trouve la valeur de l, donc un pointeur de pointeur.

    or quand j execute ce code et que apres j affiche la liste, les modification sont faites.
    Oui, ta liste est modifié mais pas la valeur du paramètre.

    Le truc est que la liste est passer par valeur (par default en C). Pour que la liste soit modifié apres la fonction, il faudrait la passer par reference (lun pointeur de pointeur). Or dans ce tutoriel la liste est passe par valeur et non par parametre. J ai donc essayer moi meme et ... surprise ca marche !!!!
    Parce que tu modifies la structure et non le pointeur... Tentes de faire pareil avec seulement ta structure elem_t, ce sera une autre paire de manches...

    Jc

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 52
    Par défaut
    ok merci pour ces precisions qui sont assez subtiles .

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

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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