Partage
  • Partager sur Facebook
  • Partager sur Twitter

Pointeur de strucrures

    20 mars 2024 à 22:03:45

    Bonsoir !!

    J'aimerai savoir comment ca se passe au niveau de la memoire lorsqu'un (pointeur de type structure) pointe vers une variable(de type structure, Bien sur !!) . Est ce que chaque champ (ou composant)  du pointeur a pour valeur l'adresse de chaque champ correspondant aux champs de la variable en question ? 

    Par exemple :

    typedef struct abonnement abonne;
    
    struct abonnement
    {
      char nom[30],prenom[30];
      int numAbonne;
    }; 
    
    abonne abonne1;
    abonne *ptrSurAbonne=&abonne1; 
    // Est ce que *ptrSurABonne.nom=&abonne1.nom ??


    Merci d'avance :D

    • Partager sur Facebook
    • Partager sur Twitter
      20 mars 2024 à 22:53:37

      Bonjour,

      Un pointeur, c'est juste une variable qui contient un nombre. Il n'a pas de champs, c'est juste l'adresse de quelque chose.

      Ici c'est l'adresse d'une structure.
      Et il manque juste des parenthèses à ta question.

          &(*ptrSurABonne).nom == &abonne1.nom
      ou :  &ptrSurABonne->nom == &abonne1.nom
      ou :   ptrSurABonne->nom ==  abonne1.nom

      L'étoile permet de dire : j'accède à l'endroit qu'indique ce nombre, et ça a le type pointé, on appelle cela le déréférencement du pointeur. Donc *ptrSurAbonne est ici la même chose que abonne1.

      -
      Edité par Dalfab 20 mars 2024 à 22:54:53

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        21 mars 2024 à 10:53:31

        Dalfab a écrit:

        Bonjour,

        Un pointeur, c'est juste une variable qui contient un nombre. Il n'a pas de champs, c'est juste l'adresse de quelque chose.

        Ici c'est l'adresse d'une structure.
        Et il manque juste des parenthèses à ta question.

            &(*ptrSurABonne).nom == &abonne1.nom
        ou :  &ptrSurABonne->nom == &abonne1.nom
        ou :   ptrSurABonne->nom ==  abonne1.nom

        L'étoile permet de dire : j'accède à l'endroit qu'indique ce nombre, et ça a le type pointé, on appelle cela le déréférencement du pointeur. Donc *ptrSurAbonne est ici la même chose que abonne1.

        -
        Edité par Dalfab il y a environ 11 heures

        Ahh d'accord , merci beaucoup 🙌🏽😊

        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2024 à 11:54:00

          Pour reprendre les bases, une définition comme

          struct abonnement
          {
            char nom[30],prenom[30];
            int numAbonne;
          };
           

          ça dit que les données de type "structure abonnement" sont représentées en mémoire par un "bloc" de  60 et quelques octets consécutifs (les uns après les autres, pour ceux qui ont des difficultés avec les mots de plus de 3 syllabes).

          Les 30 premiers pour le champ "nom", etc.  Le nombre d'octets pour le numAbonne, ça dépend de l'architecture et du choix de représentation des entiers par le compilateur. En général 4 ou 8 octets.

          Bref, ce bloc commence à une certaine adresse qui est aussi celle du champ nom. Subtilité, elles ne sont pas du même type (struct abonnement * pour la structure, char * pour le champ nom).

          Un pointeur, c'est fait pour contenir une adresse. On le définit avec le type qui va bien

          struct abonnement a;
          
          struct abonnement *pa  = & a;               // pointeur d'abonnement
          
          char              *nom = &( a.nom );        // pointeurs de caractères
          char           *prenom = &( pa->prenom );





          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2024 à 20:14:10

            michelbillaud a écrit:

            ....

            Les 30 premiers pour le champ "nom", etc.

            Oui, mais attention au padding pour cause d'alignement:

            #include <stdio.h>
            
            struct a1
            {
              char nom[30], prenom[30];
              int numAbonne;
            };
            
            struct a2
            {
              char nom[30], prenom[28];		// 28 pas 30 pour prenom
              int numAbonne;
            };
            
            
            
            int main(void) {
            	printf("sizeof(a1)=%d\nsizeof(a2)=%d\n", (int)sizeof(struct a1), (int)sizeof(struct a2));
            	
            	return(0);
            }

            donne 

            alors que a2, si on calcule, ne devrait en faire que 62 (sur base d'un int de 4 octets).

            -
            Edité par edgarjacobs 21 mars 2024 à 20:19:17

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            Pointeur de strucrures

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            • Editeur
            • Markdown