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 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 p_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: Représentation d'une matrice par un tableau de
pointeurs
La fonction d'initialisation doit comporter une phase d'allocation de chaque ligne du tableau ; on écrira par exemple
void p_alloc_init(int lignes, int colonnes, double *p[]) { int i, j; for(i=0; i<lignes; i++) { p[i] = (double *) 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
p_alloc_init(LIGNES,COLONNES,p); p_print(LIGNES,COLONNES,p);
Une fonction qui fait un appel à malloc doit normalement être accompagnée d'une fonction faisant un appel à free. Quand p, allouée par p_alloc_init sera devenue inutile, on devra dés-allouer la mémoire au moyen de
p_free(LIGNES, p);
cette fonction étant définie par :
void p_free(int lignes, double *p[]) { int i; for (i=0; i<lignes; i++) { free(p[i]); } }