mi approfondiresti questa frase? nel senso che questo è quello che riportano tutte le guide ma esattamente che fa il compilatore?
che succede se passo la dimensione delle colonne o delle righe?
La matrice viene passata per riferimento alla funzione, cioè in pratica non viene creata una copia della matrice ma la funzione opera direttamente sulla matrice di partenza senza creare alcuna copia (è importante che tu sappia la differenza del passaggio di un parametro per valore o per riferimento, se non la conosci chiedi pure).
La ram del pc è costituita da una serie di locazioni una dopo l'altra esattamente come un vettore, gestire un vettore quindi è il modo più naturale possibile di usare la memoria.
Quando usi il vettore per fare riferimento a una cella scrivi "vettore[ i ] " (dove i è la posizione dell'elemento che vuoi considerare) il compilatore per determinare la posizione in memoria si basa sul tipo e sulla
posizione iniziale del vettore in memoria dove è allocato il primo elemento in questo modo:
posizione iniziale + ( dimensione del tipo * i )
Questo spiega anche perchè vettori e puntatori sono di fatto la stessa cosa.
Per le matrici è un pò diverso, è stato creato un artificio per poterle usare, poichè la memoria ha una sola dimensione costituita dagli indirizzi crescenti di memoria, viceversa le matrici hanno due dimensioni una per riga e una per colonna, il compilatore sarà dunque costetto ad usare un artificio per gestire le matrici .
Usando le matrici in questo modo " matrice [ i ][ j ] " (dove i indice di riga e j di colonna) il compilatore è in grado di fare riferimento alla giusta cella di memoria eseguendo queste operazioni:
posizione iniziale+((dimensione del tipo*i)*numero di colonnedella matrice + dimensione del tipo *j)
esempio: supponiamo che abbiamo questa matrice in memoria:
int vettore[3][3]={{2,3,5}{7,8,1}{4,6,9}}
esempio: quando facciamo riferimento alla locazione vettore[1][2] (non considero posizione iniziale e dimensione dell'intero ma tieni presente che il compilatore lo fà)
j*
numero colonne della matrice+i = 1*3+2=5
Infatti se conti gli elementi dall'inizio della matrice (come se fosse un vettore )l'elemento considerato è il sesto (ricordati che sia per le matrici che per i vettori il primo elemento è l'elemento 0 e non 1).
Dopo tutto questo giro di parole cosa rimane? che al compilatore è necessario conoscere la dimensione del numero di colonne della matrice altrimenti non è in grado di indirizzare correttamente i riferimenti alla matrice. Se qualcosa non è molto chiaro chiedi pure