[C con Clase] ¿Para qué sirven los punteros?

Steven Davidson steven en conclase.net
Sab Feb 3 00:21:41 CET 2007


Hola Max,

El pasado 2007-02-02 02:37:02, Max escribió:

M> Esto lo entiendo perfectamente. Pero... ¿por qué no usar referencias y ya? eso no lo entiendo... ¿por qué no pasar la dirección de memoria y listo? ¿para qué almacenar la dirección de memoria en una variable (en un puntero)? ¿por qué no pasarla directamente? no entiendo...

Bien. Sorcerer ya te ha contestado brevemente con una buena respuesta. Voy a agregar a lo que ha dicho.

El uso de punteros para pasar las direcciones de memoria de las variables para poder modificar el valor de tal variable proviene de C. Bajo C, no existen las referencias. Por lo tanto, para poder programar algo parecido a las referencias, se emula este comportamiento a través de punteros. Es cierto, que bajo C++, no es necesario usar punteros de esta manera, ya que existen las referencias. Sin embargo, tampoco es buena idea usar referencias en todas las ocasiones. Desde el punto de vista de diseño, es posible que uno confunda o se olvide de los requisitos de los parámetros de una función. Por ejemplo,

int num;

func( num );

¿Pasamos 'num' por copia o por referencia? No podemos asegurar su comportamiento o funcionamiento, al menos que tengamos presente el prototipo. Ahora bien, si usamos punteros, entonces forzamos a la invocación a usar el operador &. Esto sería,

int num;

func( &num );

Aquí, seguramente modificará el valor de la variable 'num' y se ve claramente que acepta un puntero.

Como mencionó Sorcerer, necesitas avanzar un poco más en los temas tratados para ver el uso de punteros. Sólo con punteros podemos usar memoria dinámicamente al igual que listas o arrays con elementos contiguos. Por ejemplo,

void func2( float *p, int n );
...
float lista[10];

func2( lista, num );

Aquí tenemos que usar punteros, ya que una referencia implicaría un solo elemento y no el primero de varios.

Te pongo un ejemplo de memoria dinámica:

double *pCargas;
int nCant;
...
pCargas = new double[nCant];

Ahora tenemos un array dinámico de 'nCant' elementos de tipo 'double'. Con esto, podemos crear arrays sin saber de antemano la cantidad de elementos que contiene. Cuando el programa se ejecuta, entonces podemos crear el array de acuerdo a otros criterios y datos.


Espero que esto te aclare un poco más el tema.

Steven


Más información sobre la lista de distribución Cconclase