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 :

réference et adresse


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut réference et adresse
    Bonjour,
    J'étudie en ce moment les cours de C++ (après avoir lu les cours de C)
    http://cpp.developpez.com/cours/polyCpp/

    et il y a d'écrit dans la partie "Références ou pointeurs ?"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    employé dans une déclaration, comme dans
    int &r = x;
    il sert à indiquer un type référence : « r est une référence sur un int »
     
    employé ailleurs que dans une déclaration il indique l'opération « obtention de l'adresse », comme dans l'expression suivante qui signifie « affecter l'adresse de x à p » :
    p = &x;
    No comprendo.
    Alors soit réference et affectation d'adresse ce n'est pas la meme chose
    soit les deux déclarations sont équivalentes à peu de chose près

    ou soit j'ai vraiment pigé que dalle.

    dans l'attente de vos réponses, je vous remercie d'avance

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    En fait, tout dépend de ce qui se trouve avant l'esperluette.
    • Si tu as un identifiant de type (int &, MaClasse &, ... ), c'est une référence, et il faut l'initialiser en lui donnant une variable existante du type attendu.
    • Si tu as un opérateur d'affectation ( = ) comme dans int * ptr = & i , c'est l'opérateur "address of" qui permet de récupérer l'adresse à laquelle se trouve l'élément que tu veux faire pointer par ton pointeur.
    Tu vois, c'est tout simple

    [EDIT]J'ai oublié le cas de l'appel d'une fonction :
    1. dans le prototype d'une fonction, tu te retrouves dans le premier cas,
    2. Si tu l'utilise lors de l'appel d'une fonction, c'est l'opérateur address of

    En réalité, la norme parle de "rvalue" et de "lvalue".

    une lvalue se trouve d'office à gauche de l'opérateur d'affectation "=" (s'il y en a un)et représente généralement une variable que l'on déclare, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i ; // déclare une variable de type int nommé i
    int * ptr = &i; // déclare une variable de type "pointeur sur int" nommée ptr et lui affecte l'adresse de i
    int & ref = i; // déclare une variable de type "référence sur int" nommée ref qui est un alias de i
    une rvalue est tout ce qui peut se trouver à droite de l'opérateur d'affectation, ou qui agit comme tel, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i = 3; // 3 est une rvalue
    foo( & i); // &i représente l'adresse de i, passée à une fonction, c'est une rvalue
    int result = bar(); // le résultat de bar peut etre affecté à résult : c'est une rvalue
    Selon ces termes,
    • chaque fois qu'une esperluette intervient dans une expression rvalue, c'est l'opérateur "address of"
    • chaque fois que l'esperluette intervient dans une expression lvalue, c'est le symbole d'une référence
    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
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Ca m'eclairci les idées, mais pas entierement
    Voila ma double question :

    -Qu'est ce qu'une référence?

    -Qu'est ce qu'une adresse?


    pour moi, la double réponse serais "les 2 sont identiques, ce sont les emplacements du stockage d'une donnée"

    je sens que vous allez me rire au nez...mais je ne suis qu'un jeune padawan

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    En fait, il y a une différence très nette entre une adresse, un pointeur et une référence...

    Une adresse, c'est l'adresse mémoire que tout objet que tu vas créer va utiliser pour sa propre représentation.

    Tu n'est pas sans savoir que les différentes informations qu'utilise ton ordinateur et tes applications sont stockées en mémoire.

    Pour que le processeur puisse accéder à ces informations, il a besoin d'en connaitre l'adresse, tout comme le facteur a besoin de connaitre ton adresse pour te faire parvenir ton courrier.

    A un instant T, il ne peut jamais y avoir qu'un et un seul objet à une adresse donnée, mais il est possible qu'un objet prenne plusieurs adresses, simplement parce qu'il est trop gros pour tenir intégralement sur une seule adresse (c'est comme si tu avais vingt enfants et que tu avais acheté tout un paté de maisons pour n'en faire qu'une seule grande maison... tout le courrier arrive à la meme adresse, sauf que cette adresse va "englober" plusieurs adresses "physiques").

    Un pointeur, c'est une variable "comme une autre", à ceci pres qu'elle contient... l'adresse mémoire à laquelle on va trouver un objet du type indiqué.

    L'utilisation de pointeurs pose énormément de problèmes, car :
    1. Ils peuvent représenter une adresse qui ne correspond pas à un objet réel
    2. il peuvent représenter une adresse qui signifie que l'ojbet n'existe pas
    3. ils utilisent une syntaxe particulière pour leur manipulation
    4. Il sont souvent synonymes d'allocation dynamique de la mémoire, et de tous les problèmes que l'on peut y associer comme le dépassement d'index, les tentatives de double libérations de la mémoire ou les fuites mémoires.
    5. L'utilisateur ne sait que rarement s'il doit ou non s'occuper lui-même de l'allocation dynamique de mémoire et / ou de la libération de la mémoire
    Comprenons nous quand meme : les pointeurs ont sans doute représenté une avancée majeure en programmation dans le sens où ils ont permis la transmission d'informations locales à une fonction vers une fonction "utilisatrice" de ces informations en en évitant la copie.

    Mais bon, les pointeurs souffrent de maux qui leurs sont propres

    C'est pourquoi C++ (et les autres langages par la suite) ont introduit la notion de référence.

    La référence n'est qu'un alias de variable, un pseudonyme que l'on donne à une variable lorsqu'on la transmet à une fonction, par exemple.

    Au cas où tu ne l'aurais pas remarqué, il y a quelqu'un derrière le clavier qui écrit koala01...

    Ce quelqu'un, c'est moi .

    Mais tout ce qu'écrit koala01, c'est moi qui l'écrit, tout ce qu'il peut arriver à koala01, c'est à moi que cela arrive.

    Et il ne pourrait pas y avoir de koala01 si je n'existais pas réellement.

    Le principe d'une référence est strictement pareil :
    • Pour qu'une référence puisse exister, il faut qu'il existe un objet auquel elle puisse... faire référence
    • Toutes les modifications que la référence pourrait subir seront répercutée sur l'objet "original", et inversement

    Bon, pour etre tout à fait honnête (mais dépêches toi de l'oublier après l'avoir lu ) il est vrai que, si tu regarde au niveau du code assembleur généré, il n'y aura aucune différence entre un pointeur et une référence : la référence sera gérée exactement comme s'il s'agissait d'un pointeur.

    Tu as donc parfaitement le choix d'utiliser soit une référence soit un pointeur lorsqu'il s'agit de transmettre des arguments dont tu veux éviter la copie à une fonction, mais...

    comme la référence est plus sécurisante et plus simple à l'emploi (elle offre une garantie d'existence de l'objet référencé, elle autorise la même syntaxe que si on travaillait avec l'objet lui-même, elle n'est pas synonyme de gestion dynamique de la mémoire, et bien d'autres choses que tu apprendras en leur temps), il est très largement recommander d'utiliser les références "chaque fois que possible", et de n'utiliser les pointeurs que "lorsque tu n'as pas le choix", et les circonstances dans lesquelles l'utilisation d'un pointeur se justifient sont très limitées
    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

  5. #5
    Membre régulier
    Inscrit en
    Septembre 2007
    Messages
    267
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Septembre 2007
    Messages : 267
    Points : 119
    Points
    119
    Par défaut
    Ca y est j'ai compris ^^

    Je te remercie pour ta longue explication. Je vais transmettre ton post à mes anciens camarades de classe qui m'ont posé la meme question.

    donc adresse c'est l'emplacement de stockage de ma variable dans la mémoire,
    réference c'est un code qui suit à la trace la variable qu'il réfère et vice/versa

    bonnes fêtes^^

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Il faut voir une référence comme un allias sur une variable existante.
    Une référence ne peut pas être nulle et doit être initialisée à la déclaration.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26
  2. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  3. changer l'adresse d'un fichier...
    Par cava dans le forum C
    Réponses: 6
    Dernier message: 05/06/2002, 12h22
  4. Adresse des polices de caractères dans la RAM video ?
    Par Anonymous dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 27/05/2002, 17h29

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