Déjame intentar responder esto también.
Los punteros son similares a las referencias. En otras palabras, no son copias, sino una forma de referirse al valor original.
Antes que nada, un lugar en el que normalmente tendrá que usar muchos punteros es cuando se trata de hardware integrado . Tal vez necesite alternar el estado de un pin de E / S digital. Quizás esté procesando una interrupción y necesite almacenar un valor en una ubicación específica. Te dan la imagen. Sin embargo, si no está tratando con hardware directamente y solo se pregunta qué tipos usar, siga leyendo.
¿Por qué usar punteros en lugar de variables normales? La respuesta se vuelve más clara cuando se trata de tipos complejos, como clases, estructuras y matrices. Si usara una variable normal, podría terminar haciendo una copia (los compiladores son lo suficientemente inteligentes como para evitar esto en algunas situaciones y C ++ 11 también ayuda, pero por ahora nos mantendremos alejados de esa discusión).
¿Qué sucede si quieres modificar el valor original? Podrías usar algo como esto:
MyType a; //let's ignore what MyType actually is right now.
a = modify(a);
Eso funcionará bien y si no sabes exactamente por qué estás usando punteros, no deberías usarlos. Tenga cuidado con la razón "probablemente sean más rápidos". Ejecute sus propias pruebas y, si realmente son más rápidas, úselas.
Sin embargo, supongamos que está resolviendo un problema en el que necesita asignar memoria. Cuando asigna memoria, debe desasignarla. La asignación de memoria puede o no ser exitosa. Aquí es donde los punteros son útiles: le permiten probar la existencia del objeto que ha asignado y le permiten acceder al objeto para el que se asignó la memoria al hacer referencia al puntero.
MyType *p = NULL; //empty pointer
if(p)
{
//we never reach here, because the pointer points to nothing
}
//now, let's allocate some memory
p = new MyType[50000];
if(p) //if the memory was allocated, this test will pass
{
//we can do something with our allocated array
for(size_t i=0; i!=50000; i++)
{
MyType &v = *(p+i); //get a reference to the ith object
//do something with it
//...
}
delete[] p; //we're done. de-allocate the memory
}
Esta es la clave de por qué usaría punteros: las referencias suponen que el elemento al que hace referencia ya existe . Un puntero no lo hace.
La otra razón por la que usaría punteros (o al menos tendría que lidiar con ellos) es porque son un tipo de datos que existía antes de las referencias. Por lo tanto, si terminas usando bibliotecas para hacer las cosas en las que sabes que son mejores, encontrarás que muchas de estas bibliotecas usan punteros en todo el lugar, simplemente por el tiempo que han existido (mucho de ellos fueron escritos antes de C ++).
Si no usó ninguna biblioteca, podría diseñar su código de tal manera que pudiera mantenerse alejado de los punteros, pero dado que los punteros son uno de los tipos básicos del lenguaje, cuanto más rápido se sienta cómodo al usarlos, más tus habilidades en C ++ serán portátiles.
Desde el punto de vista del mantenimiento, también debo mencionar que cuando usa punteros, debe probar su validez y manejar el caso cuando no son válidos, o simplemente asumir que son válidos y aceptar el hecho de que su el programa se bloqueará o peor CUANDO esa suposición se rompa. Dicho de otra manera, su elección con los punteros es introducir la complejidad del código o más esfuerzo de mantenimiento cuando algo se rompe y está tratando de rastrear un error que pertenece a toda una clase de errores que introducen los punteros, como la corrupción de la memoria.
Entonces, si controla todo su código, manténgase alejado de los punteros y, en su lugar, use referencias, manteniéndolos constantes cuando pueda. Esto lo obligará a pensar en los tiempos de vida de sus objetos y terminará manteniendo su código más fácil de entender.
Solo recuerda esta diferencia: una referencia es esencialmente un puntero válido. Un puntero no siempre es válido.
Entonces, ¿estoy diciendo que es imposible crear una referencia no válida? No. Es totalmente posible, porque C ++ te permite hacer casi cualquier cosa. Es más difícil de hacer sin querer y te sorprenderá cuántos errores son involuntarios :)