Mikäli halutaan tehdä esimerkiksi 2- ulotteinen taulukko, jonka kumpikin ulottuvuus on muuttuva, mutta silti taulukkoa käytetään kuten 2- ulotteista tavallista taulukkoa, pitää käyttää taulukkoa osoittimista:
mat-+ mat[0] +---------- mat[0][2] | | | | | v v +--->+---------------+ +---+ +---->| 1 | 2 | 3 | 4 | r0 0 | o-+---+ +---------------+ +---| +---------------+ 1 | o-+-------->| 5 | 6 | 7 | 8 | r1 +---| +---------------+ 2 | o-+---+ +---------------+ +---+ +---->| 9 | 0 | 1 | 2 | r2 +---------------+
#include <stdio.h> double alkioiden_summa(double **mat, int riveja, int sarakkeita) { int i,j; double summa=0; for (i=0; i<riveja; i++) for (j=0; j<sarakkeita; j++) summa +=mat[i][j]; return summa; } int main(void) { double s1,s2; double r0[] = {1,2,3,4}, r1[] = {5,6,7,8}, r2[] = {9,0,1,2}; double *mat[3]; mat[0] = r0; mat[1] = r1; mat[2] = r2; s1 = alkioiden_summa(mat,2,3); s2 = alkioiden_summa(mat,3,4); printf("Summat on %5.2lf ja %5.2lf\n",s1,s2); return 0; }
Esimerkissä on sama esitelläänkö aliohjelmassa:
double alkioiden_summa(double **mat,... /* vai */ double alkioiden_summa(double *mat[],...
Tässä menettelyssä on vielä se etu, ettei kaikkien rivien välttämättä tarvitsisi edes olla yhtä pitkiä. Harvassa matriisissa osa osoittimista voisi olla jopa NULL- osoittimia, mikäli rivillä ei ole alkioita (aliohjelman pitäisi tietysti tarkistaa tämä). Oikeasti rivit usein vielä luotaisiin dynaamisesti ajonaikana tarvittavan pituisina.