La sémantique de l'opérateur d'indexation consiste à dire qu'après les déclarations :
int t[N]; int i;t[i] est équivalent à *(t + i). Vérifions que cela est bien conforme à la façon dont nous l'avons utilisé jusqu'à présent. Nous avons vu que t à pour valeur l'adresse du premier élément du tableau. D'après ce que nous savons sur l'addition entre un pointeur et un entier, nous pouvons conclure que t + i est l'adresse de l'élément de rang i du tableau. Si nous appliquons l'opérateur d'indirection à (t+i) nous obtenons l'élément de rang i du tableau, ce que nous notions jusqu'à présent t[i].
L'opérateur d'indexation noté [] est donc inutile, et n'a été offert que pour des raisons de lisibilité des programmes, et pour ne pas rompre avec les habitudes de programmation.
Puisque l'opérateur d'indexation s'applique à des valeurs de type pointeur, on va pouvoir l'appliquer à n'importe quelle valeur de type pointeur, et pas seulement aux constantes repérant des tableaux. En effet, après les déclarations :
int t[10]; int * p;on peut écrire :
p = &t[4];et utiliser l'opérateur d'indexation sur p, p[0] étant t[4], p[1] étant t[5], etc. p peut donc être utilisé comme un sous-tableau de t.
L'opérateur d'indexation est commutatif ! En effet, t[i] étant équivalent à *(t + i) et l'addition étant commutative, t[i] est équivalent à *(i + t) donc à i[t]. Lorsqu'on utilise l'opérateur d'indexation, on peut noter indifféremment l'élément de rang i d'un tableau, t[i] ou i[t]. Il est bien évident que pour des raisons de lisibilité, une telle notation doit être prohibée, et doit être considérée comme une conséquence pathologique de la définition de l'opérateur d'indexation.