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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Par défaut Parametre de fonction
    Salut!

    Je souhaiterais avoir des précisions quant à l'emploi de ces différentes signatures de fonctions :

    1/ void f( MyType mt );
    2/ void f( MyType &mt );
    3/ void f( MyType *mt );

    -> 1/ correspond au passage par valeur donc dans la fonction on fait ce qu'on veut de la valeur. En dehors de f, mt a toujours la meme valeur.

    -> 2/ correspond a un passage par référence donc on passe l'adresse d'une variable et si on modifie mt dans la fonction, a la sortie de f la modification est presente

    -> et 3/ correspond a la meme chose que 2/ ms pour des pointeurs

    Est-ce que tout est exact?


    Merci de votre confirmation...

    Tyv

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    C'est bien exact...

    On peut juste rajouter que la différence entre le 2) et le 3), c'est que dans le cas d'un pointeur, il peut etre NULL, alors qu'une référence ne peut pas l'etre

    C'est à vrai dire la seule différence réelle qu'il y aie entre une référence et un pointeur
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    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 293
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par koala01
    C'est à vrai dire la seule différence réelle qu'il y aie entre une référence et un pointeur
    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.

    Je vais de ce pas chercher un peu de litérature sur ce sujet pour étayer mon propos

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    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.
    Ben, c'est quand même la même chose
    Une référence ce n'est qu'un pointeur déguisé pour offrir un accès simplifié à la variable. Et le fait que la référence doit obligatoirement pointer vers quelque chose de valide est bien la seule différence avec un pointeur (si on ne pinaille pas).

    De toute façon une fois le code compilé, une référence n'est rien d'autre qu'un bête adresse, tout comme un pointeur.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    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 293
    Billets dans le blog
    2
    Par défaut
    Méééé heu!!! Je vous dis que j'ai raison!! Vous êtes tous nul d'abord!!!
    Désolé, j'ai abusé sur l'apéro

    Plus sérieusement:
    Il est très important de distinguer les pointeurs, qui sont des adresses mémoire, des références qui sont des variables de types très divers.
    (http://www.ann.jussieu.fr/courscpp/S...Sect03-C1.html)

    Citation Envoyé par faqlite
    Utilisez les références quand vous pouvez, et les pointeurs quand vous devez.
    (http://jlecomte.ifrance.com/c++/c++-...rences-fr.html)

    Un pointeur dispose de toute une série d'opérateurs, une référence n'en a pas.
    Contrairement à un pointeur, il est impossible de déclarer une référence sans l'initialiser.
    Comme l'a dit koala01, un pointeur peut prendre la valeur NULL, la référence non.
    Les références n'existent qu'en C++. Les pointeurs existent en C et en C++.
    L'utilisation d'une référence fait gagner un adressage par rapport à un pointeur. Je ne suis pas adepte de l'optimisation, et j'avoue que je ne sais pas si ça a une quelconque importance.

    Toutes ces différences, et en particulier les 2 premières, font qu'un pointeur est beaucoup plus dangereux à utiliser qu'une référence.

    Le code suivant, par exemple, illustre une erreur assez classique qui ne peut pas arriver si on utilise une référence à la place d'un pointeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void foo(int* p)
    {
    	p+=5;
    }
     
    int main(int argc, char* argv[])
    {
    	int p = 0;
     
    	foo(&p); //on appelle foo en pensant que ça va modifier la valeur de p
    	return 0;
    }
    Ensuite, lorsque l'on choisi d'utiliser un pointeur ou une référence, cela implique un choix sémantique. 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, et on ne sait pas à quoi sert ce const. Alors que l'utisation d'une référence constante est trés explicite.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Par défaut
    Merci beaucoup pour ces précisions c'est sympa!!
    Je crois que ça a fait du bien a tout le monde :p

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    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 293
    Billets dans le blog
    2
    Par défaut
    Bonjour,
    Citation Envoyé par Tyver
    -> 1/ correspond au passage par valeur donc dans la fonction on fait ce qu'on veut de la valeur. En dehors de f, mt a toujours la meme valeur.
    Exact.
    Lorsqu'on utilise la passage par valeur, le compilateur effectue une copie du paramètre lorsque la fonction est appelée. Par conséquent, les modification du paramètre effectué à l'intérieur de la fonction vont affecter la copie de la variable passée en paramètre, et non la variable elle-même.

    Citation Envoyé par Tyver
    -> 2/ correspond a un passage par référence donc on passe l'adresse d'une variable et si on modifie mt dans la fonction, a la sortie de f la modification est presente
    Exact. RAS.

    Citation Envoyé par Tyver
    -> et 3/ correspond a la meme chose que 2/ ms pour des pointeurs
    Oui, mais...
    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.

  8. #8
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Citation Envoyé par Tyver
    1/ void f( MyType mt );

    -> 1/ correspond au passage par valeur donc dans la fonction on fait ce qu'on veut de la valeur. En dehors de f, mt a toujours la meme valeur.

    Tyv

    Attention, si MyType est une classe, le destructeur sera appelé à la fin de la fonction !

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 23
    Par défaut
    Citation Envoyé par millie
    Attention, si MyType est une classe, le destructeur sera appelé à la fin de la fonction !

    Merci pour vos réponse et cette dernière aussi que j'ignorais!
    Excellent week-end!

    Tyv

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tout élément passé par référence/pointeur serait mieux const.

  11. #11
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    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 293
    Billets dans le blog
    2
    Par défaut
    Je ne comprend pas pourquoi tu dis ça. I ly a plein de cas où ce n'est pas vrai. Si l'on souhaite modifier le paramètre dans la fonction par exemple.
    Enfin, il doit y avoir un truc qui m'échappe là.

  12. #12
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Pourquoi le modifier ?
    Si ta fonction doit produire un résultat, il est sémantiquement plus juste qu'elle le retourne sous forme de valeur.

  13. #13
    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

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    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.

  15. #15
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 293
    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 293
    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
    }

  16. #16
    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.

Discussions similaires

  1. reference anomyme en parametre de fonction
    Par seb9999 dans le forum C++
    Réponses: 7
    Dernier message: 03/02/2006, 15h31
  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, 17h51
  3. Parametre de fonction
    Par yoshï dans le forum Linux
    Réponses: 1
    Dernier message: 09/01/2006, 10h46
  4. parametre et fonction
    Par jeff_! dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 19/12/2005, 09h55
  5. Réponses: 13
    Dernier message: 13/10/2005, 16h03

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