next up previous contents index
Next: Tableaux de chaînes de Up: No Title Previous: Hachage par chaînage

Représentation des matrices par tableaux de pointeurs

       La représentation unidimensionnelle des matrices permet d'écrire des fonctions opérant sur des matrices de taille quelconque. Elle présente cependant l'inconvénient de réaliser une multiplication (par le nombre de colonnes) pour chaque accès et contraint à une écriture moins naturelle du corps des fonctions.

Une autre représentation possible des matrices, qui n'a pas cet inconvénient, utilise un tableau de pointeurs.

On déclare une fonction opérant sur une matrice par

void f(int colonnes, int lignes, double *p[]);

p[i] étant un pointeur de double, peut être utilisé comme l'adresse d'un tableau, qui sera la ieme ligne de la matrice ; donc p[i][j] est un double, et on peut écrire simplement le corps de la fonction comme si p était une matrice. On écrira ainsi une fonction d'impression des éléments de la matrice :

void matrix_print(int lignes, int colonnes, double *p[]) {
  int i, j;

  for(i=0; i<lignes; i++) {
    for(j=0; j<colonnes; j++) {
      printf("a[%d][%d] = %f\n", i, j, p[i][j]);
    }
  }
}

Si l'on définit une variable comme un tableau de pointeurs, en donnant la dimension du tableau (qui correspond ici au nombre de lignes) :

#define LIGNES 3
#define COLONNES 4
double *p[LIGNES];


  
Figure 31: Représentation d'une matrice par un tableau de pointeurs
\begin{figure}
 \begin{center}
 \leavevmode
 
\fbox {
 \epsfig{file=fig/array2_ptr.eps}
 }
 \end{center} \end{figure}

La fonction d'initialisation doit comporter une phase d'allocation de chaque ligne du tableau ; on écrira par exemple

void matrix_alloc_init(int lignes, int colonnes, double *p[]) {
  int i, j;

  for(i=0; i<lignes; i++) {
    p[i] =  malloc(colonnes * (sizeof(double)));
    for(j=0; j<colonnes; j++) {
      p[i][j] = (double) (i+j)/2;
    }
  }
}

On appellera ces fonctions d'initialisation-allocation et d'impression par

  matrix_alloc_init(LIGNES,COLONNES,p);
  matrix_print(LIGNES,COLONNES,p);

Une fonction de libération spécialisée doit être appelée quand p, allouée par matrix_alloc_init, sera devenue inutile :

 

  matrix_free(LIGNES, p);

Cette fonction est définie par :

void matrix_free(int lignes, double *p[]) {
  int i;

  for (i=0; i<lignes; i++) {
    free(p[i]);
  }
}

next up previous contents index
Next: Tableaux de chaînes de Up: No Title Previous: Hachage par chaînage
Jean-Philippe Chancelier
9/29/1998