2011-01-23 11 views
7

A: http://www.fredosaurus.com/notes-cpp/arrayptr/26arraysaspointers.htmlC++ - puntatore aggiunta ed elemento di dimensioni

Sotto: Pointer addizione e elemento di dimensioni

C'è il seguente codice:

// Assume sizeof(int) is 4. 
int b[100]; // b is an array of 100 ints. 
int* p;  // p is a a pointer to an int. 
p = b;  // Assigns address of first element of b. Ie, &b[0] 
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1] 

Come ha fatto "p" nel l'ultima riga diventa "4"?

Grazie.

+0

Si noti che non è sempre 4. E 'solo che il più moderno I sistemi 32/64-bit sizeof (int) è 4. Ma su piattaforme più esotiche potrebbe essere qualsiasi cosa, quindi "assume sizeof (int) è 4" commento. –

+0

Non proprio sistemi esoterici. Penso che i processori Arduino abbiano sizeof (int) è 2 – Falmarri

risposta

11

(suppongo che vuoi dire "1" nell'ultima riga, non "p")

aritmetica dei puntatori sia in C e C++ è un logica Inoltre, non un numerica aggiunta. Aggiungere uno a un puntatore significa "produrre un puntatore all'oggetto che viene in memoria subito dopo questo", il che significa che il compilatore ridimensiona automaticamente qualsiasi cosa si sta incrementando il puntatore con la dimensione dell'oggetto puntato. Ciò impedisce di avere un puntatore nel mezzo di un oggetto o un puntatore disallineato o entrambi.

+0

Grazie per la risposta. Quando dici: "il che significa che il compilatore ridimensiona automaticamente qualsiasi cosa tu stia incrementando con le dimensioni dell'oggetto puntato.", Perché la moltiplicazione per la dimensione? Quando aggiungi "1" per esempio hai detto che questo significa ridimensionare il puntatore all'oggetto che viene in memoria dopo questo. Non è sufficiente? Perché la moltiplicazione in base alla dimensione del tipo di dati? Grazie. – Simplicity

+0

@ SWEngineer- Le mie scuse, non ero molto chiaro. Il * puntatore * non viene ridimensionato. L'ammontare che viene incrementato dal puntatore è ciò che viene incrementato. In questo modo, scrivere 'ptr + 1' significa" l'indirizzo di memoria del puntatore, più una volta la dimensione degli oggetti puntati. " – templatetypedef

+0

Va bene, non preoccuparti. Grazie per il chiarimento. Una piccola cosa qui, perché pensi che dobbiamo moltiplicare sizeof (datatype) per il numero di incremento (cioè 1)? È solo come è progettato C++, o c'è un motivo logico qui? Grazie. – Simplicity

3

Il commento nel codice che pubblichi lo spiega: l'aggiunta di un numero intero x a un puntatore aumenta il valore del puntatore di x moltiplicato per la dimensione del tipo a cui punta.

Questo è conveniente perché di solito non ha senso cambiare il puntatore in incrementi più piccoli - non si vorrebbe che punti nel mezzo di uno degli elementi.

+0

È necessario aggiungere che il valore "4" risultante è solo uno dei tanti valori casuali che si sarebbero potuti verificare in quell'esempio di codice. In altre parole: il valore intero contenuto nell'area di memoria a cui p punta è semplicemente ... indefinito. – Frunsi

1

perché p è puntatore a un tipo con dimensione 4 byte. L'operatore + sui puntatori è in realtà il puntatore shift. compilatore conosce la dimensione di tipo punta e lo sposta dal valore appropriato

se si cambia int a short, p sarà spostata da 2 byte