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];
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]);
}
}