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 :

Parametre de fonction


Sujet :

C++

  1. #21
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    r0d Pour ergoter un peu :
    Je ne suis pas d'accord. Une référence, c'est l'adresse de l'endroit où est stocké l'objet. Un pointeur est une variable dans laquelle est stockée l'adresse où est stocké l'objet. Ce n'est pas du tout la même chose.
    Passé en argument d'une fonction, l'argument "pointeur" est l'adresse où est stocké l'objet. C'est devenu une simple valeur, pas une variable. Je préfère pour ma part dire que la référence est l'objet.

    Lorsque tu passes un pointeur en paramètre, ce pointeur est copié lors de l'appel à la fonction. Donc si tu modifie le pointeur à l'intérieur de la fonction, il y a de grandes chances pour que cela engendre des problèmes.
    Et pourquoi donc ?
    L'utilisation d'une référence fait gagner un adressage par rapport à un pointeur.
    ???

    Par exemple, la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(const int* p)
    {
    	*p+=5;
    }
    compile,
    Ne compile pas

  2. #22
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    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 401
    Par défaut
    Citation Envoyé par diogene
    Passé en argument d'une fonction, l'argument "pointeur" est l'adresse où est stocké l'objet. C'est devenu une simple valeur, pas une variable. Je préfère pour ma part dire que la référence est l'objet.
    C'est quand même plus compliqué. Quand on se met à jouer avec les pointeurs (notamment "prendre l'adresse d'une référence"), on prend l'adresse de l'objet en effet. Pour moi, je préfère dire que la référence est un pointeur déguisé, et que chaque utilisation comporte une étoile implicite (cad, int *pi = &ri correspond à int *pi = &*pr_i.
    Citation Envoyé par diogene
    Et pourquoi donc ?
    Sans doute, parce que ceux qui connaissent mal les pointeurs les confondent avec les références...
    Citation Envoyé par diogene
    ???
    Dans le source. La référence masque un niveau d'indirection par rapport au pointeur (mais ne fait que le masquer, évidemment).

    Ne compile pas
    En effet. Par contre, ce code-ci compile, du fait des priorités opératoires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void foo(const int* p)
    {
    	*p++;
    }
    Naturellement, il ne fait pas la même chose (en l'ocurrence, ce code ne fait rien).
    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.

  3. #23
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 325
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par diogene
    Pour ergoter un peu :
    Passé en argument d'une fonction, l'argument "pointeur" est l'adresse où est stocké l'objet. C'est devenu une simple valeur, pas une variable. Je préfère pour ma part dire que la référence est l'objet.
    Peut-être n'ais-je pas bien compris ce que tu voulais dire, mais je soutiens qu'un pointeur, qu'il soit passé en argument de fonction ou non, est une variable. Si tel n'était pas le cas, aucune arythmétique ne serait applicable aux pointeurs.

    Citation Envoyé par Christian Casteyde
    Les pointeurs sont justement des variables qui contiennent l'adresse d'autres objets[...]
    (http://c.developpez.com/tutcpp/x1541.php)

    Citation Envoyé par diogene
    Et pourquoi donc ?
    Parce que, justement, un pointeur est une variable, ce qui induit donc une indirection supplémentaire. En revanche, et je m'en doutais un peu, ce point semble être négligeable:

    Citation Envoyé par faqlite
    En lui-même le niveau d'indirection supplémentaire est de la gnognotte
    (http://jlecomte.ifrance.com/c++/c++-...antics-fr.html )

    Citation Envoyé par diogene
    Ne compile pas
    Hum oui, désolé, je me suis trompé Erreur de copier/coller
    Je voulais dire:
    void foo( const int* p)
    {
    p+=5; // pas de déréférencement
    }

  4. #24
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Peut-être n'ais-je pas bien compris ce que tu voulais dire, mais je soutiens qu'un pointeur, qu'il soit passé en argument de fonction ou non, est une variable.
    Ce que je veux dire c'est que les arguments d'une fonction (hormis les références) sont dans un contexte de valeur.
    Dans le cas d'un pointeur qui nous occupe, je peux mettre
    - une adresse (NULL, &objet,...)
    - ou un pointeur et dans ce cas, celui-ci est interprété comme la valeur du pointeur, autrement dit l'adresse de l'objet pointé (ou NULL)
    - ou une expression (genre p+1) qui évaluée fournit elle aussi une valeur de type adresse de... (Dans p+1, p est aussi dans un contexte de valeur)
    Christian Casteyde a écrit :
    Les pointeurs sont justement des variables qui contiennent l'adresse d'autres objets[...]
    Entièrement d'accord
    Parce que, justement, un pointeur est une variable, ce qui induit donc une indirection supplémentaire.
    Entièrement pas d'accord pour une référence en argument de fonction. C'est vrai si on reste dans le code où la référence est définie puisqu'alors le compilateur sait quel objet correspond à la référence (mais ce n'est pas très utile). Mais en passage d'argument, le seul moyen d'identifier l'objet dans la fonction est de connaître son adresse et c'est ce qui est passé à la fonction.

  5. #25
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 401
    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 401
    Par défaut
    diogene a raison, il n'y a aucune différence d'indirection entre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void UneFonction(UneClasse &obj)
    {
    	obj.uneFonctionNonVirtuelle();
    }
     
    void UneAutreFonction()
    {
    	UneClasse unObjet;
    	UneFonction(unObjet);
    }
    et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void UneFonction(UneClasse *pObj)
    {
    	pObj->uneFonctionNonVirtuelle();
    }
     
    void UneAutreFonction()
    {
    	UneClasse unObjet;
    	UneFonction(&unObjet);
    }
    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.

  6. #26
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Médinoc
    C'est quand même plus compliqué. Quand on se met à jouer avec les pointeurs (notamment "prendre l'adresse d'une référence"), on prend l'adresse de l'objet en effet. Pour moi, je préfère dire que la référence est un pointeur déguisé, et que chaque utilisation comporte une étoile implicite (cad, int *pi = &ri correspond à int *pi = &*pr_i.
    C'est une autre manière de dire la même chose : Si la référence est un pointeur (déguisé) déréférencé par une étoile (implicite) c'est qu'elle désigne l'objet dont l'adresse correspond au pointeur (déguisé).
    Accessoirement, j'ai toujours trouvé incohérente la définition des références par
    int &p
    au lieu de
    int *& p qui seraitcohérent avec int * pi = &p
    On retrouve encore ton étoile implicite

Discussions similaires

  1. reference anomyme en parametre de fonction
    Par seb9999 dans le forum C++
    Réponses: 7
    Dernier message: 03/02/2006, 16h31
  2. [VBA-E]passage de parametre à une fonction
    Par DonKnacki dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/02/2006, 18h51
  3. Parametre de fonction
    Par yoshï dans le forum Linux
    Réponses: 1
    Dernier message: 09/01/2006, 11h46
  4. parametre et fonction
    Par jeff_! dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 10h55
  5. Réponses: 13
    Dernier message: 13/10/2005, 17h03

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