Ég veit ekki hvort þetta á beint við þig, en af spurningunni að dæma virðist þú ekki hafa mikla reynslu af bendum oþh - annars ætti þetta að segja sig sjálft. Ég útskýri því það hugtak örlítið (góð upprifjun fyrir mig).
Byrjum á að skoða tagið int*, þ.e.a.s. bendi á heiltölu.
Gerum ráð fyrir að við höfum tagið
int *x;
Þá getur nafnið x staðið fyrir hvaða bendi á heiltölu sem er.
Þ.e. pláss í minninu sem geymir heiltölu. Í augnablikinu stendur
x ekki fyrir neitt, þ.e. við höfum ekki veitt x neitt gildi.
Í C, þá getum við t.d. gefið x nýtt gildi með því að skrifa
x = malloc(sizeof(int));
Eftir þetta stendur nafnið x fyrir svæði í minninu með pláss
fyrir nákvæmlega eina heiltölu. Ef við látum í staðinn
x = malloc(10*sizeof(int));
þá hefur svæðið pláss fyrir 10 heiltölur í stað einnar.
Til þess að nálgast gildin í x getum við skrifað
x[0] eða *x fyrir fyrstu töluna í hólfinu
x[1] eða *(x+1) fyrir aðra töluna í hólfinu
...
x[n] eða *(x+n) fyrir n-tu töluna í hólfinu
Sömu aðferðum má beita í C++, en þar er almennt þægilegra að
nota 'new' í stað 'malloc', nefnilega
x = new int[10]; // x bendir á svæði með pláss fyrir 10 heiltölur
Ég tala um svæði en ekki fylki, því mér finnst það betur koma þeirri
hugmynd til skila, að við erum að möndla með innra minnið í tölvunni.
En hvernig tengist þetta spurningunni? Jú, á sama hátt og int*
er bendir á svæði fyrir heiltölu, þá er int** bendir á svæði fyrir
benda á svæði fyrir heiltölur. Við getum til dæmis látið
int **y = new int*[10];
og þá er hefur y pláss fyrir 10 svæði heiltalna af einhverri stærð.
Til að úthluta innri svæðunum getum við til dæmis gert
for(int i=0; i<10; ++i)
y[i] = new int[10];
og þá getum við litið á y sem 10x10 fylki, þannig að y[i][j]
er stakið í i-tu línu og j-ta dálki í y. Eini gallinn er að línurnar
y[i] í fylkinu eru ekki endilega hlið við hlið í minninu. Það má
leysa þannig
int *tmp = new int[10*10];
for(int i=0; i<10; ++i)
y[i] = tmp + 10*i;
og getum aftur litið á y sem 10x10 fylki þar sem gildin y[i][j] liggja
í samfelldu 100-staka svæði í minninu. Ath. samt að hér gildir
bókstaflega að
tmp = y[0]
þ.e. tmp og y[0] benda á sama svæðið í minninu.
Nú ætti spurningin eiginlega að svara sér sjálf. Nefnilega, til þess að
láta fall taka inn NxM fylki af breytilegri stærð, þá getum við sent inn
bendi int** X og tölurnar N og M. Til dæmis, margföldun fylkja:
// Fyrir:
// X er N*M fylki
// Y er M*K fylki
// Z er N*K fylki með öll stök 0
// Eftir:
// Z er fylkjamargfeldið X*Y
void mul(int N, int M, int K, int **X, int **Y, int **Z) {
for(int n = 0; n < N; n++)
for(int k = 0; k < K; k++)
for(int m = 0; m < M; m++)
Z[n][k] += X[n][m]*Y[m][k];
}
Ath. að ég hef ekki prófað hvort þetta fall er rétt, en hugmyndin ætti
að komast til skila.