Re: C pointeur

Top Page

Reply to this message
Author: Edgar Bonet
Date:  
To: Liste Guilde
Subject: Re: C pointeur
Le jeudi 17 août, Geoffroy Carrier a écrit :
> Edgar Bonet wrote:
> >Le jeudi 17 août, Patrick Dupre a écrit :
> >>quelle est l'adresse de y[i] [j] lors que double **y alloue correctement ?
> >y[i]+j.
> Genial ! Tu aurais une "regle de recurrence" stp ? Genre pour y[i][j][k]
> pour double ***y, etc. ? (je dois avouer que j'ai du mal
> intellectuellement avec les pointeurs... mais je me soigne)


double *y;
y[i], de type double, signifie par définition *(y+i)

double **y;
y[i], de type double*, signifie par définition *(y+i)
y[i][j], de type double, signifie par définition *(y[i]+j) = *(*(y+i)+j)

double ***y;
y[i], de type double**, signifie par définition *(y+i)
y[i][j], de type double*, signifie par définition *(*(y+i)+j)
y[i][j][k], de type double, signifie par définition *(*(*(y+i)+j)+k)

Tu vois le topeau... tout est dans la définition formelle de l'opérateur
[] : « y[i] signifie par définition *(y+i) ».

Conséquence malsaine de cette définition : i[y] est synonyme de y[i]
(car l'opérateur `+' est commutatif), même si son emploi est
déconseillé.

    == ATTENTION == WARNING == CUIDADO ==


Les tableaux multidimensionnels sont une tout autre bête :

double y[N][M];
y s'évalue comme un double*.
y[i] ne veut rien dire.
y[i][j] signifie *(y+M*i+j).

Autrement dit, quand tu définis une matrice par double y[N][M], tu as
tous les éléments de la matrice à la suite, à partir de l'adresse y.
Quand tu la définis par double **y (avec derrière tous les mallocs qui
vont bien), tu as à l'adresse y un tableau de pointeurs pointant vers
les vecteurs ligne de la matrice.

Ciao,

Edgar.