[C con Clase] Punteros

Programante programante en gmail.com
Jue Mayo 28 23:27:58 CEST 2009


Diego escribió:
> Nuevamente hola a toda la lista que en realidad me han ayudado mucho durante este corto tiempo, gracias.
>
> Bueno resulta que en la universidad estamos pasando punteros en c y la verdad es que la base la entiendo, por ejemplo:
>    
> int a=4;  //variable a entero
> int *punt; //creo el puntero *punt com entero
>
> punt=&a; //asigno a punt la direccion de memoria donde se aloja a (apunto a a)
>
> printf("%i", punt); //mostrara la direccion de memoria donde se aloja a
> printf("%i", punt); //mostrara el valor de la variable a
>
> tambien entiendo que en scanf("%i", &a); el & actua como un puntero asignando el valor ingresado por el usuario a la direccion de memoria en donde se ubica la variable a
>
>
> eso lo entinedo , ahora lo que se me hace dificil de entender es que este mismo codigo sin punteros seria mucho mas corto sin ellos, claro no se podria mostrar la direccion de memoria, pero solo eso, es por ello que no entiendo efectivamente para que me sirven los punteros no entiendo su uso.
> sea como argumento de funciones, o su trabajo en conjunto con los arreglos u estructuras
>
> espero puedan ayudarme nuevamente ;), gracias

Cuando tienes la variable a dos líneas más arriba no es muy útil. :)
La utilidad viene cuando quieres modificar una variable que te pasan
como parámetro, o que en vez de estar en la pila, está en el montón.
Por ejemplo:

void inicializacion_muy_complicada_de_las_variables(int* variable) {
 //Realizar aquí los cálculos correspondientes.
  variable = 42;
}

int main () {
 int variable1;
 int variable2;

 inicializacion_muy_complicada_de_las_variables(&variable1);
 inicializacion_muy_complicada_de_las_variables(&variable2);

 printf("%i\n", variable1 + variable2);
 return 0;
}

Puedes ver cómo la función de inicialización podemos usarla para muchas
variables, sin repetir el código para cada una de ellas, simplemente
pasándole un puntero de la variable a modificar como parámetro. Sin
punteros esto no sería posible (en C++ también tienes la opción de usar
referencias, que son como 'punteros disfrazados').

Ahora suponte que quieres trabajar con cientos de datos:

int i, j;
char Memoria [1000000];

for (i=0; i < 1000000; i+=26) {
  //Procesamiento
  for (j=0; j < 26; j++) {
      Memoria[i+j] = j + 'A';
  }
}
Memoria [999999] = '\0';

Una cantidad así no está disponible en la pila. Por lo tanto necesitas
usar el montón. Solicitas espacio para 1000000 bytes y... sí, te dice la
dirección de memoria donde los tienes disponibles.
El mismo código usando memoria dinámica sería:

int i, j;
char* Memoria = malloc(1000000);

for (i=0; i < 1000000; i+=26) {
  //Procesamiento
  for (j=0; j < 26; j++) {
      Memoria[i+j] = j + 'A';
  }
}
Memoria [999999] = '\0';
free(Memoria);






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