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 :

Pointeurs dans une structure


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Math et informatique
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Math et informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Par défaut Pointeurs dans une structure
    Bonjour je viens de finir les structures en C et j'ai fait un peu les pointeurs , Pour faire un pointeur on accèdes à la valeur ainsi structure->variable mais quand y'a un pointeur dans la variable je bloque 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
    16
     
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct Variable Variable;
    struct Variable
    {
        int* p;
    };
    int main()
    {
        Variable x;
        int y=30;
        x.p = &y;
        printf("%d",y);
        printf("%d",x.&p);
    }
    Merci de vos réponses

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 983
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 983
    Par défaut
    Qu'un pointeur soit dans une structure ou pas, c'est exactement la même chose. x.p forme un tout qui désigne le pointeur p membre de la structure x, donc on ne met rien entre le point (l'opérateur de champ) et les lettres.

    Donc:
    • x.p est l'adresse mémoire où est stockée la valeur de y (x.p pointe vers y), puisque tu l'as affecté précédemment en utilisant l'opérateur d'adresse & devant le y: x.p = &y;
    • pour obtenir la valeur vers laquelle pointe x.p il faut juste ajouter l'opérateur de déréférencement * devant le pointeur (comme pour n'importe quel autre pointeur), soit *x.p

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nazim12 Voir le message
    Pour faire un pointeur on accèdes à la valeur ainsi structure->variable mais quand y'a un pointeur dans la variable je bloque
    Bonjour
    Déjà bien nommer les choses aide à les comprendre. Ce que tu nommes "variable" correspond en réalité à un "membre" de ta structure. Et ce que tu nommes "structure" est en fait un pointeur sur celle-ci.

    Prenons un exemple simple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct s_essai {
        char *pt;
        int x;
    }

    Cette structure contient un pointeur et un entier. Imaginons que tu aies une variable de cette struture, alors les accès se feront ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct s_essai var;
    printf("L'entier vaut %d et son adresse est %p\n", var.x, &var.x);
    printf("L'élément pointé est %c et son adresse est %p\n", *var.pt, var.pt);

    Si maintenant tu as un pointeur sur cette struture, alors les accès se feront ainsi
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct s_essai var;
    struct s_essai *pt_var=&var
    printf("L'entier vaut %d et son adresse est %p\n", (*pt_var).x, &(*pt_var).x);
    printf("L'élément pointé est %c et son adresse est %p\n", *(*pt_var).pt, (*pt_var).pt);

    Ici tu auras remarqué 2 choses
    • la logique et respectée: on tape d'abord dans "*pt_var" avant d'aller voir son membre pour ensuite éventuellement demander une opération sur celui-ci (comme demander son adresse "&")
    • la priorité des opérateurs fait qu'on est obligé de mettre "*pt_var" entre prenthèses

    Ce dernier point est le plus fastidieux. C'est pour l'alléger qu'il a été créé l'opérateur "flèche (->)" qui n'est qu'un alias. Ainsi "pt_var->" est un alias de "*pt_var". C'est la seule subtilité à connaitre pour comprendre tout le reste.

    Ce qui donne alors
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct s_essai var;
    struct s_essai *pt_var=&var
    printf("L'entier vaut %d et son adresse est %p\n", pt_var->x, &pt_var->x);
    printf("L'élément pointé est %c et son adresse est %p\n", *pt_var->pt, pt_var->pt);
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Candidat au Club
    Homme Profil pro
    Math et informatique
    Inscrit en
    Septembre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : Algérie

    Informations professionnelles :
    Activité : Math et informatique

    Informations forums :
    Inscription : Septembre 2014
    Messages : 2
    Par défaut
    Ah , Voila merci pour vos réponses ^^
    fallait juste ajouter le '*' avant !
    Si non juste pour m'assuré la notation p->x elle est équivalente à *p.x ou (*p).x ?

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Si tu as bien compris ce qui t'a été dit, tu devrais directement écarter cette proposition *p.x, équivalente à *(p.x)
    Reste la seconde : (*p).x qui est bel et bien équivalente à p->x.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 813
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par nazim12 Voir le message
    Si non juste pour m'assuré la notation p->x elle est équivalente à *p.x ou (*p).x ?
    Citation Envoyé par Sve@r Voir le message
    la priorité des opérateurs fait qu'on est obligé de mettre "*pt_var" entre prenthèses.
    Ce dernier point est le plus fastidieux. C'est pour l'alléger qu'il a été créé l'opérateur "flèche (->)" qui n'est qu'un alias. Ainsi "pt_var->" est un alias de "*pt_var".
    ...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. pointeur de fonction dans une structure
    Par Flow_75 dans le forum C++
    Réponses: 1
    Dernier message: 27/12/2008, 11h55
  2. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  3. Problème sur un pointeur dans une structure
    Par steph_1 dans le forum Langage
    Réponses: 5
    Dernier message: 05/09/2007, 18h59
  4. Réponses: 2
    Dernier message: 26/11/2006, 10h51
  5. Réponses: 7
    Dernier message: 04/01/2006, 15h34

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