Partage
  • Partager sur Facebook
  • Partager sur Twitter

Les pointeurs

    6 septembre 2020 à 0:37:20

    Bonsoir, je bloque sur le printf dessous :
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {  int tab[]={1,2,3,4,5,6,7,8,9};
      int *p;
      p=tab;
      printf("%d",&tab[3]-&tab[0]);
        return 0;
    }
    pourquoi ca me donne la valeur a l'interieure des [] ??? Merci pour votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      6 septembre 2020 à 4:01:46

      Salut,
      Tu as seulement été malchanceux.
      Places des valeurs différentes dans ton tableau et tu ne retrouveras pas un résultat aussi cohérent.
      Quand on fait des calculs avec les pointeurs, le compilateur tient compte du type des pointeurs. Essaies ce qui suit:
          printf("%d %d\n", &tab[3], &tab[0]);
      Tu devrais avoir une différence de 12, n'est-ce pas?
      Maintenant, tu as un pointeur p. Fais ce qui suit:
          printf("%d %d\n", p, p+3);
      Tu verras encore une différence de 12. Mais si tu fais:
          printf("%d %d\n", *p, *(p+3));
      Tu obtiens quoi?
      Il y a bien 3 cases de différence entre tab[3] et tab[0]. Un 'int' prend 4 octets.

      -
      Edité par PierrotLeFou 6 septembre 2020 à 4:10:30

      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        6 septembre 2020 à 10:22:02

        Utilises le bouton code </> du forum pour poster ton code ! (tu peux modifier ton post, lien modifier en haut à droite du post).
        • Partager sur Facebook
        • Partager sur Twitter
          6 septembre 2020 à 11:50:38

          Je sais mais dans le printf je veux savoir le resultats de &tab[3]-&tab[0], faut que ca donne 12 (adresse[3]-adresse[0]) mais ca me donne 3, si je change &tab[25]-&tab[0]=25 -tab a 10 elements-, je comprends pas pourquoi ca donne l'indice et pas l'adresse.
          • Partager sur Facebook
          • Partager sur Twitter
            6 septembre 2020 à 12:18:39

            Arithmétique des pointeurs, c'est normal que ça donne 3 ! Ça tient compte de la taille du type pour donner le résultat.
            • Partager sur Facebook
            • Partager sur Twitter
              6 septembre 2020 à 12:21:22

              Je pense que c'est dû à l'arithmétique des pointeurs.

              Tout le monde sait que si p est un pointeur d'adresse 1520, p++ (c'est-à-dire p+1) permet d'accéder non pas à l'adresse 1521 mais à l'adresse de la case suivante.

              Par exemple si ce sont des pointeurs de 'int', p+1 aura l'adresse du 'int' suivant, qui est probablement 1524.

              Quant à p-1 (résultat de p--), ce sera pour la même raison le pointeur d'adresse 1516. Et p-3 sera le pointeur d'adresse 1508.

              Là tu soustrais deux pointeurs de type 'int *'. (C'est ce que m'a dit le warning de compilation quand il a râlé à cause du format %d.) La soustraction de pointeurs n'est pas la soustraction de nombres (ni donc la soustraction d'adresses). Si on soustrait deux pointeurs, le résultat est le nombre à ajouter au premier pour obtenir le second. Par exemple si les pointeurs d'entier p et q ont pour adresse 1508 et 1520, la soustraction q-p donnera le nombre n tel que p+n est l'adresse de q. Ce n'est pas 12 mais 3, car p+3 est une addition de pointeurs, pas une addition de nombres.

              (En fait c'est ce que disait Pierrot, mais j'ai un peu détaillé.)

              • Partager sur Facebook
              • Partager sur Twitter
                6 septembre 2020 à 12:25:47

                Ce résultat est normal.

                C'est l'arithmetique des pointeurs, quand tu soustraits deux pointeurs sur int le resultat est en sizeof(int), soit trois fois quatre.

                edit: pris de vitesse :)

                -
                Edité par thetui 6 septembre 2020 à 12:27:03

                • Partager sur Facebook
                • Partager sur Twitter
                  6 septembre 2020 à 17:30:23

                  Ah bon, merci pour votre. je pensais que les adresses ont les mêmes caractéristique d'un nombre.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 septembre 2020 à 18:46:21

                    @AymaneHarkati1:
                    > Je sais mais dans le printf je veux savoir le resultats de &tab[3]-&tab[0], faut que ca donne 12 (adresse[3]-adresse[0]) mais ca me donne 3
                    Si tu as fait le test que je t'ai suggéré:
                        printf("%d %d\n", &tab[3], &tab[0]);
                    Tu verras comme d'autres l'ont mentionné que la différence est bien de 12 comme je l'avais prédit (et sans boule de crystal ...)
                    L'arithmétique des pointeurs ne se fait pas comme l'arithmétique des entiers.
                    Le résultat des opérations est multiplié par la dimension du type des variables pointées. Ici ce sont des int.
                    si tu fais  p=p+1  tu additionnes '1' int, pas '1' octet. Donc, tu ajouteras 4 si la longueur des int est 4.
                    Ensuite, pour imprimer des pointeurs, on utilise plutôt le format %p au lieu de %d.
                    Si tu as un processeur 64 bits, je ne sais pas si le résultat serait valable avec %d pour de grandes adresses.
                    Tu peux essayer ce qui suit:
                        printf("Dimension d'un pointeur: %d\n", sizeof(int *));
                        printf("Dimension d'un int: %d\n", sizeof(int));
                    Les résultats sont en nombre d'octets, pas en bits.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                    Les pointeurs

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown