Quelqu'un a-t-il de bons articles ou explications (blogs, exemples) pour l'arithmétique de pointeur? Le public visé est un groupe de programmeurs Java qui apprennent le C et le C ++.
Réponses
Trop de publicités?C'est là que j'ai appris des pointeurs: http://www.cplusplus.com/doc/tutorial/pointers.html
Une fois que vous comprenez les pointeurs, l'arithmétique des pointeurs, c'est facile. La seule différence entre elle et régulière de l'arithmétique, c'est que le nombre que vous ajoutez le pointeur sera multiplié par la taille du type que le pointeur pointe. Par exemple, si vous avez un pointeur vers un int
et int
's la taille est de 4 octets, (pointer_to_int + 4)
évaluera à une adresse de mémoire de 16 octets (4 ints) à l'avance.
Donc, lorsque vous écrivez
(a_pointer + a_number)
dans l'arithmétique des pointeurs, ce qui se passe réellement est
(a_pointer + (a_number * sizeof(*a_pointer)))
dans l'arithmétique ordinaire.
Tout d'abord, l' usage de la suce vidéo peut aider. C'est une belle vidéo sur les pointeurs. Pour l'arithmétique, voici un exemple:
int * pa = NULL;
int * pb = NULL;
pa += 1; // pa++. behind the scenes, add sizeof(int) bytes
assert((pa - pb) == 1);
print_out(pa); // possibly outputs 0x4
print_out(pb); // possibly outputs 0x0 (if NULL is actually bit-wise 0x0)
(Notez que l'incrémentation d'un pointeur qui contient un pointeur null valeur strictement est un comportement indéfini. Nous avons utilisé la valeur NULL, car nous étions intéressés seulement dans la valeur du pointeur. Normalement, seule l'utilisation pour incrémenter/décrémenter quand pointant vers des éléments d'un tableau).
La figure suivante montre deux concepts importants
- addition/soustraction d'un entier à un pointeur signifie déplacer le pointeur vers l'avant / vers l'arrière par N éléments. Donc, si un int fait 4 octets gros, pa pourrait contenir 0x4 sur notre plate-forme après avoir incrémenté de 1.
- la soustraction d'un pointeur par un autre pointeur signifie l'obtention de leur distance, mesurée par les éléments. Donc en soustrayant pb de pa rendement de 1, parce qu'ils ont un élément distance.
Sur un exemple pratique. Supposons que vous écrivez une fonction et les gens vous fournir avec un début et de fin de pointeur (très courant en C++):
void mutate_them(int *begin, int *end) {
// get the amount of elements
ptrdiff_t n = end - begin;
// allocate space for n elements to do something...
// then iterate. increment begin until it hits end
while(begin != end) {
// do something
begin++;
}
}
ptrdiff_t
quel est le type de (fin - début). Il peut être un synonyme de "int" pour certains compilateur, mais peut être un autre type pour un autre. On ne peut pas savoir, donc on choisit le générique typedef ptrdiff_t
.