2016-03-07 10 views
36

Questo è il mio codice:Perché m [1] - m [0] restituisce 3 dove m è una matrice 3x3?

int m[][3] = { 
       { 0 , 1 , 2 }, 
       { 10, 11, 12 }, 
       { 20, 21, 22 } 
      }; 
printf("%d %d\n", m[1] - m[0], m[1][0] - m[0][0]); 

E perché

m[1] - m[0] 

ritorno 3? So perché la seconda espressione restituirebbe 10 ma il 1 st non mi sembra logico.

+2

'm [1]' è '& m [1] [0]' e così via. – immibis

+0

Tecnicamente, 'm' non è una matrice 3x3 ma una matrice di matrici. – HelloGoodbye

+0

Nessuna risposta menzionata ancora, ma 'm [0]' e 'm [1]' sono * matrici * (non puntatori). Un valore di puntatore viene prodotto quando l'array viene usato come operando dell'operatore '-', che punta al primo elemento della rispettiva matrice. –

risposta

55

Nel codice:

m[1] - m[0] 

denota un puntatore sottrazione che vi dà la differenza dei due puntatori in base al tipo di . In questo caso, entrambi i puntatori sono differenziati da 3 elementi, quindi il risultato è 3.

citare C11 standard capitolo §6.5.6

Quando due puntatori vengono sottratti, entrambi devono indicare elementi dello stesso oggetto matrice, o uno dopo l'ultimo elemento dell'oggetto matrice; il risultato è la differenza degli indici dei due elementi dell'array. [...]

e

[...] In altre parole, se le espressioni P e Q punto a, rispettivamente, i i -esimo e j elementi -esimo un oggetto array, l'espressione (P)-(Q) ha il valore i−j a condizione che il valore si adatti a un oggetto di tipo ptrdiff_t. [....]

per aiutare a visualizzare meglio, vedere il seguente immagine

enter image description here

Qui, s è una matrice bidimensionale, definito come s[4][2]. Considerando il tipo di dati dell'array consumer 2 byte ciascuno, si prega di seguire gli elementi (indice) e la posizione di memoria corrispondente (arbitrario). Ciò consentirà di capire meglio come effettivamente nella memoria gli elementi dell'array siano contigui.

Così, secondo la rappresentazione, s[0] e s[1] si differenziano da due elementi, s[0][0] e s[0][1]. Quindi, s[1] - s[0] produrrà un risultato di 2.

+0

Grazie! Questo mi ha aiutato a capirlo. Passerò definitivamente quel test ora :) – Martacus

+0

@Martacus Questa è la fiducia !! Buona fortuna :) –

+1

Nota che 'm [1]' e 'm [0]' sono matrici. I suggerimenti che descrivi sono il risultato del "decadimento". –

35

Perché la "differenza" tra m[1] e m[0] è tre elementi.

Potrebbe essere più facile da capire se si guarda a come questo

 
m[0]       m[1]       m[2] 
|        |        | 
v        v        v 
+---------+---------+---------+---------+---------+---------+---------+---------+---------+ 
| m[0][0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] | m[2][0] | m[2][1] | m[2][2] | 
+---------+---------+---------+---------+---------+---------+---------+---------+---------+

La differenza tra m[1] e m[0] è il tre elementi m[0][0], m[0][1] e m[0][2].

+0

Ah sì, questo lo spiega ulteriormente, grazie! Ho capito bene ora haha. – Martacus

+0

In realtà, il 'm [0]' punta tecnicamente alla stessa posizione di 'm [0] [0]' se lo si guarda in termini tecnici. Usando '& m [0]' e '& m [0] [0]' lo dimostreremo; gli array hanno una base e un offset, quindi sia 'm [0]' che 'm [0] [0]' hanno offset zero e un indirizzo uguale all'indirizzo di base del matix. – cst1992

+0

Quello che sto cercando di dire è che dovresti puntare 'm [0]' al centro della cella contenente 'm [0] [0]', non l'inizio. Lo stesso vale per 'm [1]' e 'm [2]'. – cst1992