13.8.5 Taulukko osoittimista
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
+---------------+
c-taul\mat3.c - matriisi osoitintaulukon avulla
#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.
- Kirjoita taulukko- osoittimia käyttäen aliohjelma, joka saa
parametrinaan kaksi matriisia ja niiden dimensiot. Aliohjelma tarkistaa voiko
toiseen matriisiin tehdä toisen transpoosin (vaihtaa rivit ja sarakkeet
keskenään) ja tekee transpoosin jos pystyy. Onnistuminen palautetaan
aliohjelman nimessä.