Vous pouvez indicer un pointeur de la même manière que vous pouvez inscrire un tableau, à condition que toutes les adresses aient été correctement configurées.
En supposant la déclaration suivante:
char **ptr;
ici sont les types des différentes expressions:
Expression Type Equivalent expressions (yield same value)
---------- ---- -----------------------------------------
ptr char ** &ptr[0]
*ptr char * ptr[0]
*(ptr+i) char * ptr[i]; &ptr[i][0]
**ptr char ptr[0][0]
*(*(ptr+i)) char ptr[i][0]; *ptr[i]
*(*(ptr+i)+j) char ptr[i][j]
ainsi:
ptr
peuvent être traitées comme si était un tableau de chaînes (tableau 2-d de char)
ptr[i]
points au début de la chaîne i'th dans la liste
ptr[i][j]
est la valeur du caractère de la chaîne j-ième i'th dans la liste
- Les expressions
ptr++
et ++ptr
avancera ptr
pour pointer vers la prochaine chaîne
- les expressions
(*ptr)++
et ++(*ptr)
avancera *ptr
pour pointer vers le caractère suivant
en ce qui concerne la mise en place yo Pour les pointeurs, cet agencement suppose que tout a déjà été alloué sous la forme de tableaux statiques ou dynamiquement via malloc
. Vous ne pouvez simplement écrire
char **ptr = {"foo", "bar", "bletch"}; // using aggregate initializer on
// non-aggregate type; bad juju,
// a.k.a undefined behavior
ou
char **ptr; // ptr has not been initialized to point anywhere
ptr[0] = "foo"; // dereferencing ptr via subscript invokes undefined
ptr[1] = "bar"; // behavior
ptr[2] = "bletch";
En général, lorsque vous utilisez un pointeur comme si elle était un tableau, vous utiliserez malloc
ou quelque chose de similaire à répartir vos tampons:
char **ptr = malloc(sizeof *ptr * N);
if (ptr)
{
ptr[0] = "foo"; // ptr[i] gets address of
ptr[1] = "bar"; // string literal
ptr[2] = "bletch";
...
}
ou
char **ptr = malloc(sizeof *ptr * N);
if (ptr)
{
size_t i;
for (i = 0; i < N; i++)
{
ptr[i] = malloc(sizeof *ptr[i] * M); // strictly speaking, the sizeof
if (ptr[i]) // is not necessary here
{
//initialize ptr[i]
}
}
}
gcc lève les avertissements de wome sur cette première ligne (initialisation à partir du type de pointeur incompatible, éléments en excès dans l'initialiseur scalaire). Vous utilisez un initialiseur de tableau sur un type non-tableau. –
Vous avez raison. Edité dans un correctif. –