« Programmation C/Pointeurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Tavernier (discussion | contributions)
m Révocation des modifications de Tavernierbot (retour à la version précédente de 84.100.219.221)
→‎Arithmétique de base : suppression d'un exemple erroné
Ligne 75 :
}</source>
 
Normalement un tableau de N cases permet d'être itéré sur les indices allant de 0 à N - 1, inclusivement. L'instructionexpression <code>&tableau[N]</code> (les crochets ayant précédance)fait référence unela case mémoire non allouée immédiatement après le plus grand indice, donc potentiellement source de problème. MaisToutefois, commepar onexception spour le premier indice après le plus grand, C garantit que le résultat de l'arrêteexpression justesoit avantbien (inférieurdéfini. strict)Bien sûr, celail ne posefaut pas dedéréférencer problèmece pointeur.
 
À noter qu'à l'issue de la boucle, <code>p</code> pointera sur la N+1ème case du tableau, donc hors de l'espace alloué. Le C autorise tout à fait ce genre de pratique, il faut juste faire attention à ne pas déférencer le pointeur à cet endroit. Pour parcourir le tableau dans l'autre sens, il faut donc écrire un code du genre&nbsp;:
 
On notera que pour un tableau, écrire <code>&tableau[0]</code> ou <code>tableau</code>, c'est strictement équivalent. Cela montre qu'en C, la notion de pointeur et de tableau sont intimement liés. Dans l'itération, on ne peut évidemment pas commencer à la case <code>&tableau[N]</code>, car elle n'est pas censée exister, on doit alors penser à reculer d'une case juste avant.
<source lang="c">/* Parcours les éléments d'un tableau */
int tableau[N];
int * p;
 
for (p = &tableau[N-1]; p >= tableau; p --)
{
/* ... */
}</source>
 
On notera que pour un tableau, écrire <code>&tableau[0]</code> ou <code>tableau</code>, c'est strictement équivalent. Cela montre qu'en C, la notion de pointeur et de tableau sont intimement liés. Dans l'itération, on ne peut évidemment pas commencer à la case <code>&tableau[N]</code>, car elle n'est pas censée exister, on doit alors penser à reculer d'une case juste avant.
 
Comme avec l'exemple précédent, à l'issue de cette boucle, <code>p</code> se trouvera à l'indice -1, du tableau. Encore une fois, c'est tout à fait autorisé en C, tant qu'on ne déréférence pas le pointeur.</li>
 
<li>Soustraction de deux pointeurs de même type (combien d'objet de type ''T'' y a t-il entre les deux pointeurs) : le résultat est donc un '''entier''', de type <code>ptrdiff_t</code>.