Partiamo innanzitutto dal parlare di puntatori, si tratta di particolari variabili che al loro interno non contengono valori ma
indirizzi di memoria. Un esempio pratico è
- Codice:
int x = 5;
int *pun = &x;
printf("Indirizzo di x: %x\n", &x);
printf("Contenuto di x: %d\n", x);
printf("Indirizzo della variabile puntata da pun: %x\n", pun);
printf("Contenuto della variabile puntata da pun: %d\n", *pun);
Eseguendo questo programma si ottiene un risultato simile a questo
- Codice:
ESECUZIONE PROGRAMMA:
Indirizzo di x: c02f1f54
Contenuto di x: 5
Indirizzo della variabile puntata da pun: c02f1f54
Contenuto della variabile puntata da pun: 5
Nel linguaggio C si definiscono i due operatori
* e
&, rispettivamente di
dereferenziazione e di
indirizzo di.
Analizzando il codice sopra scritto, abbiamo:
- nella prima stampa la visualizzazione dell'indirizzo di x (tramite l'operatore "indirizzo di")
- nella seconda stampa la visualizzazione del contenuto di x
- nella terza stampa visualizziamo il contenuto di pun, cioè l'indirizzo alla quale punta pun che in tal caso è l'indirizzo di x
- nella quarta stampa visualizziamo il contenuto della variabile puntata da pun (tramite l'operatore di dereferenziazione), cioè il contenuto di x
Ora un array non è altro che un intervallo di puntatori, difatti è possibile accedervi mediante l'algebra dei puntatori, in altre parole la deferenziazione di ogni i-esimo elemento dell'array, cioè
*(A+i) dove
A è un array di dimensione
n, ed
i è un indice che va da 0 ad
n-1. Analogamente è possibile accedere agli elementi di un array con la notazione ad array
A[i], che si occupa in automatico di dereferenziare l'i-esimo elemento.
Al contrario di come effettivamente utilizziamo le matrici, il calcolatore vede in memoria una zona "lineare", ed è per questo motivo che risulta necessario passare la dimensione
n di una matrice (es.
int M[][n]), in modo tale da distinguere le grandezze di un array 2D.
Come per gli array monodimensionali, anche per le matrici è possibile utilizzare la notazione a puntatore, dove per accedere all'elemento contenuto nella i-esima colonna (di dimensione
n) e j-esima riga si usa
*(M + i*n + j).
Adesso passiamo all'algoritmo della tua consegna. Mi sorge spontaneo un dubbio, si parla solo di matrici quadrate? Perché in tal caso la dimensione da ricordare è solo una (
N), quindi è superfluo il passaggio dei parametri
int LDA,
int LDB e
int LDC, se invece l'algoritmo deve trattare anche matrici rettangolari, allora sono necessari tutti i parametri scritti nell'intestazione.
Il mio dubbio nasce dal fatto che fino ad ora per passare una matrice ad una function ho sempre scritto "float A[][LDA]" nel caso della matrice A e non "*A"
Corretto.
*A è un parametro che corrisponde o ad un puntatore o al più un array monodimensionale, infatti la tua implementazione mi sembra corretta eccetto proprio nell'intestazione, poiché stai trattando un puntatore come un puntatore a puntatore (scusami il gioco di parole).
In conclusione ribadisco il mio dubbio sulla intestazione. Se si tratta di matrici allora i parametri da passare sono necessariamente
float A[][LDA],
float B[][LDB] e
float C[][LDC], altrimenti mi verrebbe da pensare ad una traccia leggermente differente.