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

è necessario

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top