Je disais :
> double y[N][M];
> y s'évalue comme un double*.
> y[i] ne veut rien dire.
> y[i][j] signifie *(y+M*i+j).
J'ai dit une bêtise.
Florent Monnier demande :
> a-t-on également ceci : y[i][j] == y[M*i+j] ?
Pas tout à fait : y[M*i+j] est le vecteur ligne M*i+j. Dans le détail :
Si p est un pointeur et i un entier, p+i a pour valeur numérique
(unsigned long) p + i * sizeof *p.
Tableau 2D : double y[N][M];
Comme je le disais, c'est un peu particulier. y est l'adresse du premier
élément du tableau, c'est donc un double*, mais il se comporte de façon
particulière vis-à-vis des opérateurs * et sizeof :
*y = y; (1)
sizeof *y = M * sizeof(double); (2)
donc en fait
y[i] = *(y+i)
= *((unsigned long) y + i * sizeof *y)
= *((unsigned long) y + i * M * sizeof(double)) (car (2))
= (unsigned long) y + i * M * sizeof(double) (car (1))
l'égalité étant entendue au sens numérique (y[i] reste de type double*).
y[i] est donc l'adresse du vecteur ligne numéro i.
L'indirection suivante est plus normale :
y[i][j] = *(y[i]+j)
donc
&y[i][j] = y[i]+j
= (unsigned long) y + (i * M + j) * sizeof(double)
au sens de la valeur numérique des adresses.
Pour répondre à ta question, on n'a pas y[i][j] == y[M*i+j] à cause
des règles ci-dessus. Par contre on a
y[i][j] == ((double *) y)[M*i+j]
En pratique j'évite les tableaux 2D, sauf pour de toutes petites
matrices (genre matrice 3x3 de rotation dans l'espace). Avec des
pointeurs de pointeurs la syntaxe du langage C est plus régulière.
Edgar.