Domanda sugli array multidimensionali

1

Mi stavo chiedendo qualcosa sugli array multidimensionali e poi ho avuto un dubbio su un concetto, in particolare sulla loro rappresentazione in memoria.

Ad esempio, un array può essere definito come segue.

int a[3];

E questo è rappresentato come questo.

Doveognielementoèuninteroetuttisonoinunospaziodimemoriacontinuo.

Quindiunarraymultidimensionalepuòesseredefinitocomequesto.

inta[2][4];

Cheètipicamenterappresentatocome.

Ma una rappresentazione più realistica di questo array in memoria non sarebbe qualcosa del genere? (per analogia con la prima immagine).

Perché stavo pensando che se, per esempio, int a[5]; definisce 5 interi in uno spazio di memoria continua, allora int a[5][10]; definisce 10 matrici di interi in uno spazio di memoria continua, dove ogni matrice definisce 5 interi, quindi qualsiasi array statico N-dimensionale in C dovrebbe essere rappresentato solo come una striscia di memoria.

    
posta OiciTrap 14.12.2014 - 08:57
fonte

3 risposte

4

Hai quasi ragione, sì. In effetti,

int a[5][10];

dichiara 5 array ciascuno dei quali contiene 10 numeri interi, più del contrario. A parte questo hai perfettamente ragione.

Vedi link per una descrizione più dettagliata e una spiegazione del motivo per cui l'ordine è importante.

    
risposta data 14.12.2014 - 09:07
fonte
0

Oltre alla risposta di Jules, vorrei aggiungere un po 'di prospettiva storica.

La controintuitività di questo in C è dovuta al fatto semplice:

  • In generale, int a[] (lunghezza non specificata) è una sorta di zucchero sintattico al posto di int* a
  • Allo stesso modo, int a[][] (di nuovo, lunghezze non specificate) è una sorta di zucchero sintattico al posto di int** a .

Poiché il puntatore a due livelli deve essere dereferenziato in quell'ordine, determina in che modo int a[M][N] deve essere disposto in memoria.

    
risposta data 14.12.2014 - 09:11
fonte
0

Ecco un codice che mostra chiaramente il layout della memoria per gli array. Usando un union , per il quale la memoria è sovrapposta per ogni membro del sindacato, possiamo vedere che i valori sono memorizzati in ordine di riga maggiore.

#include <stdio.h>

#define N       4*4*4
#define N_2D    8
#define N_3D    4

union multi_d_arrays {
    int one_d[N];
    int two_d[N_2D][N_2D];
    int three_d[N_3D][N_3D][N_3D];
};

int main()
{
    int i, j, k;
    union multi_d_arrays m;

    /* initialise via one_d with sequential ints */
    for (i=0; i<N; i++)
        m.one_d[i] = i+1;

    /* in all cases the output should be sequential */
    printf("------------------------\n");
    for (i=0; i<N; i++)
        printf("m.one_d[%d] = %d\n", i, m.one_d[i]);

    printf("\n------------------------\n");
    for (i=0; i<N_2D; i++)
        for (j=0; j<N_2D; j++)
            printf("m.two_d[%d][%d] = %d\n", i, j, m.two_d[i][j]);

    printf("\n------------------------\n");
    for (i=0; i<N_3D; i++)
        for (j=0; j<N_3D; j++)
            for (k=0; k<N_3D; k++)
                printf("m.three_d[%d][%d][%d] = %d\n", i, j, k, m.three_d[i][j][k]);

    return 0;
}
    
risposta data 14.12.2014 - 12:35
fonte

Leggi altre domande sui tag