2015-10-25 8 views
8

perché non è necessario menzionare prima dimensione di array multidimensionale e necessario parlare di altre dimensioni:Perché è consentito omettere la prima dimensione, ma non le altre dimensioni quando si dichiara un array multi-dimensonal?

int A[][][2]={{{1,2},{3,4}},{{4,5},{5,6}}}; // error 
int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}}; // OK 

io non sono in grado di comprendere il concetto o logica dietro questa.

+3

Puoi mostrare un esempio di codice di cosa stai parlando esattamente per favore. –

+1

Di solito, le persone fanno questa domanda perché intendono passare un array multidimensionale come parametro per una funzione e vorrebbero che la funzione gestisse qualsiasi dimensione di array. Se è il tuo caso, ti consiglio vivamente di usare invece i vettori. – Christophe

+0

int A [] [] [2] = {{{1,2}, {3,4}}, {{4,5}, {5,6}}} qui dà errore int A [] [ 2] [2] = {{{1,2}, {3,4}}, {{4,5}, {5,6}}} qui va bene –

risposta

4

È necessario menzionare entrambe le dimensioni di matrici 2D tranne quando è nel parametro della funzione o se è presente un inizializzatore, quindi è possibile omettere la prima dimensione.

Quando viene utilizzato come parametro in una funzione, ad esempio,

int 2D_arr[m][n] 

convertito

int (*2D_arr)[n] 

Pertanto, prima dimensione può essere omesso. Ma la seconda dimensione deve essere lì per dire al compilatore che il puntatore 2D_arr è un puntatore a un array di .

Nel secondo caso, quando è presente inizializzatore

int A[][2][2]={{{1,2},{3,4}},{{4,5},{5,6}}};  

il compilatore utilizza la lunghezza del inizializzatore per calcolare solo la prima dimensione. Il resto della dimensione deve essere specificato esplicitamente al momento della dichiarazione.

+1

Penso che stia chiedendo perché non è possibile dedurre più dimensioni quando sono presenti gli inizializzatori –

+1

@ M.M; La sua domanda non era chiara. – haccks

5

Perché quando si utilizza un array multidimensionale, il calcolo dell'indice reale utilizza tutte le dimensioni delle dimensioni tranne il primo. Ad esempio per un array 3D dichiarata come int arr[3][4][5];, arr[i][j][k] è per definizione*(&(arr[0][0][0]) + k + 5 *(j + 4 * i))

Così, quando la prima dimensione può essere dedotto dal inizializzazione del contesto, o può essere ignorata (quando ottenere un parametro in un funtion) può essere omessa.

Esempi:

int arr[][2] = { 1,2,3,4 }; 

void setArr(void *container, int arr[][4]); 
+0

Questo è il punto fondamentale, ma potrebbe essere più chiaro dire che il dereferenziamento dell'array 'arr [i] [j] [k]' è "equivalente a" 'arr [i] [j] [k] = * (& (arr [0] [0] [0]) + k + 5 * (j + 4 * i)); 'piuttosto che esibirlo come parte dello stesso codice della dichiarazione perché non devi scrivere quel tipo di linea in più applicazioni. E se fosse la mia risposta, nominerei le dimensioni dell'array perché è facile da leggere in questo modo senza riferimento alla dichiarazione. – dmckee

+0

@dmckee: hai ragione. Non avevo capito che appariva come codice ... Post edited. –

1

Se si dichiara una matrice 2D in modo statico ...

int arr[3][4]; 

... quindi le sue due dimensioni sono evidenti.

Se si dichiara una matrice 2D in modo dinamico, o come un puntatore a puntatori ...

int r = 3, c = 4; 
int** arr = new int*[r]; 
for (int i = 0; i < r; i++) { 
    arr[i] = new int[c]; 
} 

... Sembra come se una sola dimensione è menzionato durante l'allocazione ma è perché in primo luogo è allocare le righe e quindi ogni colonna. Quando ottieni o imposta un elemento, specifichi entrambe le dimensioni come al solito ...

num = arr[1][2]; 
arr[1][2] = num;