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 :

un point sur les pointeurs (pas fait exprés)


Sujet :

C

  1. #1
    Membre actif
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Points : 299
    Points
    299
    Par défaut un point sur les pointeurs (pas fait exprés)
    Salut a tous,

    j'ai appris et travaillé ce week end les pointeurs. Pas de soucis pour l'instant je comprends leur utilité.
    J'ai fais un micro code pour me représenter correctement les choses, pas de soucis sauf un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<stdio.h>
     
    void main(){
       int age=10;
       *pointeur=&age;
       printf("l'adresse physique de la variable age est: %p\n",&age);
       printf("l'adresse physique du pointeur est: %p\n",*pointeur);
       printf("age et pointeur valent tout les deux la meme valeur:age=%i et *pointeur vaut:%i\n",age,*pointeur);
    }
    le code s'execute bien le seul probleme vient du 2eme affichage. Si je ne me suis pas planté, age et *pointeur ont la meme valeur d'adresse or, ici, l'adresse de *pointeur est 0xa.
    Si pour le deuxieme printf je met pointeur et non plus *pointeur, alors l'adresse affichée de pointeur et la meme que age.
    Quelqu'un pourrait m'expliquer pourquoi? La "variable" pointeur c'est pointeur ou *pointeur?


    Vous avez trouvé votre bonheur? Alors hop ca aidera tout le monde !

  2. #2
    Membre actif
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Points : 299
    Points
    299
    Par défaut
    Je pense avoir voulu aller trop vite en fait et je me suis embrouillé bettement.
    Si je ne dis pas de betise, pointeur désigne la valeur et *pointeur son adresse c'est ca?
    C'est comme age=valeur et &age=adresse?


    Vous avez trouvé votre bonheur? Alors hop ca aidera tout le monde !

  3. #3
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Je suis d'accord pour age et &age mais:

    pointeur contient l'adresse de la variable pointée
    *pointeur contient la valeur pointée par pointeur

    Ce qui t'a embrouillé c'est peut être le fait que l'on déclare un pointeur:

    int * pointeur;

  4. #4
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Voici ma correction:

    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
    #include<stdio.h>
     
    /* -tc- ATTENTION: main() retourne un entier de type int, toujours! */
    int main(void)
    {
        int age = 10;
        /* -tc- Tu dois specifier le type de pointeur i.e. pointeur sur int */
        int *pointeur = &age;
        printf("l'adresse physique de la variable age est: %p\n", (void *) &age);
        /* -tc- pointeur contient l'adresse de la variable age, mais l'adresse physique de la 
         * variable pointeur est differente de celle de age.
         */
        printf("l'adresse physique du pointeur est: %p\n", (void *) &pointeur);
        /* -tc- Non - age vaut 10 et pointeur vaut &age. la valeur situee a 
         * l'adresse contenue dans pointeur vaut 10.
         *
         * printf("age et pointeur valent tout les deux la meme valeur:age=%i"
         *        " et *pointeur vaut:%i\n",age,*pointeur);
         */
        printf("age vaut %d\n", age);
        printf("pointeur pointe sur la valeur %d\n", *pointeur);
     
        /* -tc- Les 3 valeurs portables que peut retourner main() sont 0,
           EXIT_SUCCESS et EXIT_SUCCESS */
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Pourquoi doit-on caster en void* dans le printf?

  6. #6
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Salut,

    Premièrement, dans ton bout de code, tu oublies de déclarer ton pointeur. Je suppose que tu l'as déclaré plus haut en tant que int*.

    Un pointeur est lui-même une variable, mais d'un type qui lui permet de stocker une adresse mémoire. Prennons l'exemple d'une armoire avec des tiroirs numérotés. Une variable simple est un tiroir. Une variable "pointeur" est un tiroir qui contient un bout de papier où est noté le numéro d'un autre tiroir.

    Tu as donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int var;
    int* ptr;
    var: le tiroir (variable)
    &var: le numéro du tiroir (adresse)
    ptr : le numéro d''un tiroir (adresse)
    *ptr : le CONTENU du tiroir dont le numéro est inscrit dans le tiroir ptr (contenu de la case mémoire pointée par ptr)
    J'espère que c'est suffisemment clair. N'hésites pas à demander des précisions.

    Benz
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Pourquoi doit-on caster en void* dans le printf?
    Parce que printf() est un fonction à nombre variable de paramètres. Dans ce cas, il n'y a pas de conversion implicite réalisée par le compilo. Comme le spécificateur de format %p demande un argument de type void *, le cast est nécessaire. Un compilateur bien réglé te retourne un avertissement en cas d'absence du cast.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Merci et c'est compris dans -Wall ou -W?

  9. #9
    Membre actif
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Points : 299
    Points
    299
    Par défaut
    merci a vous.
    pointeur contient l'adresse de la variable pointée
    *pointeur contient la valeur pointée par pointeur

    Pour le reste j'ai pas compris pour le printf mais le temps fera le reste.
    Y'a encore du chemin avant que je fasse un mini OS PDA ou UNIX like qui sait?!

    Merci encore de votre réactivité.


    Vous avez trouvé votre bonheur? Alors hop ca aidera tout le monde !

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Merci et c'est compris dans -Wall ou -W?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    -Wall -Wextra -ansi -pedantic
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Oui, mais par simple curiosité, c'est compris dans laquelle de ces options?

  12. #12
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Oui, mais par simple curiosité, c'est compris dans laquelle de ces options?
    La réponse est certainement ici: http://gcc.gnu.org/onlinedocs/gcc-4....arning-Options

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  13. #13
    Membre habitué
    Avatar de Nykoo
    Profil pro
    Inscrit en
    Février 2007
    Messages
    234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 234
    Points : 166
    Points
    166
    Par défaut
    Je pensais y échapper. Merci.

  14. #14
    Membre actif
    Avatar de yorukaze
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    285
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 285
    Points : 299
    Points
    299
    Par défaut
    -Wall permet d'afficher un maximum de probleme contrairement a -W


    Vous avez trouvé votre bonheur? Alors hop ca aidera tout le monde !

  15. #15
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Nykoo Voir le message
    Oui, mais par simple curiosité, c'est compris dans laquelle de ces options?
    Il faut activer:

    -Wformat est inclue par -Wall

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  16. #16
    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 yorukaze Voir le message
    j'ai appris et travaillé ce week end les pointeurs. Pas de soucis pour l'instant je comprends leur utilité.
    J'ai fais un micro code pour me représenter correctement les choses, pas de soucis sauf un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #include<stdio.h>
     
    void main(){
       int age=10;
       *pointeur=&age;
       printf("l'adresse physique de la variable age est: %p\n",&age);
       printf("l'adresse physique du pointeur est: %p\n",*pointeur);
       printf("age et pointeur valent tout les deux la meme valeur:age=%i et *pointeur vaut:%i\n",age,*pointeur);
    }
    Ne parle pas d'adresse 'physique', mais d'adresse tout court. Elle peut être physique (rare), logique (souvent) ou que sais-je encore...

    main() retourne int. Toujours.

    'pointeur' n'est pas défini. Ce code ne compile pas.
    le code s'execute bien le seul probleme vient du 2eme affichage. Si je ne me suis pas planté, age et *pointeur ont la meme valeur d'adresse or, ici, l'adresse de *pointeur est 0xa.
    L'adresse de 'pointeur', c'est '&pointeur'. '*pointeur', c'est la valeur pointée.
    Si pour le deuxieme printf je met pointeur et non plus *pointeur, alors l'adresse affichée de pointeur et la meme que age.
    Quelqu'un pourrait m'expliquer pourquoi? La "variable" pointeur c'est pointeur ou *pointeur?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int a = 10; /* variable de tyoe int valant 10 */
    int *pa = &a; /* variable de type pointeur sur int valant l'adresse de a */
     
    printf ("a=%d\n", a);
    printf ("&a=%p\n", (void *) &a); /* adresse de a */
    printf ("pa=%p\n", (void *) pa); /* valeur de pa (adresse de a) */
    printf ("*pa=%d\n", *pa); /* valeur de a */
    printf ("&pa=%p\n", (void *) &pa); /* adresse de pa (sans interet ici...) */
    Pas de Wi-Fi à la maison : CPL

  17. #17
    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 yorukaze Voir le message
    pointeur contient l'adresse de la variable pointée
    *pointeur contient la valeur pointée par pointeur
    C'est exactement ça.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    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 yorukaze Voir le message
    -Wall permet d'afficher un maximum de probleme contrairement a -W
    Lit la doc au lieu de dire une ânerie...
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. Windows Phone 8 : Microsoft fait le point sur les nouvelles APIs
    Par Hinault Romaric dans le forum Windows Phone
    Réponses: 2
    Dernier message: 06/11/2012, 18h39
  2. Réponses: 3
    Dernier message: 29/08/2007, 12h58
  3. Réponses: 4
    Dernier message: 16/11/2006, 02h10
  4. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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