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 :

Pointeur sur r�f�rence ?


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    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 Pointeur sur r�f�rence ?
    Salut,

    Je me pose une question existentielle concernant la (sans doute mauvaise) chose que seraient les "pointeurs sur r�f�rence"...

    Il y a, parfaitement, moyen de d�clarer une r�f�rence sur pointeur, ce qui permet au 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
     
    void fonction(int *& tab, int size)
    {
        /*...*/
    }
    int main()
    {
        int* tab=new int[10];
        /*...*/
        fonction(tab,10);
        /*...*/
        delete[] tab;
        return 0;
    }
    de fonctionner...

    Par contre, quand on essaye de d�clarer un pointeur sur r�f�rence sous la forme de
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void fonction(int&* tab)
    {
        /*...*/
    }
    le compilateur sort une erreur
    Citation Envoy� par le compilateur
    cannot declare pointer to int&
    Du moins, c'est ce que me sort gcc, et il semblerait que VC++ r�agisse de la m�me mani�re...

    La question est donc:

    M'y prends-je vraiment tr�s mal pour d�clarer un pointeur sur r�f�rence, ou est-ce purement et simplement interdit dans la norme

    La troisi�me solution �tant de prendre un bon compilateur car rien ne l'interdit dans la norme
    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

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par d�faut
    Il me semble qu'on ne peut tout simplement pas faire de pointeur sur r�f�rence, sans doute en partie car cela donnerait un moyen de modifier la r�f�rence...
    Sans compter que le fait d'avoir un pointeur sur r�f�rence "tue" la notion de simplicit� qui leur est attach�e...

    Mais je n'ai pas la norme sous les yeux.
    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. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par d�faut
    D'un autre c�t�, tu peux toujours faire un pointeur sur structure contenant une r�f�rence...
    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.

  4. #4
    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
    Citation Envoy� par M�dinoc Voir le message
    D'un autre c�t�, tu peux toujours faire un pointeur sur structure contenant une r�f�rence...
    Oui, oui, �a, ce n'�tait m�me pas mis en doute... Mais on commence � sortir un peu du cadre de "pointeur sur r�f�rence"

    EDIT d'ailleurs, c'est bien simple, rien ne t'empeche de passer l'adresse d'une r�f�rence � une fonction demandant un pointeur...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void fonction( int* ptr)
    {
     
    }
    int main()
    {
        int i=5;
        int& ref=i;
        fonction(&ref);
        /*...*/
        return 0;
    }
    ne pose a priori aucun probl�me � la compilation
    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 Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    F�vrier 2006
    Messages
    2 155
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2006
    Messages : 2 155
    Par d�faut
    Salut Koala !
    Justement, j'ai moi aussi pas mal de question sur ce sujet !

    1) Une r�f�rence, n'est ce pas un pointeur d�guis� ?
    2) Quand tu �cris
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void fonction(int *& tab, int size)
    {
        /*...*/
    }
    N'y a t-il pas une simplification faire par le compilateur? Voyons ce code par exemple :
    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
    #include <iostream>
    #include <limits>
     
    using namespace std;
     
    int main()
    {
    	int val = 4;
    	int* p_val = &val;
     
    	std::cout << *& p_val << std::endl;
     
    	cout << "Appuyez sur entrée pour continuer...";
        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
    }
    Le *& est un �l�ment neutre ici. Ce que je me demande, c'est comment le compilo interpr�te alors la fonction
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    void fonction(int *& tab, int size)
    Peut-�tre je raconte des salades, j'essaye juste de comprendre ...

  6. #6
    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
    C'est relativement crade, mais la r�f�rence sur pointeur va alors r�agir un peu comme un pointeur de pointeur... Le 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
     
    #include <iostream>
    using namespace std;
    void fonction(int *& tab, int size)
    {
        delete[] tab;
        tab=new int[size];
        for(int i=0;i<size;i++)
        {
            tab[i]=i+1;
        }
    }
    int main()
    {
        int* tab=new int[10];
        for(int i=0;i<10;i++)
        {
            tab[i]=i+1;
        }
        cout<<"avant :"<<endl;
        for(int i=0;i<10;i++)
        {
            cout<<tab[i]<<endl;
        }
        /*...*/
        fonction(tab,20);
        cout<<"apres :"<<endl;
        for(int i=0;i<20;i++)
        {
            cout<<tab[i]<<endl;
        }
        delete[] tab;
        return 0;
    }
    va sortir le r�sultat
    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
    avant :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    apres :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [EDIT]Par contre, je ne suis pas sur du tout que la lib�ration de m�moire demand�e dans fonction ne lib�re toute la m�moire de tab
    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

  7. #7
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Citation Envoy� par poukill Voir le message
    Le *& est un �l�ment neutre ici. Ce que je me demande, c'est comment le compilo interpr�te alors la fonction
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    void fonction(int *& tab, int size)
    Bonjour, non ce n'est pas neutre. Tu peut ainsi modifier le pointeur pass� en param�tre. Par exemple si tu fait une allocation

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void alouemem(int * tab, int size)
    {
    tab = new int[size];
    }
    Tu ne recuperera jamais ce qui est allou� car tab est une copie du pointeur pass� en param�tre. Alors que
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void alouemem(int * &tab, int size)
    {
    tab = new int[size];
    }
    modifiera bien le pointeur pass� en param�tre puisque tab le reference

  8. #8
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Citation Envoy� par poukill Voir le message
    1) Une r�f�rence, n'est ce pas un pointeur d�guis� ?
    Pour moi,
    S�rement pour le code mais pas du tout dans son concept.
    Une r�f�rence est plus sctrict qu'un pointeur :
    • ne reference qu'un objet et jamais un ensemble
    • r�f�rencera toujours le m�me objet
    • Plus explicite qu'un pointeur dans son utilit�

  9. #9
    Membre �prouv�
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par d�faut
    Un pointeur sur une r�f�rence, ce ne serait finalement rien d'autre qu'un pointeur sur l'objet original. Non ? Je comprends que tu te poses des questions existentielles (je m'en pose aussi souvent, et il arrive qu'elles atterrissent ici) mais y aurait-il une utilit� que j'aurais manqu�e � ce concept ?

    A partir du moment ou tu ressens le besoin d'avoir un pointeur sur une r�f�rence, il est toujours possible d'utiliser � la place un pointeur sur l'objet original permettant la m�me utilisation, vu que la r�f�rence n'est qu'un alias de l'objet, non modifiable.

  10. #10
    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
    C'est aussi ce que je subodorais... Mais, dans le doute, j'ai d�cid� de poser la question (c'est typiquement le genre de r�flexion qui peut venir � une personne d�s�uvr�e, non )

    Enfin, on va laisser le sujet ouvert jusqu'au passage de quelqu'un qui aura la norme sous les yeux... Des fois que...
    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

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 3
    Dernier message: 23/03/2015, 11h12
  2. Pointeur sur r�f�rence ?
    Par Borax Kid dans le forum D�buter
    R�ponses: 10
    Dernier message: 03/04/2014, 14h53
  3. R�ponses: 11
    Dernier message: 14/05/2009, 14h07
  4. R�f�rences et pointeurs sur un tableau
    Par smag dans le forum C++
    R�ponses: 2
    Dernier message: 01/03/2005, 20h29
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladiff�rence dans le forum C
    R�ponses: 5
    Dernier message: 11/08/2003, 19h37

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