sábado, 5 de mayo de 2012

Tutorial de programación C/C++ desde 0. Capitulo 9


Hola a todos,

En el último tutorial cometí un error bastante grande: hablar de punteros sin haberlos explicado antes...Así que le tendré que dar explicación...

Que són los punteros?
Los punteros son la gran diferencia entre C/C++ y el resto de lenguajes y son la base de la grandísima potencia que tienen estos lenguajes, problema? que no son fáciles ni de entender, ni de usar y complican el mantenimiento del código.

Las variables que usamos en nuestros programas se almacenan en la memoria RAM del ordenador. La dirección donde estan guardadas es lo que llamamos el puntero a esa variable. Es decir que podemos tener un variable de tipo char en la posición 1 millón de la memoria, y que vale 129. Su valor será 129 pero su puntero valdrá 1 millón.

Como usar punteros?
Lo principal, los operadores básicos:

Definición:
char var;   //Variable
char *p;    // Puntero. Internamente se puede considerar que es una variable que almacena la posición de memoria de otra variable. (en este caso, podría ocupar 32 o 64 bits y no los 8 bits que cabria suponer inicialmente)
int *p2;   //Puntero. Ocupa exactamente lo mismo que el puntero anterior, aunque apunte a variables de diferente tipo el funcionamiento es el mismo

Pasar de variable a puntero y viceversa:
var = *p; //Obtenemos el valor que apunta p y lo ponemos en var
p = &var; //Obtenemos la dirección de memoria de la variable var y la ponemos en p

Punteros y vectores:
En otro capitulo ya daré mas a fondo el tema de vectores, pero a modo de aproximación diremos que es una forma de almacenar muchos datos a la vez en una sola "variable". Pues bien , esa variable se entiende que es el puntero al vector... es decir:

char v[100]; //Vector de 100 elementos de tipo char
char *p;       //Puntero a char

p = &v[0];  //El puntero al vector es la posición de memoria del primer elemento o...
p = v;        //Caso especial en que no hace falta el operador & para obtener la dirección de memoria.

Punteros y funciones:
Cuando usamos punteros como parametros de funciones solo hemos de tener en cuenta que  para el caso de vectores es lo "mismo" (practicamente lo mismo) declarar los parametros de cualquiera de estas maneras:

void Ejemplo( char *p)       //Puntero a algo
void Ejemplo ( char p[])     //Vector sin tamaño definido
void Ejemplo (char p[124]) //Vector de tamaño definido

Para que usar punteros?

Pese a que hay muchisimos motivos para usar punteros, tal vez el más extendido es el de pasar información entre funciones. Es decir, las funciones nos devuelven solamente un valor como parametro de retorno, y los parametros que le pasamos se copian al iniciar la función de forma que la función no puede modificarlos. Si tenemos una función que nos ha de modificar una cantidad grande de información lo más normal es pasarle el puntero a la zona de memoria donde queremos que nos deje los resultados. Ejemplo

void Ejemplo(char id, char*data)
{
      int i;

      for (i = 0 ; i < 100 ; ++i )
           *(data+i)  = id;
}

En fin, es un tema complejo, y se podría hacer un libro solamente sobre esto, así que entenderé si hay un aluvión de preguntas y dudas. Hacedlas sin problema que para eso estamos. Si algo no ha quedado suficientemente claro decidlo y hago otro tutorial sobre el tema.

LordPakusBlog

4 comentarios :

  1. exactamente a que se refiere el enunciado *(data+i) = i; ? es para regresar la informacion? PD: hace un tiempo que veo tus tutoriales y los haces bastante bien y completos

    ResponderEliminar
    Respuestas
    1. Si, es para devolver el resultado. data es el puntero al vector donde se devolverá la información.
      data+i es la posicion donde queremos guardar el dato
      *(data+i) es el valor referente a esa posición
      i es el dato a guardar
      No es fácil, suerte! No vaciles en hacerme llegar otras dudas

      Eliminar
  2. Lo primero gracias por los tutoriales, vienen bien para refrescar conocimientos y adquirir nuevos.
    Mi duda es la siguiente. En la línea "*(data+i) = i;" Estamos ingresando un dato tipo 'int' en una posición que está formateada a tipo 'char'. No se si eso es posible o sin embargo querías poner en esa línea "*(data+i) = id;". Es decir, que es "id" en vez de "i" lo que incluimos en esa posición.

    ResponderEliminar
    Respuestas
    1. Tienes toda la razón! Lo acabo de arreglar. Gracias por verlo!

      Eliminar

Entradas populares