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.
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é.)
> 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.
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.
Le Tout est souvent plus grand que la somme de ses parties.
Le Tout est souvent plus grand que la somme de ses parties.