58 votes

Pointeur Arithmétique

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 ++.

58voto

Jeremy Ruten Points 59989

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.

52voto

Johannes Schaub - litb Points 256113

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.

3voto

arul Points 10719

Je considère comme un bon exemple d’arithmétique de pointeur la fonction de longueur de chaîne suivante:

 int length(char *s)
{
   char *str = s;
   while(*str++);
   return str - s;
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X