2012-08-01 9 views
6

Tengo una pregunta sobre el aumento de punteros que no entiendo del todo.Incrementando punteros

deja ver 2 pequeños programas:

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

En este primer programa que lo mínimo de la pPointer está apuntando a como este "* = * pPointer pPointer 1". Y como esperaba Ituna cambiado a "2" y el programa impreso el valor "2"

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

Aquí incrementa incrementa lo pPointer está apuntando a esto fue "* pPointer ++". Pero aquí iTuna se mantiene como "1" y los programas imprimen el valor "1". Aunque esperaba que este funcionara como el primero, no fue así.

Por favor, ayúdenme y díganme por qué la segunda parte del código no funciona como esperaba y cómo evitarlo.

Gracias

+0

Tenga cuidado con [precedencia del operador] (http://en.cppreference.com/w/cpp/language/operator_precedence) de los dos operadores que utiliza. –

+1

En el segundo, está incrementando la dirección del puntero. Así que si lo haces cout << pPointer; antes y después de incrementar obtendrás un valor diferente. –

+1

Primero tiene que eliminar la referencia, y luego incrementar lo que se señala - '++ * pPointer'. –

Respuesta

8
*pPointer++; 

es equivalente a

*pPointer; 
pPointer++; 

lo que incrementa el puntero, no el valor sin referencia.

Usted puede ver esto de vez en cuando en las implementaciones de copia de cuerda como

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

Debido a que su problema es una cuestión de prioridad de los operadores, si quieres DEREF el puntero, y luego incrementar, puede utilizar parens :

(*pointer)++; 
+0

¿Puedes explicar por qué? Y dígame cómo puedo llegar a utilizar el operador ++ para incrementar lo que pPointer apunta a –

+1

Esto incrementará a lo que apunta el puntero: (* pPointer) ++; – allesmi

+1

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

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

es equivalente a:

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

Aquí es cómo incrementar el valor

(*ptr)++; - increment value 

Eso es becuase ++ tiene mayor precedencia que *, pero se puede controlar mediante la precedencia ()

2

++ prioridad de los operadores es mayor que d * eliminar la referencia.

Lo que escribe es en realidad

*(p++) 

Sin embargo se debe utilizar

(*p)++ 
1

en el segundo programa no está aumentando el contenido en la dirección pPointer, pero que está aumentando el puntero. Así que supongamos aquí si el valor de pPointer (ubicación de memmory asignada a iTuna) es 1000, entonces aumentará la ubicación a 1000 + 2 (int size) = 1002, no el contenido a 1 + 1 = 2. Y en el programa anterior, está accediendo a los contenidos de ubicación del puntero.Es por eso que no están consiguiendo los resultados esperados

+0

¿No es un int 4 bits? –

+0

En C++ es de 2 bytes = 16 bits. – AArora

0

*pPointer++; - A continuación, eliminar la referencia de operador (*) tiene mayor precedencia que el operador de incremento (++). Entonces esta declaración es la primera eliminación de referencias e incrementar el puntero. Después de esto, está imprimiendo el valor de iTuna que le dará el mismo valor. No está imprimiendo el valor desreferenciando la variable de puntero (*pPointer), porque esto provocará un bloqueo (comportamiento indefinido). Porque pPointer ahora se incrementa.

Use como (*pPointer)++; para incrementar el valor apuntado por pPointer.

Para obtener una idea clara, imprima la dirección almacenada en la variable pPointer antes y después de su declaración de incremento.

Cuestiones relacionadas