Comment fonctionne l’incrémentation de pointeur?

Nous avons un tableau: int p[100] .
Pourquoi p[i] est équivalent à *(p+i) et non *(p+i*sizeof(int)) ?

Pourquoi p [i] est équivalent à * (p + i) et non * (p + i * sizeof (int))?

Certaines architectures de processeur ne pouvant déréférencer un pointeur qui ne pointe pas vers une adresse alignée sur la taille de son type. Cela signifie fondamentalement qu’un pointeur sur un entier de 4 octets doit toujours pointer sur une adresse multiple de 4.

Lorsqu’un programme tente de déréférencer un pointeur mal aligné, une “erreur de bus” peut en résulter. Vous pouvez en lire plus ici sur Wikipedia .

Ce que vous demandez, c’est que p + 1 incrémente le pointeur d’un octet au lieu d’un élément. Si le langage était conçu de cette manière, l’écriture p++ ne serait plus valable pour les pointeurs d’autres types que char . Cela poserait également de gros problèmes d’alignement de pointeur lorsqu’un programmeur oublie d’écrire * sizeof(*p) pour effectuer l’addition.

Cela peut paraître déroutant, mais il existe de très bonnes raisons pour lesquelles le langage a été conçu de cette façon.

Pourquoi p [i] est équivalent à *(p+i) et non *(p+i*sizeof(int)) ?

Parce que *(p+i) est également identique à *((int *) ((char *) p + i * sizeof (int))) . Lorsque vous ajoutez un entier i à un pointeur, celui-ci est déplacé i fois la taille de l’object pointé.

En effet, avant d’append i à p compilateur calcule en interne la taille du type de données que p pointe vers puis l’ajoute i fois à p .

Les éléments de tableau sont stockés de manière contiguë.

 *(p+i) 

Ici p a l’adresse de base du tableau p et i est compris entre 0 et 99.

Vous pouvez donc parcourir les éléments de p en incrémentant i .

Pourquoi p [i] est équivalent à *(p+i) et non *(p+i*sizeof(int)) ?

Ceci est dû au fonctionnement des arithmétiques de pointeur: append un entier n à un pointeur donne un pointeur sur le n ème élément (pas l’octet) à partir du premier (base 0).