Dev - C++ - Punteros en C++

   
Vista:
Imágen de perfil de Martin Larrosa

Punteros en C++

Publicado por Martin Larrosa martnahuel95@gmail.com (19 intervenciones) el 11/05/2016 16:57:39
¿Cuándo y por qué son necesarios los punteros en un código?

He leído mucho acerca de los punteros y del trabajo con memoria dinámica, pero no he encontrado tutoriales que me hayan ayudado a entender bien este tema.

Quisiera saber también si todo lo que se puede programar usando los punteros puede de igual manera programarse sin ellos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Punteros en C++

Publicado por agustin (305 intervenciones) el 12/05/2016 00:30:42
Los punteros son una parte importantisima de c/c++.
Imagina que tienes un array de estructuras llamado x, ahora te piden que lo recorras entero y que al final muestres la dirección que tiene asignada esa estructura. Eso se podría hacer con un simple long pero ¿y si luego te piden que modifiques algún elemento de dicha estructura? Si guardaste la dirección en un long tendrías que buscar de nuevo en la lista de estructuras pero si usaste un puntero tu puntero apunta a dicha estructura con lo que tienes total acceso a ella pudiendo modificar sus elementos fácilmente.
Aún más importante, imagina que creas una función la cual te tiene que devolver dos o más valores. Cuando pasas un argumento como valor lo que haces realmente es crear una copia de el así que todo lo que le hagas dentro de la función no modificará al argumento original y a la salida de la función no habrán sufrido cambios. Si los pasas como punteros no se crean copias, trabajas directamente sobre los argumentos originales pudiendo usar argumentos para retornar varios valores. ¿Se podría hacer eso sin punteros? Supongo que si pero tendrías que retornar una estructura la cual retornaria y usar memcpy para hacer una copia de la memoria de dicha estructura en la estructura que debería guardar el retorno.
Supongo que todo se podría hacer sin punteros pero la tarea seria menos clara, más tediosa, más lenta, y gastaría más recursos.
En Basic no existían los punteros o al menos no recuerdo que existieran y supongo que en otros lenguajes tampoco pero entre otras cosas por eso C sigue muy vivo y basic es una reliquia que ni se estudia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar

Punteros en C++

Publicado por Martín (65 intervenciones) el 15/05/2016 10:18:34
¿Cuándo y por qué son necesarios los punteros?

Una utilidad inmediata es el uso de memoria cuando la que está disponible en la pila no es suficiente. En el modelo de memoria del C++ (y en las máquinas reales donde se va a ejecutar tu programa) la memoria a la que se tiene acceso está en dos lugares distintos, y cada uno con sus reglas de juego. Uno es "la pila" o "el stack", que es una memoria muy rápida y económica, que todos queremos usar, pero muy muy escasa; se está usando memoria de la pila cuando se hace algo así:
int i;
Con eso estamos tomando una cantidad sizeof(int) de memoria de la pila, habitualmente 4 bytes.

Pero esa memoria en la pila es muy eficiente pero, lamentablemente, muy escasa, así que normalmente no se reclama más de 10 KB o algo así, no hay una regla universal porque se puede fijar un tamaño de esa pila más grande si hiciera falta, pero es muy raro que se use 1 MB, yo nunca lo ví.

Además, muchas veces no sabemos cuánta memoria hay que reclamar, por ejemplo, cuando se le pide al usuario algo como "Ingrese la cantidad de invitados a la fiesta" (llamémosle "N") y hasta que no tengamos la respuesta, el programa no puede saber cuánta memoria va a necesitar para crear los "N" pitos y matracas necesarios para entretener a los invitados.

Esa memoria que el programa puede reclamar en tiempo de ejecución, desconocida en tiempo de compilación (desconocida por el programador) es la "memoria dinámica", "memoria libre", "memoria en el montículo" o en el "heap", y debo estar olvidando algún nombre más. Fíjate que siempre que algo tiene muchos nombres es porque se trata de algo inquietante.... (por ejemplo, a ver si se me ocurren cosas que tengan más de 10 nombres... ah, sí, pero no las voy a decir)

Pero bueno, la idea es que para memoria que se va reclamar del stack, en tiempo de ejecución, se necesita puntero.

Otras veces se usa como una referencia a un objeto, por ejemplo, si teníamos
int i;
y luego
i = 5;

decir
int* p = &i;
*p = 3;

va a poner un 3 en i. Se usa el puntero p como una referencia a i.

Pero, llegando a la sección de peros...

Pero, decía, si ves sitios como este parecería que los punteros en C++ se usan todo el tiempo, pero no es así; en C++ casi no se usan punteros, son algo muy raro, no deseable, normalmente la última de las opciones. No es que no se usen realmente, sólo que hay otras opciones mejores, como los vector, list, deque, set, map, array, etcétera, etcétera, y los "smart pointers" unique_ptr, shared_ptr y demás.

Ellos sí usan punteros, porque podemos usar un vector y llenarlo de cosas en tiempo de ejecución, que el vector va a crecer solito a medida que necesite más espacio para guardar sus cosas.

Bueno, también se usan punteros para pasarlos como argumento de una función, o ser devueltos desde alguna función, siempre que no vaya a creerse la dueña del puntero (no va a pretender hacerle un "delete", por ejemplo) y en alguna ocasión más, pero en general es muy raro verlos, salvo que uno sea programador de librerías o de compiladores, que ahí suelen vérselos más seguido. Pero en estas cosas sí son necesarios, que era la segunda parte de tu pregunta.

Se usaban mucho antes del estándar C++98 (sí, antes del año 1998), y los malos programadores los siguieron usando hasta después del 98, Con el estándar 11 (del 2011), el 14 y el próximo 17 (que ya casi está), esos malos programadores se fueron extinguiendo, sólo se los encuentra dando clases, pero creo que afortunadamente ya no quedó ninguno en la vida real.

Y la otra cosa que preguntas es si todo puede hacerse sin punteros. Y mi respuesta es que no, no todo, algunas raras veces necesitas punteros, como en los caso que mencionaba por ahí arriba, pero normalmente, si te encuentras usando un puntero es porque lo has meditado lo suficiente y estás dispuesto a defender tu decisión, o porque, bueno, eres un inimputable.

Para que te formes una idea más concreta, yo te diría que el uso de punteros en C++ es casi tan frecuente como el uso de goto, más o menos.

:)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar