2010-06-07 14 views

risposta

10

Bene, a è l'indirizzo del primo elemento dell'array e & a è l'indirizzo dell'array, ma ovviamente entrambi hanno lo stesso indirizzo.

Tuttavia quando aggiungi (o sottrai) un numero da un puntatore il compilatore prende in considerazione la dimensione dei dati quindi nel tuo caso (assumendo che la dimensione di int sia 4 byte) a + 1 sarà maggiore di a di 4 perché spostate il puntatore di un intero in avanti, ma & a + 1 sarebbe più grande di 40 perché più il puntatore un ARRAY DI 10 INTEGERS avanti.

21

Entrambe le istruzioni stampano gli indirizzi e sono probabilmente pensati per spiegare l'aritmetica del puntatore.

a e &a NON sono uguali, hanno tipi diversi, ma mantengono lo stesso indirizzo di memoria.

&a è di tipo int (*)[10] (che agisce come un puntatore a un array)
a è di tipo int [10] (che agisce come un puntatore a un unico elemento)

Quindi, quando si aggiunge 1 mantenere quei tipi in mente. Il puntatore verrà compensato dalla dimensione del tipo che contiene l'indirizzo. a+1 offset dalla dimensione di int, cioè al secondo elemento dell'array. Gli offset &a+1 superano completamente l'intero array.

+1

che è quasi tutto ciò che il tipo in C è di circa: l'aritmetica e la dimensione. – mathk

+0

Per completezza, sarebbe bello aggiungere che '& a [0]' è di tipo 'int * 'e agirà molto come' a'. – Hugues

+0

@Brian R.Bondy Quindi possiamo usare 'sizeof' per mostrare le differenze nei loro tipi? – sikisis

Problemi correlati