Arithmétique de pointeur obtenant une sortie incorrecte

Dans le programme suivant, Here a été déclaré en tant que pointeur sur un pointeur entier et a été affecté à l’adresse de base du tableau p[] , qui a été déclarée en tant que tableau de pointeur entier. Supposons que ptr contienne l’adresse 9016 (supposons que l’adresse de départ de p soit 9016) avant que ptr soit incrémenté et qu’après ptr++ , il contiendra la valeur 9020 (supposons que int prend 4 octets).

Donc, ptr-p devrait donner la sortie sous la forme 4, soit (9020-9016 = 4). Mais cela donne un résultat de 1. Pourquoi?

 #include int main() { static int a[]={0,1,2,3,4}; static int *p[]={a,a+1,a+2,a+3,a+4}; int **ptr=p; ptr++; printf("%d",ptr-p); return 0; } 

    Le résultat d’un pointeur moins un autre pointeur est le nombre d’ éléments entre eux, pas le nombre d’octets.

     int **ptr=p; ptr++; 

    ptr avance d’un élément, donc ptr - p 1 .

    En passant, ce comportement est cohérent avec ptr++ (ce qui signifie ptr = p + 1; dans votre exemple).

    La soustraction d’un pointeur à un autre pointeur du même type de base renvoie un entier indiquant le nombre d’éléments de celui entre les deux pointeurs.

    Si nous avons 2 pointeurs deux int pointeurs p1 et p2 , contenant respectivement les adresses 1000 et 1016, alors p2-p1 donnera 4 (depuis la taille de int 4).

    Lorsque vous trouvez la différence entre deux pointeurs, vous obtenez le nombre d’objects entre eux. Dans ce cas, comme les objects sont de type entier, vous avez correctement obtenu la valeur 1.

    Si vous voulez connaître la valeur en octets, vous devriez faire:

     printf("%d",(char *)ptr-(char *)p); 

    Il imprimera 4.