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 :

question sur les pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Par défaut question sur les pointeurs
    Bonjour a tous,
    je debute en C...
    Dans mon livre, j'ai ça comme cours :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Int IntVar;
    Int* PIntVar;
    PIntVar=&IntVar;
    *PIntVar=10;
    J'ai tout compris sauf que je me demandais s'il etait possible d'utiliser
    a la place de :

    ceci :

    ?


  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 41
    Par défaut
    le type de ton pointeur doit être le même type que la variable sur lequel il pointe (la variable dont le pointeur contient l'adresse mémoire).
    donc, non, ce n'est pas possible.

    De plus tu as homis l'étoile dans long PintVar, alors que l'étoile sert à déclarer un pointeur (ça différencie une variable d'un pointeur).


    sinon tu peux faire:


    au lieu de:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Int* PIntVar;
    PIntVar=&IntVar;

    c'est plus rapide.


    Un bon tuto sur les pointeurs:
    http://chgi.developpez.com/pointeur/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Par défaut
    Merci pour cette reponse rapide
    Bon bein j'ai rien compris alors j'avais cru qu'on pouvait stocker une
    adresse de variable Int dans un Long...bon, tant pis

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par bubu92
    Merci pour cette reponse rapide
    Bon bein j'ai rien compris alors j'avais cru qu'on pouvait stocker une
    adresse de variable Int dans un Long...bon, tant pis
    L'adresse d'une variable se stocke dans un pointeur, ils sont faits pour ça.

    Pour quelle raison voulais-tu stocker l'adresse dans un "long" ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Par défaut
    En fait je voulais juste savoir si c'etait possible. Je pensais que l'adresse d'un
    Int tenait sur 4 octets et que par consequent on pouvait la stocker dans une
    variable Long. Mais apparement c'est pas possible, on alors je me trompe dans
    les tailles...Bref, encore merci pour vos reponses .

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Par défaut
    Citation Envoyé par bubu92
    En fait je voulais juste savoir si c'etait possible. Je pensais que l'adresse d'un
    Int tenait sur 4 octets et que par consequent on pouvait la stocker dans une
    variable Long. Mais apparement c'est pas possible, on alors je me trompe dans
    les tailles...Bref, encore merci pour vos reponses .
    Un problème est que les tailles ne sont pas les mêmes sur toutes les architectures.

    Si les tailles correspondent, on peut stocker un pointeur dans un long.
    Si on ne tient pas à sa vie, on peut traverser la rue sans regarder avant si un véhicule arrive.

    Dans les deux cas, à moins de vouloir se créer des problèmes, cela n'a pas d'intérêt.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par bubu92
    je me demandais s'il etait possible d'utiliser
    a la place de :
    ceci :
    C'est techniquement possible dans certains cas bien précis et bien documentés (windows ne s'en prive pas...), mais ce n'est pas portable et d'une utilité douteuse.

  8. #8
    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
    Si d'aventure tu tenais vraiment à mettre un pointeur dans un type entier (encore que, c'est vraiment rare que ce soit utile), utilise plutôt un type garanti assez grand, comme un intptr_t (je ne sais plus si c'est standard, POSIX, ou autre), un INT_PTR sous Windows ou un IntPtr en .Net...
    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.

  9. #9
    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,

    En tant qu'adresse d'une (série de) case mémoire, rien n'empeche de mettre l'adresse à laquelle on trouve un entier comme valeur d'adresse à laquelle on devrait trouver un long... une adresse mémoire, c'est une adresse mémoire, c'est codé sur le meme nombre de bits qu'il s'agisse d'un caractere, d'un entier, d'un long ou d'un réel double précision

    Sauf que...

    Sauf que les données qui seront réellement pointées n'ont pas forcément la meme taille, et donc, que tu prépares toi meme la corde qui servira à te pendre...

    En effet, le premier risque, c'est de prendre des habitudes qui peuvent t'apporter des problemes du genre de faire pointer un caractère dans un pointeur d'entier, ce qui provoque une "conversion implicite" de ton caractère (qui, va-t-on dire, fait un octet) en un entier (qui, va-t-on dire, en fait... 4), avec tous les problèmes du au fait que les données ne sont plus correctement alignées...

    Si meme tu évites ce premier écueil, tu en as un autre juste derrière, qui est beaucoup plus sournois.

    Peut-etre, en effet, te rendra tu compte que, sur ton architecture, et avec ton compilateur, un entier et un long ont la meme taille... L'utilisation d'un pointeur de long sur ton entier, dans ton cas particulier, ne poserait donc pas de problème... Mais, c'est là que tu décides de donner ton code source à un pote, qui travaille sur une autre architecture, ou avec un autre compilateur et pour lequel la taille des entier n'est pas égale à celle des long...

    Et, le code qui, chez toi, semblait fonctionner sans problèmes, s'avere planter irrémédiablement chez ton pote...

    Dans une telle situation, retrouver le fait que c'est ta convertion implicite d'entier en long qui est responsable du comportement indéfini de l'application est vraiment de nature à te faire attraper des cheveux gris

    Le meilleur conseil que l'on puisse donc te donner, c'est de ne pas t'amuser à utiliser un pointeur d'un type (quel qu'il soit) pour récupérer l'adresse d'un autre type (quel qu'il soit)...

    Meme l'utilisation d'un pointeur "unsigned int*" pour prendre l'adresse d'un "int" (ou vice versa) risque de te donner des résultats surprenants (surtout pour toutes les valeurs se trouvant dans la deuxième moitié de la plage de valeurs accessibles )
    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

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    177
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 177
    Par défaut
    Vous avez mille fois raison
    Maintenant que j'ai attaqué les tableaux et faux-tableaux, je comprends mieux
    mon erreur...
    Encore merci pour vos reponses.

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Si d'aventure tu tenais vraiment à mettre un pointeur dans un type entier (encore que, c'est vraiment rare que ce soit utile), utilise plutôt un type garanti assez grand, comme un intptr_t (je ne sais plus si c'est standard, POSIX, ou autre), un INT_PTR sous Windows ou un IntPtr en .Net...
    intptr_t c'est C99 et souvent disponible même quand tout C99 ne l'est pas.

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

Discussions similaires

  1. Question sur les pointeurs génériques
    Par mikedavem dans le forum C
    Réponses: 16
    Dernier message: 24/05/2006, 11h56
  2. question sur les pointeurs
    Par jd.baculard dans le forum Langage
    Réponses: 3
    Dernier message: 18/03/2006, 02h30
  3. [Debutant] Nouvelle question sur les pointeurs
    Par etiennegaloup dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2006, 09h55
  4. Question sur les pointeurs.
    Par Chrisemi dans le forum C++
    Réponses: 5
    Dernier message: 28/10/2005, 23h47
  5. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25

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