You are on page 1of 3

Como sabemos, en lenguaje C/C++, &x es la direccin donde se almacena en memoria la variable x.

Si p es un apuntador en C/C++, *p es el contenido de la localidad de memoria p. En C/C++, una variable que debe contener la direccin en la memoria que almacena un nmero entero se crea mediante la declaracin int *p; La parte de tipo int *, que indica que se trata de un apuntador a un entero; y la parte de identificador, en este caso p. Una vez declarada la variable p como un apuntador a un tipo especfico de dato, debe ser posible crear dinmicamente un objeto de este tipo especfico y asignar su direccin a p. Esto se hace en C/C++ mediante la funcin de la bibliote ca estndar malloc(size). La funcin malloc asigna de manera dinmica una parte de memori a de tamao especificado en size y devuelve un apuntador a un elemento de tipo char. Consideremos las siguientes declaraciones extern char *malloc(); int *pi; float *pr; La palabra clave extern especifica que una variable o funcin tiene un enlace externo. Esto significa que la variable o funcin a la que nos referimos est definida en algn otro archivo fuente, o ms adelante en el mismo archivo. Sin embargo, en C/C++ podemos usar esta palabra clave extern con una cadena. La cadena indica que se est usand o el convenio de enlace de otro lenguaje para los identificadores que se estn definiendo. Para los programas C++ la cadena por defecto es ``C++''. Los enunciados pi = (int *) malloc(sizeof(int)); pr = (float *) malloc(sizeof(float)); crean directamente la variable entera *pi y la variable real *pr. Estas se denominan variables dinmicas. Al ejecutar estos enunciados, el operador sizeof devuelve el tamao en bytes de su operando. Esto se usa para conservar la independencia de mquina. Despus,malloc crea un objeto de este tamao. Por tanto, malloc(sizeof(int)) asigna almacenamiento para un entero, en tanto que malloc(sizeof(float)) asigna espacio necesario para un real. De igual manera, malloc devuelve un apuntados al almacenamiento que asigna. Este apuntado r es al primer byte de este almacenamiento y es de tipo char *. Para obligar al apuntador a que seale a un entero, usamos el operador de clculo (int *) (float *). El operador sizeof, devuelve un valor de tipo int, en tanto que la funcin malloc espera un parmetro de tipo unsigned. Para hacer que correspondan, debemos escribir pi=(int *)malloc((unsigned)(sizeof(int))); Como ejemplo, vamos a considerar este breve cdigo: #include <iostream>

int main (int argc, char * const argv[]) { ( 1) int *p, *q; ( 2) int x; ( 3) p = (int *)malloc(sizeof(int)); ( 4) *p = 3; ( 5) q = p; ( 6) std::cout<< *p << " " << *q << "\n"; ( 7) x = 7; ( 8) *q = x; ( 9) std::cout<< *p << " " << *q << "\n"; (10) p = (int *)malloc(sizeof(int)); (11) *p = 5; (12) std::cout<< *p << " " << *q << "\n"; return 0; } En la linea (3), se crea una variable de tipo entero y su direccin se coloca en p. La lnea (4) establece el valor de esa variable en 3. La lnea (5) hace que la direccin q sea la misma direccin que p. El enunciado de la lnea (5) es perfectamente vlido, pues se asigna a una variable de tipo apuntador (q) el valor de otra variable del mismo tipo (p). En este momento *p y *q hacen referencia a la misma variable. Por tanto, la lnea (6) imprime el contenido de esa variable (que ahora es 3) dos veces. En la lnea (7), se almacena el valor 7 en la variable entera x. La lnea (8) cambia el valor de *q al valor de x. sin embargo, dado que p y q apuntan a la misma variable, *p y *q tienen el valor 7. Por tanto la lnea (9) imprime el nmero 7 dos veces. La lnea (10) crea una nueva variable entera y coloca su direccin en p. Ahora *p hace referencia a la variable entera recin creada que todava no ha recibido un valor. q no ha cambiado; por lo que el valor de *q sigue siendo 7. Observemos que *p no hace referencia a una variable especfica nica. Su valor cambia conforme se modifica el valor de p. La lnea (11) establece el valor de esta variable recin creada en 5 y la lnea 12 imprime los valores 5 y 7. Y as la salida del programa es: 3 3 7 7 5 7 mallocEjemplo has exited with status 0. La funcin free se usa en C para liberar almacenamiento de una variable asignada dinmicamente. La orden free(p); invalida cualquier referencia futura a la variable *p (a menos que se asigne nuevo espacio de memoraia a esa variable). Llamar free(p) hace que quede disponible para reso el almacenamiento ocupado por *p, si es necesario. La funcin free espera un parmetro apuntador del tipo char *, para que no tengamos problemas de tipos, debemos hacer

free((char *)p); Consideremos el siguiente ejemplo para ilustrar el uso de free: #include <iostream> int main (int argc, char * const argv[]) { int *p, *q; ( 1) p=(int *)malloc(sizeof(int)); ( 2) *p=5; ( 3) q=(int *)malloc(sizeof(int)); ( 4) *q=8; ( 5) free(p); ( 6) p=q; ( 7) q=(int *)malloc(sizeof(int)); ( 8) *q=6; ( 9) std::cout<<*p<<" "<<*q<<"\n"; return 0; } Qu se imprime a la salida del programa? Observemos que si se llama malloc dos veces sucesivas y se asigna su valor a la misma variable como en: p=(int *)malloc(sizeof(int)); *p=3; p=(int *)malloc(sizeof(int)); *p=7; Se pierde la primera copia de *p, dado que su direccin no se guard.

You might also like