arithmétique de pointeur (char *) & a – (char *) & a == 4

Si a est un tableau int, (char*) &a[1] - (char *)&a[0] est égal à 4, tandis que &a[1] - &a[0] est égal à 1. pourquoi est-ce?

Le calculateur de pointeur agit sur la taille de la structure de données pointée. C’est parce que si je fais ça:

 int array[10] ; int * p = array ; p ++ ; 

Je veux que p pointe vers le deuxième int, pas de mémoire à mi-chemin entre deux éléments.

So &a[1] correspond à quatre octets à part de &a[0] mais demande-le &a[1] - &a[0] demande combien il en est. Quand vous le lancez en caractère, vous demandez le calcul en termes de taille de caractère.

Quand tu fais

 &a[1] - &a[0] 

comme a est un tableau int, on suppose un pointeur implicite (int *), c’est-à-dire

 (int *)&a[1] - (int *)&a[0] 

Par conséquent, puisque les deux sont de type pointeur sur int, leur différence donne 1.

Mais quand tu…

 (char*) &a[1] - (char *)&a[2] 

en supposant que int soit 4 octets et que char est 1 octet sur votre compilateur, la différence sera de quatre puisque chaque élément de a est int et a quatre octets.

C’est un problème courant chez les programmeurs de traiter les pointeurs comme une simple adresse. C’est une mauvaise approche. Pour que le compilateur crée le code de bas niveau approprié, il doit en savoir plus sur le pointeur que le seul emplacement de la mémoire sur lequel il pointe. Cette information supplémentaire correspond à la taille de l’object pointé par un pointeur. Ce tout est contenu dans le type de pointeur et est nécessaire pour l’aruthmétique de pointeur. Par exemple:

 int a[25] ; int *i_ptr = a; printf("address of 1st element %d\n", a); printf("address of 1st element %d\n", &a[0]); // address of first element + sizeof(int) printf("address of 2nd element %d\n", a+1); // address of first element + sizeof(int) printf("address of 2nd element %d\n", &a[1]); // this one is sortingcky // address of first element + sizeof(25*int) ie sizeof(the whole array) printf("address of JUST AFTER THE ARRAY %d\n", &a+1); 

Last est très délicat et la plupart des programmeurs ne le savent même pas. Bien que a pointe vers le premier élément du tableau et ait un type d’élément de tableau, & a est complètement différent. Il conserve également l’adresse du premier élément du tableau (c’est-à-dire, début du tableau), mais son type est différent, ce qui suggère au compilateur que l’arithmétique du pointeur sur ce point sera basée sur la taille du tableau et non sur celle de l’élément.

donne:

 address of 1st element 2881388 +0 address of 1st element 2881388 +0 address of 2nd element 2881392 +4 address of 2nd element 2881392 +4 address of JUST AFTER THE ARRAY 2881488 +100 

Chaque fois que vous obtenez l’adresse de quelque chose avec l’opérateur, il est associé à un type permettant des calculs ultérieurs avec ce type de pointeur.

N’oubliez pas qu’il existe un pointeur vide * auquel aucune information de type n’est associée et que vous ne pouvez pas effectuer de calcul.