2011-05-24 2 views
7

a è un array di numeri interi, se provo a sottrarre il valore dell'indirizzo &a[2] - &a[1] == ? quale dovrebbe essere il risultato 4 o 1?C++: & a [2] - & a [1] ==?

EDIT: vedere 4 ° commento sulla risposta in alto here perché dice 1 ?? questo è il motivo per cui sono confuso ho pensato che sarà 4

EDIT: ecco un test

+5

cosa ottieni quando lo esegui? –

+3

@disioe : non hai un compilatore? Allora, perché stai scrivendo il codice? –

+0

@Mitch Wheat: non sono proprio io non riesco a dormire, quindi sto leggendo StackOverflow :)) programma in C# per soldi. Ma in realtà stavo per provarlo su codepad.org ma non funziona ora, quindi ho deciso di chiedere a – disioe

risposta

9

&a[2] è stessa &(*(a + 2)) (cioè (a + 2)) e &a[1] è stessa &(*(a + 1)) (cioè (a + 1)). Così risposta sarà 1.

+0

Grazie mille, ho capito ora. Era nel thread che leggevo anch'io ma in qualche modo non l'ho capito. Grazie ancora per il vostro aiuto. – disioe

+0

Nessun problema @disioe. –

6

Pointer sottrazione ti dà la differenza di elementi, non su byte. Non importa quale sia il tipo di elemento dell'array, il risultato di &a[2] - &a[1] sarà sempre 1, perché sono separati da 1 elemento.

3

La differenza deve essere 1. Quando si confrontano i puntatori otterrete sempre la differenza di elementi.

4

È sempre 1. Le aritmetica puntatore non riguardano il numero di byte che ogni elemento ha, e questo è molto utile. Confrontare questi:

ptr++; // go to the next element (correct) 
ptr += sizeof *ptr; // go to the next element (wrong) 

Quando si lavora con array si sono di solito interessati alle elementi, non nel byte comprendente loro, ed è per questo arithmetics puntatore in C è stata definita in questo modo.

2

Dato che questo è C++, assumerò che non abbia sovrascritto gli operatori & o * su qualsiasi tipo di a. Badando che, delle seguenti condizioni:

&a[2] - &a[1] 
(a + 2) - (a + 1) 
a + 2 - a - 1 
2 - 1 
1 
+1

Bella derivazione. – harper

1

Un paio di risposte qui (soppresso in quanto questa risposta è stata pubblicata) chiaramente avuto byte * in mente:

int a[10]; 
    byte * pA2 = (byte*)&a[2]; 
    byte * pA1 = (byte*)&a[1]; 
    int sz1 = &a[2] - &a[1]; 
    int sz2 = pA2 - pA1; 
    CString msg; 
    msg.Format("int * %d, byte * %d\n", sz1, sz2); 
    OutputDebugString(msg); 

output è:

 int * 1, byte * 4 

Due indirizzi ma, a seconda della dichiarazione della variabile in cui sono memorizzati gli indirizzi, la differenza tra i due può essere 1 o 4.

+1

Questo era il mio problema, poiché la domanda non era in codice, ho letto la domanda come qual è la differenza tra due indirizzi, non in termini di "aritmetica puntatore". – Jens