come fa C sa dimensioni della matrice dinamica 2d in una funzione?
-
30-09-2019 - |
Domanda
Ho visto questo esempio quando stavo cercando di capire come passare puntatori ad array 2d allocati dinamicamente alle funzioni:
void zeroit(int **array, int nrows, int ncolumns)
{
int i, j;
for(i = 0; i < nrows; i++)
{
for(j = 0; j < ncolumns; j++)
array[i][j] = 0;
}
}
L'ho provato e funziona, ma io non capisco come. Come funziona la funzione "zeroit" calcola l'indirizzo corretto?
Altri suggerimenti
Nessun calcolo. La funzione "zeroit" raggiunge un intero attraverso la "doppia indirezione".
"int matrice **" non è davvero una matrice di numeri interi. E 'esattamente un "puntatore sullo indicazioni su integer" - più un vettore di, vettori di numeri interi. Quando si accede a "array [i]" (prima indiretto), si ottiene un "int *", vale a dire l'indirizzo del esimo vettore di interi. Quando si accede "array [i] [j]" (secondo indiretto), si ottiene un "int", cioè il numero intero j-esima del vettore esimo.
Se la "matrice 2D" è in realtà solo un array di puntatori alle singole righe, poi calcola l'indirizzo corretto semplicemente guardando l'indirizzo della riga poi applicare un offset ad esso. Tuttavia, questo è un modo molto inefficiente per implementare una "matrice 2d". Il modo migliore è di usare semplicemente normali array 1-dimensionali e calcolare l'indice di te stesso con la moltiplicazione e l'aggiunta, ma in C99 è anche possibile utilizzare la semantica VLA per avere il compilatore trattarla come una vera e propria matrice 2D.
se si considera il layout di memoria / indirizzi di seguito:
array = |10|11|12|
array[0] = |20|21|22|
array[1] = |30|31|32|
cella 10 contiene un puntatore alla cella 20, e la cella 11 contiene un puntatore a 30, questo si chiama doppio riferimento indiretto - array
è un sequenziale, parola sequenza larghezza puntatori ad array di interi, non v'è alcuna necessità di calcolare, solo dereferenziare due puntatori