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 :

Pb de compréhension pointeur


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Pb de compréhension pointeur
    Bonjour,

    Soit la capture d'écran suivante :
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    [marc@nantes langage C]$ cat variable4.c
    #include <stdio.h>

    int main(void) {
    int var=2;

    printf("La variable var est stocke a l'adresse %p et est valorisé a %d \n",&var, var);

    int *point;

    printf("le pointeur *point pointe sur %p et est valorisé a %d\n", &*point, *point);
    point=&var;

    printf("le pointeur *point pointe sur %p et est valorisé a %d \n", &*point, *point);

    }
    [marc@nantes langage C]$ ./variable4
    La variable var est stocke a l'adresse 0xbfb1beec et est valorisé a 2
    le pointeur *point pointe sur 0x4a581390 et est valorisé a 1474660693
    le pointeur *point pointe sur 0xbfb1beec et est valorisé a 2
    [marc@nantes langage C]$
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    l'adresse du pointeur point est elle 0x4a581390?
    ou 0x4a581390 est l'adresse sur laquelle pointe le pointeur ?
    comment connaitre l'adresse du pointeur ?

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par marcoss
    Bonjour,

    Soit la capture d'écran suivante :
    Ah ben j'avais jamais vu une capture d'écran en mode texte.


    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    [marc@nantes langage C]$ cat variable4.c
    #include <stdio.h>

    int main(void) {
    int var=2;

    printf("La variable var est stocke a l'adresse %p et est valorisé a %d \n",&var, var);

    int *point;

    printf("le pointeur *point pointe sur %p et est valorisé a %d\n", &*point, *point);
    point=&var;

    printf("le pointeur *point pointe sur %p et est valorisé a %d \n", &*point, *point);

    }
    [marc@nantes langage C]$ ./variable4
    La variable var est stocke a l'adresse 0xbfb1beec et est valorisé a 2
    le pointeur *point pointe sur 0x4a581390 et est valorisé a 1474660693
    le pointeur *point pointe sur 0xbfb1beec et est valorisé a 2
    [marc@nantes langage C]$
    $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

    l'adresse du pointeur point est elle 0x4a581390?
    ou 0x4a581390 est l'adresse sur laquelle pointe le pointeur ?
    comment connaitre l'adresse du pointeur ?
    Hum pas compris ta question.
    Au début tu déclares un pointeur sur un int, il pointe n'importe où, tu n'est pas censé le savoir. Tu est censé initialisé un pointeur à NULL. De plus il est déconseillé de déréférencer un pointeur pointant à une adresse dont tu sais pas si elle est valide.
    Après tu fais pointer ton pointeur sur l'entier var. L'adresse de point est la même que var, c'est tout. Si tu modifies *point, tu modifies var et inversement.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Skyrunner
    Hum pas compris ta question.
    Au début tu déclares un pointeur sur un int, il pointe n'importe où, tu n'est pas censé le savoir. Tu est censé initialisé un pointeur à NULL. De plus il est déconseillé de déréférencer un pointeur pointant à une adresse dont tu sais pas si elle est valide.
    Après tu fais pointer ton pointeur sur l'entier var. L'adresse de point est la même que var, c'est tout. Si tu modifies *point, tu modifies var et inversement.
    Ok je modife donc 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
     
    #include <stdio.h>
     
    int main(void) {
      int var=2;
     
      printf("La variable var est stocke a l'adresse %p  et est valorisé a %d \n",&var, var);
     
      int *point=&var;
     
      printf("le pointeur *point pointe sur  %p et est valorisé a %d\n", &*point, *point);
     
    }
    La variable var est stocke a l'adresse 0xbfd815dc et est valorisé a 2
    le pointeur *point pointe sur 0xbfd815dc et est valorisé a 2

    je précise ma question: la variable var qui contient un entier à une adresse physique, le pointeur point qui pointe sur var à bien une adresse physique differente, j'aimerais donc pouvoir afficher cette valeur.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 376
    Points : 41 545
    Points
    41 545
    Par défaut
    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 <stdio.h>
     
    int main(void) {
      int var=2;
      int *point = &var;
     
      /* "est valorise" ??? C'est quoi ce dialecte ? */
      printf("La variable var est stockee a l'adresse %p et contient la valeur %d\n", &var, var);
     
      /* Pas d'étoile dans le nom du pointeur. */
      printf("Le pointeur point pointe sur %p qui contient la valeur %d\n", point, *point);
      printf("Le pointeur point est stocke a l'adresse %p et contient la valeur (l'adresse) %p\n", &point, point);
     
      return 0;
    }
    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.

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Ah tu voulais l'adresse du pointeur.

    Ben c'est comme Medinoc te l'a montré.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut

    Citation Envoyé par marcoss
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    {
      int *point;
     
      printf("le pointeur *point pointe sur  %p et est valorisé a %d\n", &*point, *point);
    Comportement indéfini. point est une variable locale. Comme elle n'est pas initialisée, son contenu n'est pas defini. On a donc un pointeur qui contient une valeur non définie. Déjà, c'est louche. De plus, tu fais des opérations de déréférencement sur ce pointeur :
    La valeur du pointeur n'étant pas définie, le comportement est donc indéfini, et il peut arriver n'importe quoi (chez moi, un crash quand j'ai essayé, mais ce n'est qu'un comportement parmi d'autres). C'est un bug grave qu'il ne faut pas faire.

    Ce qui est extrêmement grave avec les comportements indéfinis, c'est que le comportement visible n'est pas forcément erroné. Il n'y a donc aucun moyen autre que visuel (lecture du code par un codeur confirmé) de s'assurer qu'un programme en C est correct sur ce plan.

    Comme je dis souvent, le C n'est pas un langage de débutants en informatique.

    Ceci-dit, un bon compilateur correctement configuré

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

    peut parfois signaler un problème potentiel. Ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:15: warning: control reaches end of non-void function
    main.c:8: warning: 'point' might be used uninitialized in this function
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 4 seconds)
    0 errors, 2 warnings
    Ce genre de warning ne doit pas nous laisser indifférent. Ici, il montre exactement le problème de comportement indéfini.

    Mais attention, beaucoup de cas de comportements indéfinis ne sont pas vus par le compilateur.
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par marcoss
    je précise ma question: la variable var qui contient un entier à une adresse physique, le pointeur point qui pointe sur var à bien une adresse physique differente, j'aimerais donc pouvoir afficher cette valeur.
    L'adresse du pointeur, c'est &point.

    Nota : Ne parle pas "d'adresse physique", mais "d'adresse", ça suffira ! L'adresse physique n'est pas ce que tu crois...

    Il y a quelques problèmes de formulation dans ton code qui révèlent un certain flou...

    Je propose ceci :
    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
     
    #include <stdio.h>
     
    int main (void)
    {
       int var = 2;
     
       printf ("L'adresse de la variable var est %p.\n"
               "Sa valeur est %d.\n\n", (void *) &var, var);
       {
          int *point = &var;
     
          printf ("L'adresse de la variable point est %p.\n"
                  "Sa valeur est %p.\n"
                  "La valeur pointee est %d.\n", (void *) &point, point, *point);
       }
       return 0;
    }
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    L'adresse de la variable var est 0022FF70.
    Sa valeur est 2.
     
    L'adresse de la variable point est 0022FF6C.
    Sa valeur est 0022FF70.
    La valeur pointee est 2.
     
    Press ENTER to continue.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    merci à tous
    j'y vois plus clair maintenant.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/03/2015, 23h42
  2. compréhension de C pointeurs
    Par mikedew dans le forum C
    Réponses: 7
    Dernier message: 17/03/2012, 17h01
  3. Problème de compréhension d'un exercice sur les pointeurs
    Par neufrdb dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 28/05/2011, 23h58
  4. Compréhension des pointeurs
    Par tealc_210 dans le forum Débuter
    Réponses: 4
    Dernier message: 25/10/2009, 20h30
  5. Réponses: 17
    Dernier message: 22/01/2007, 13h34

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