2012-08-01 16 views
6

Ho una domanda sull'incremento di puntatori che non capisco.Indicatori di incremento

permette di vedere 2 piccoli programmi:

int iTuna=1; 
int* pPointer= &iTuna; 
*pPointer = *pPointer + 1 ; //Increment what pPointer is pointing to. 
cout << iTuna << endl; 

In questo primo programma ho incremento cosa pPointer punta come questo "* pPointer = * pPointer +1". E come mi aspettavo Ituna cambiato in "2" e il programma stampato il valore "2"

int iTuna=1; 
int* pPointer= &iTuna; 
*pPointer++; //Increment what pPointer is pointing to. 
cout << iTuna << endl; 
system("PAUSE"); 
return 0; 

Qui ho incrementato incrementato quello pPointer sta puntando a questo è stato "* pPointer ++". Ma qui iTuna rimane come "1" e i programmi stampano il valore "1". Sebbene mi aspettassi che questo funzionasse come il primo, non lo fece.

Please Help me e dimmi perché il secondo peice di codice non funziona come mi aspettavo e come aggirare esso.

Thank You

+0

Prestare attenzione alla [precedenza degli operatori] (http://en.cppreference.com/w/cpp/language/operator_precedence) dei due operatori che si utilizzano. –

+1

Nel secondo, si incrementa l'indirizzo del puntatore. Quindi se fai cout << pPointer; prima e dopo l'incremento otterrai un valore diverso. –

+1

Per prima cosa è necessario effettuare il dereferenziamento e quindi incrementare il valore indicato - '++ * pPointer'. –

risposta

8
*pPointer++; 

è equivalente a

*pPointer; 
pPointer++; 

quindi incrementa il puntatore, non il valore Dereferenced.

Si può vedere questo di volta in volta nella stringa implementazioni di copia come

while(*source) 
    *target++ = *source++; 

Dal momento che il problema è una questione di precedenza degli operatori, se si vuole Deref il puntatore, e quindi incrementare, è possibile utilizzare parentesi :

(*pointer)++; 
+0

Puoi spiegare perché? E dimmi come posso usare l'operatore ++ per incrementare ciò che pPointer punta a –

+1

Questo incrementerà il puntatore del puntatore: (* pPointer) ++; – allesmi

+1

'(* pPointer) ++' o '* pPointer + = 1' –

1
*ptr++; - increment pointer and dereference old pointer value 

E 'equivalente a:

*(ptr_p++) - increment pointer and dereference old pointer value 

Ecco come incrementare il valore

(*ptr)++; - increment value 

Ecco becuase ++ ha la precedenza maggiore rispetto *, ma è possibile controllare la precedenza utilizzando ()

2

++ precedenza degli operatori è superiore * d dereference.

Quello che scrivi è in realtà

*(p++) 

Tuttavia si dovrebbe usare

(*p)++ 
1

nel secondo programma non si sta aumentando il contenuto all'indirizzo pPointer, ma si stanno aumentando il puntatore. Quindi supponiamo che se il valore di pPointer (posizione memmory assegnata a iTuna) sia 1000, allora aumenterà la posizione a 1000 + 2 (int size) = 1002 non il contenuto a 1 + 1 = 2. E nel programma di cui sopra si sta accedendo al contenuto della posizione del puntatore.Ecco perché non si ottengono i risultati attesi

+0

Non è un 4 bit int? –

+0

In C++ è di 2 byte = 16 bit. – AArora

0

*pPointer++; - Qui l'operatore di distacco (*) ha più precedenza dell'operatore di incremento (++). Quindi questa affermazione è il primo dereferenziamento e l'incremento del puntatore. Dopodiché stai stampando il valore di iTuna che ti darà lo stesso valore. Non si sta stampando il valore tramite la variabile del puntatore di dereferenziazione (*pPointer), poiché ciò causerà un arresto anomalo (comportamento non definito). Perché pPointer è ora incrementato.

Utilizzare come (*pPointer)++; per incrementare il valore indicato da pPointer.

Per avere un'idea chiara stampare l'indirizzo memorizzato nella variabile pPointer prima e dopo l'istruzione di incremento.