Le passage cité est tout à fait tort. Les expressions vector[i]
et *(vector+i)
sont parfaitement identiques et peuvent s'attendre à générer un code identique dans toutes les circonstances.
Les expressions vector[i]
et *(vector+i)
sont identiques , par définition. C'est une propriété fondamentale du langage de programmation C. Compétente programmeur C comprend cela. Tout auteur d'un livre intitulé" Comprendre et Utiliser C les Pointeurs doivent comprendre cela. Tout auteur d'un compilateur C le comprendrez. Les deux fragments de générer un code identique n'est pas par hasard, mais parce que pratiquement n'importe quel compilateur C sera, en effet, traduire l'une dans l'autre presque immédiatement, de sorte que le temps qu'il arrive à son code phase de génération, il ne sait même pas ce qui avait été initialement utilisé. (Je serais assez surpris si un compilateur C jamais eu de code différent pour vector[i]
plutôt *(vector+i)
.)
Et en fait, le texte cité contredit lui-même. Comme vous l'avez remarqué, les deux passages
La notation vector[i]
génère du code machine qui commence à l'emplacement de vector
, se déplace i
des postes à partir de cet emplacement, et se sert de son contenu.
et
La notation *(vector+i)
génère du code machine qui commence à l'emplacement de vector
, ajoute i
pour l'adresse, puis utilise le contenu à cette adresse.
dire essentiellement la même chose.
Sa langue est étrangement similaire à celui en question 6.2 de l'ancien C FAQ de la liste:
...lorsque le compilateur voit l'expression a[3]
, il émet le code pour démarrer à l'emplacement "a
", déplacez les trois derniers, et de récupérer le personnage il. Lorsqu'il voit l'expression p[3]
, il émet le code pour démarrer à l'emplacement "p
", de récupérer la valeur du pointeur, d'ajouter trois à l'aiguille, et finalement de récupérer le caractère souligné.
Mais bien sûr, la principale différence ici est que l' a
est un tableau et p
est un pointeur. La FAQ de la liste est parlent pas de a[3]
contre *(a+3)
, mais plutôt sur l' a[3]
(ou *(a+3)
) où a
est un tableau, par rapport p[3]
(ou *(p+3)
) où p
est un pointeur. (Bien sûr ces deux cas, de générer un code différent, car les tableaux et les pointeurs sont différents. Comme la liste FAQ explique, la récupération d'une adresse d'un pointeur de variable est fondamentalement différent de l'utilisation de l'adresse d'un tableau.)