domingo, 28 de octubre de 2012

7. Dirección de memoria y punteros en C

Dirección de memoria
Las variables hacen referencia a una parcela de la memoria (celda) que ha sido reservada.
A estas celdas, se les asigna una dirección de memoria. Se usan variables porque es mas fácil recordar un nombre que un número.
La dirección de memoria es un número binario, que es lo que entiende la computadora. Por facilidad, se suele expresar en hexadecimal.
Una variable hace referencia a una dirección de memoria y, una dirección de memoria hace referencia a una celda.
Las variables facilitan el uso de la memoria. Con ellas no hay que preocuparse de las direcciones. Sin embargo, hay casos en los que se necesita usar las direcciones de memoria.

Punteros
Un puntero es una variable especial.
Cuando se asigna un dato en una variable (precio_pan = 1;), el lenguaje se encarga de ir a la dirección de memoria y almacenarlo en esa celda. Por lo que la gestión de la memoria, se hace de forma automática.
Al declarar variables con el mismo nombre en distintos bloques de código, cada una hace referencia a una dirección de memoria distinta. Por eso los datos que almacenan no se corresponden y, cuando introducimos en una función (o método) unos datos sólo llega el valor, no las variables.
Para trabajar con la misma celda y poder cambiar su valor, se debe introducir en la función la dirección de memoria a la que hace referencia una variable, en vez de el dato.
Para poder usar esa dirección de memoria se necesita una variable especial que almacena direcciones de memoria, llamadas punteros (apuntan a una dirección de memoria). Son variables y tienen tipos de datos (int, char, float). La diferencia es que su valor es una dirección de memoria.
Para obtener la dirección de memoria a la que hace referencia una variable, se usa el operador referencia '&' (puntero = &precio_pan;). Para declarar un puntero, se antepone el carácter '*' (int *puntero;). Un puntero tiene tipo de dato y sólo puede apuntar a una celda que tenga su tipo de dato. Además, para acceder al valor desde el puntero, también se usa el operador '*' (*puntero = 1;).
int precio_pan = 0;
int *puntero;

puntero = &precio_pan;

precio_pan++;
*puntero++;

Nota: Al final, el valor que contiene la variable 'precio_pan' es 2.
Para poder manipular la misma celda de memoria dentro de varias funciones, se usan punteros:
void suma(int numero1, int numero2, int *puntero) {

 *puntero = numero1 + numero2;

}

int main(int argc, char *argv[]) {

 int resultado;

 suma( 2, 2, &resultado );

 return 1;

}
Nota: Para cambiar el valor de la variable 'resultado' (ámbito main) dentro del método suma, se envía a la función su dirección de memoria. Ésta se almacena en un puntero y, haciendo uso del operador apuntar '*' sobre la variable 'puntero' (*puntero) se puede cambiar el valor de la variable 'resultado' dentro de la función suma.
    Vídeos explicativos
    Si quieres programar en Gnu/Linux. (Próximamente)
    Si quieres programar en Windows. (Próximamente)
Leer datos desde el teclado.
En la librería 'stdio.h' también hay funciones de entrada. La mas utilizada para leer desde el teclado es scanf.
Permite obtener el dato que ha introducido el usuario por teclado y lo introduce en una variable (o en varias variables).
int edad;

scanf( "%i", &edad );
Esta función recibe como mínimo 2 argumentos, una cadena de formato (texto estático, entre comillas dobles) y la dirección de memoria de una variable en la que almacenar el dato. Si se quieren leer 3 datos, la función debe recibir 4 argumentos: la cadena de formato y 3 direcciones de memoria.
Normalmente sólo se lee un dato por cada función scanf. La cadena de formato es similar a la cadena de formato de la función printf. Si se quiere leer un número entero, %i; decimal, %f; carácter, %c. Es un error común olvidar el carácter '&' antes de la variable, lo que provoca un error de asignación de tipo.
Al pedir un dato al usuario, es conveniente indicarle con un mensaje de texto qué debe introducir.
float peso;

printf( "Introduce tu peso en kg: " );
scanf( "%f", &peso );
    Vídeos explicativos
    Si quieres programar en Gnu/Linux. (Próximamente)
    Si quieres programar en Windows. (Próximamente)


< Página anterior - Siguiente página (En proceso) >



Licencia de Creative Commons
Espíritu programador by sergiolindo@gmail.com is licensed under a Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 Unported License.

No hay comentarios:

Publicar un comentario