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 :

[Débutant] Pointeurs et fonctions


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut [Débutant] Pointeurs et fonctions
    Salut a tous,
    je débute en C, et je me pose une question a propos des pointeurs utilisés dans les fonctions.
    J'ai deux pointeurs d'entier, et je souhaite en fait échanger ces pointeurs: l'un pointerai la valeur pointée par l'autre et vice versa.
    Pour cela j'ai le code suivant:

    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
     
    #include <windows.h>
    #include <stdio.h>
     
    void echange(int *i, int *j) {
         printf("\n *i = %d , i = %d", *i,i);
         int temp = (int)i ;
         i = j ;
         j = temp ;
    }
     
    int main(void) {
     
        int i = 6 ;
        int j = 8 ;
     
        int *pi = &i ;
        int *pj = &j ;
     
        printf("\nAvant échange: *pi = %d , *pj = %d", *pi,*pj);
        echange(pi,pj);
        printf("\nAprés échange: *pi = %d , *pj = %d", *pi,*pj);
     
        system("pause"); 
        return 0 ;
    }
    Seulement ca ne marche pas et je ne comprend pas pourquoi... ca n'échange rien, pourtant si j'ai bien compris comment marchent les pointeurs, *pi représente la valeur pointée, et i représente l'adresse ou pointe le pointeur... et donc en échangeant i et j on devrai échanger les adresse pointées...
    Si quelqu'un pouvai m'expliquer ce que je n'ai pas compris

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ben oui, tu échanges les adresses pas les valeurs pointées.
    Les dangers du cast
    Je te laisse trouver le bon code. 8)
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    oui, en effet je pourrai faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    void echange(int *i, int *j) {
         int temp = *i ;
         *i = *j ;
         *j = temp ;
    }
    Mais je me demandai si, en échangeant la valeur contenur par le pointeur, c'est a dire l'adresse de l'élément pointé (ex: i = 5 est a l'adresse 5500, on a *pi = 5 et pi = 5500), le pointeur pointerai alors sur l'élément situé a la nouvelle adresse qu'il contient? (ex: j'ai j = 6 a l'adresse 6600, je je fai pi = 6600, *pi devrai valoir 6 non?)

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Tu veux échanger les pointeurs eux-mêmes, ou les valeurs pointées?

    Pour échanger les valeurs pointées (sans modifier les pointeurs)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Attetion: Code sans aucune vérification: Si un pointeur est NULL, crash probable */
    void EchangeValeursPointees(int *pa, int *pb)
    {
    int tmp = *pa;
    *pa = *pb;
    *pb = tmp;
    }
    Pour échanger les pointeurs eux-mêmes, il faut passer leurs adresses à la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Attetion: Code sans également aucune vérification: Si un pointeur de pointeur est NULL, crash probable */
    void EchangePointeurs(int **ppa, int **ppb)
    {
    int *ptmp = *ppa;
    *ppa = *ppb;
    *ppb = ptmp;
    }
    Pour éviter de faire ce genre d'erreur, il faut se souvenir que modifier les paramètres dans la fonction appelée ne les modifie pas dans la fonction appelante.
    Pour s'aider, on peut s'arranger pour que les paramètres soient non-modifiables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void EchangeValeursPointees(int * const pa, int * const pb)
    Avantages: Ici, on voit du premier coup d'oeil que les paramètres ne seront pas modifiés dans la fonction appelante.
    Inconvénients: On pourrait croire à tort que si on enlève le const, on pourra modifier les valeurs dans la fonction appelante... :/

    Comme quoi, rien ne vaut l'exercice...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Citation Envoyé par Médinoc
    Comme quoi, rien ne vaut l'exercice...
    C'est en programmant qu'on devient programmeur.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    ouaip je sais bien je programme beaucoup en java et c'est clair que rien ne vau la pratique... mais parfois on reste bloqué sur quelque chose qui en fait se révèle tout bete...

    Dc merci bcp j'ai compris maintenant pourquoi mon code ne fonctionne pas... c'est pi qui est passé en parametre a la fonction et on ne peut donc pas le modifier dans la fonction appelante (en revanche il est bioen modifié dans la fonction).
    Pour les pointeurs de pointeur, il faudrait donc déclarer deux autres pointeurs ... un peu lourd je trouve pour un simple échange

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

Discussions similaires

  1. [Débutant] Pointeur de fonction
    Par Lionkid dans le forum Débuter
    Réponses: 6
    Dernier message: 04/12/2008, 19h43
  2. [Débutant] Pointeur FILE dans une fonction
    Par Dexter00 dans le forum C
    Réponses: 8
    Dernier message: 29/08/2006, 21h37
  3. Matrice de pointeurs de fonctions
    Par sebduth dans le forum C
    Réponses: 15
    Dernier message: 18/07/2003, 14h03
  4. [Kylix] Pointeur de fonctions
    Par _dack_ dans le forum EDI
    Réponses: 1
    Dernier message: 03/07/2003, 10h17
  5. pointeur de fonction
    Par kardath dans le forum C
    Réponses: 4
    Dernier message: 28/12/2002, 14h39

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