Re: C pointeur

Pàgina inicial

Reply to this message
Autor: Edgar Bonet
Data:  
A: Liste Guilde
Assumpte: Re: C pointeur
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.