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 & Adresse C++


Sujet :

C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Pointeur & Adresse C++
    Bonsoir,

    dans ce programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int * fct();
    void main(void) {
    int *ptr;
     ptr=fct();
     cout << endl << "adresse=" << ptr << endl;
     cout << "valeur=" << *ptr << endl;
     _getch();
    }
    int * fct(){
    int entier=10;
    cout << "adresse=" << &entier << endl;
    cout << "valeur=" << entier << endl;
    return &entier;
    }
    Le resultat me semble etrange, pourquoi la valeur renvoyé est différente? por une meme adresse


    Cdlmt

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Bonjour.

    A la ligne :

    Il y a un warning :

    warning C4172: returning address of local variable or temporary
    En français :

    warning C4172:

    retourne l'adresse d'une variable locale ou temporaire

    Une fonction retourne l'adresse d'une variable locale ou d'un objet temporaire. Les variables locales et objets temporaires sont détruits au retour d'une fonction, donc l'adresse retournée n'est pas valide.

    Revoyez la conception de la fonction afin qu'elle ne retourne pas l'adresse d'un objet local.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci pour votre réponse

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

    Informations professionnelles :
    Activité : aucun

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

    Au passage, il est important de comprendre que l'utilisation de pointeurs est l'un des domaines les plus complexes du langage. Si bien que, à l'heure actuelle, on essaye de limiter leur utilisation:
    1. aux cas où l'on souhaite maintenir des collections d'objets présentant des comportements polymorphes (et encore, on essayera de se simplifier la vie en utilisant des pointeurs intelligents)
    2. si on ne dispose pas de la possibilité d'utiliser une classe comme boost::optional (bientot : std::optional), pour indiquer qu'une donnée particulière pourrait ne pas exister.

    Il est, bien sur, important de comprendre ce à quoi correspond la notion de pointeur, mais, d'une certaine manière, la seule chose dont tu aies besoin (avant d'atteindre l'étude de l'héritage et du polymorphisme) est qu'un pointeur n'est qu'une valeur numérique entière (généralement non signée) qui représente l'adresse mémoire à laquelle se trouve une donnée du type indiqué et que, bien sur, la valeur représentée ne peut être considérée valide que... tant que la donnée en question continue à exister

    Beaucoup de cours tendent, encore maintenant, à expliquer la problématique liée aux pointeurs beaucoup trop tôt alors que le récipiendaire n'a pas encore eu l'occasion de se dresser une "carte mentale des implications des différents choix du langage" suffisante que pour aborder le problème sans risque. Le fait est que ces cours tendent généralement à suivre une approche "historique" de l'apprentissage du C++ qui considère que l'on apprend d'abord C, puis que l'on fait du C with classes avant d'apprendre réellement le C++.

    Cette approche n'est pas d'avantage adaptée à l'apprentissage du C++ qu'une approche qui considérerait que l'on doit apprendre le latin de Jules Cesar pour apprendre le francais, sous prétexte que le francais "hérite" du latin... Mais bon, d'ici à ce qu'un cours (en francais qui plus est) puisse proposer une approche plus en rapport avec une approche moderne, contente toi surtout de ne pas trop faire attention à tout ce qui a trait à la gestion dynamique de la mémoire, du moins, tant que tu n'aborde pas sérieusement le paradigme orienté objet et les notions d'héritage et de polymorphisme.

    Pour t'éviter à avoir recours à la gestion dynamique de la mémoire, rappelle toi que la SL fournit un tas de possibilités qui prennent cet aspect particulier en charge, et que, si tu veux faire quelque chose de qualité, la connaissance de ces possiblités te sera bien plus utile que celle te permettant de gérer (plus ou moins bien) à la main le nombre de caractères d'une chaine de caractères ou un tableau de ... n'importe quoi
    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 émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Au passage, il est important de comprendre que l'utilisation de pointeurs est l'un des domaines les plus complexes du langage. Si bien que, à l'heure actuelle, on essaye de limiter leur utilisation:
    Je ne suis pas tout à fait d'accord sur ce point. Ce qui rend le C++ si compliqué est qu'on mélange de l'objet (qui est plutôt haut-niveau) avec des notions bas-niveau issues directement du C. Le C++ a beaucoup de mal à enlever cet héritage, et tant qu'il ne le fera pas, ça restera un gros bordel (ne parlons même pas de sa syntaxe).

    Voilà, c'était juste pour la petite précision !

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ce n'est pas la POO qui fout la grouille. C'est les exceptions. Elles demandent des précautions particulières quand on gère des ressources -- ou le contraire plutôt. Les pointeurs sont un cas particulier de ressource et contrairement aux idées reçues (parce qu'il y a "C", dans "C++"), on donne une importance plus grande que nécessaire aux pointeurs.

    Bon. Ceci dit, le problème est ici un problème de durée de vie et de compréhension de la différence entre la pile et le tas, et où vivent les variables.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2015
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bon j'ai pas tout compris de ce que vous m'avez écrit, mais je suis encore en formation
    Merci pour les explications, je pense que je comprendrais un peu mieu ce système de pointeur & adresse en pratiquant d'avantage

    Cordialement

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Sylargh Voir le message
    Bon j'ai pas tout compris de ce que vous m'avez écrit, mais je suis encore en formation
    Merci pour les explications, je pense que je comprendrais un peu mieu ce système de pointeur & adresse en pratiquant d'avantage

    Cordialement
    Oui, de toutes facons (perso, j'ai réellement "tilté" sur la manière d'utiliser les pointeurs tout juste après... avoir présenté mon examen de C sur le sujet )

    Mais, surtout, tu dois avoir conscience qu'il ne sert à rien en C++ d'utiliser les pointeurs (et ce qui va souvent avec : la gestion dynamique "manuelle" de la mémoire). La bibliothèque standard te fournit tout un tas d'outils qui font déjà cela pour toi et d'une manière beaucoup plus sécurisante que ce que tu pourras jamais atteindre étant donné ton niveau de connaissance actuel.

    Tant que tu n'as pas avancé dans ta connaissance du langage (et que tu n'as, entre autres, pas étudié la "problématique" des exceptions), refuse obstinément de gérer la mémoire "à la main" et tourne toi en priorité vers les fonctionnalités qui s'en chargent pour toi. C'est bon pour le C, mais très mauvais en C++.

    Plus tard, tu abordera le paradigme orienté objets, qui est classiquement un domaine dans lequel l'utilisation des pointeurs est "souvent indispensable". Mais on insistera alors pour que tu t'intéresse à ce que l'on appelle les "pointeurs intelligents" (des classes qui prennent la décision de libérer la mémoire "en temps opportun"), si bien que, à moins de t'intéresser de près au mode de fonctionnement de ces "pointeurs intelligents", tout ce que tu dois réellement savoir sur les pointeurs tient en réalité en peu de chose :
    un pointeur est une variable numérique entière (généralement non signée) qui représente l'adresse mémoire à laquelle on va trouver une variable du type indiqué.
    et
    Tout ira bien avec l'utilisation des pointeurs tant que l'adresse représentée par le pointeur correspond effectivement à l'adresse à laquelle se trouve une variable qui existe encore
    par contre, les problèmes commenceront à apparaitre lorsque ce ne sera plus le cas, que la valeur du pointeur corresponde à une adresse "connue pour être invalide" (nullptr) ou que la valeur n'ait pas été "mise à jour" après avoir occasionné la destruction de la variable pointée.
    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. Pointeur d'adresse mémoire
    Par LokornTiger dans le forum Débuter
    Réponses: 4
    Dernier message: 27/05/2010, 10h51
  2. Imprimer un pointeur (un adresse)
    Par coolas dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2008, 11h33
  3. pointeur et adresse
    Par nannouD dans le forum C++
    Réponses: 4
    Dernier message: 11/03/2008, 16h57
  4. Pointeurs et adresses : la question du débutant
    Par zeiht dans le forum C++/CLI
    Réponses: 16
    Dernier message: 26/06/2007, 14h09
  5. [LG]adresse de pointeur
    Par grand's dans le forum Langage
    Réponses: 7
    Dernier message: 29/05/2004, 10h27

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