Avoir uniquement la déclaration de la variable, vous ne pouvez pas distinguer les trois cas. On peut toujours discuter si on ne devrait pas utiliser quelque chose comme int *x[10]
à exprimer un tableau de 10 pointeurs vers des entiers ou d'autre chose; mais, int **x
peut - en raison de l'arithmétique de pointeur, être utilisé dans les trois façons différentes, dans chaque sens en supposant une autre disposition de la mémoire avec le (bon) chance de faire l'hypothèse erronée.
Prenons l'exemple suivant, où l' int **
est utilisé de trois façons différentes, c'est à dire p2p2i_v1
comme un pointeur vers un pointeur vers un (unique) de type int, p2p2i_v2
comme un pointeur vers un tableau de pointeurs de type int, et p2p2i_v3
comme un pointeur vers un pointeur vers un tableau d'entiers. Notez que vous ne pouvez pas distinguer ces trois significations uniquement par le type, qui est - int**
pour tous les trois. Mais avec différentes initialisations, accès à chacun d'eux dans le mauvais sens, les rendements quelque chose d'imprévisible, à l'exception de l'accès aux éléments premiers:
int i1=1,i2=2,i3=3,i4=4;
int *p2i = &i1;
int **p2p2i_v1 = &p2i; // pointer to a pointer to a single int
int *arrayOfp2i[4] = { &i1, &i2, &i3, &i4 };
int **p2p2i_v2 = arrayOfp2i; // pointer to an array of pointers to int
int arrayOfI[4] = { 5,6,7,8 };
int *p2arrayOfi = arrayOfI;
int **p2p2i_v3 = &p2arrayOfi; // pointer to a pointer to an array of ints
// assuming a pointer to a pointer to a single int:
int derefi1_v1 = *p2p2i_v1[0]; // correct; yields 1
int derefi1_v2 = *p2p2i_v2[0]; // correct; yields 1
int derefi1_v3 = *p2p2i_v3[0]; // correct; yields 5
// assuming a pointer to an array of pointers to int's
int derefi1_v1_at1 = *p2p2i_v1[1]; // incorrect, yields ? or seg fault
int derefi1_v2_at1 = *p2p2i_v2[1]; // correct; yields 2
int derefi1_v3_at1 = *p2p2i_v3[1]; // incorrect, yields ? or seg fault
// assuming a pointer to an array of pointers to an array of int's
int derefarray_at1_v1 = (*p2p2i_v1)[1]; // incorrect; yields ? or seg fault;
int derefarray_at1_v2 = (*p2p2i_v2)[1]; // incorrect; yields ? or seg fault;
int derefarray_at1_v3 = (*p2p2i_v3)[1]; // correct; yields 6;