Estructuras de Datos Memoria y Variables
Conceptos Computador: CPU + Memoria + Dispositivos E/S La memoria se encarga de almacenar los datos y los programas La memoria puede verse como un arreglo lineal En cada posición (“posición de memoria”) del arreglo se puede almacenar un byte (8 bits)
Dato Dirección Posición de memoria Byte (8 bits) Memoria
Paso de argumentos por valor Las funciones reciben argumentos, que son los valores de entrada sobre los cuales se llevará a cabo el proceso especificado por la función Si un argumento se pasa por valor significa que al enviar una variable como argumento a una función, la función tomará el valor guardado en la variable y creará una copia de esta sobre la cual operará Esta copia, ocupa un espacio diferente en memoria y es totalmente independiente de la primera Luego se verá el paso de argumentos por referencia…
Ámbito y Visibilidad de los Datos La declaración de una variable asocia un nombre (identificador) a un espacio de memoria en el cual puede guardarse un dato del tipo indicado en la declaración El tipo determina cuanto espacio de memoria se le asigna a una variable La variable adquiere un ámbito y una visibilidad y estos dependen del lugar* donde se haga la declaración * Y de otras “cosas” que no se detallarán aquí como los cualificadores static, extern etc…
Ámbito El ámbito de una variable es la parte del programa en la cual la variable existe Cuando el programa sale del ámbito de una variable, el espacio asociado a esta se libera (la variable se destruye) Se verán 2 tipos de ámbitos: –Local (o de bloque) –Global (o de archivo)
Ámbito local Tienen ámbito local aquellas variables que se declaran dentro de un bloque: dicho ámbito empieza en el punto de declaración y termina en la llave ( } ) que cierra el bloque Los argumentos pasados por valor y las variables declaradas al inicio de una función tienen un ámbito local, que corresponde al bloque que define la función
Ejemplo void imprimir10siguientes(int a) { for(int i=0; i<10; i++) { printf(" %d ", a+i); } Ámbito de i Ámbito de a
Nota: El ámbito de una variable definida en la expresión de inicio de un ciclo for depende del compilador (o de como se configure) int main(void) { for(int i=0; i<10; i++) { cout << "Dentro del ciclo, i = " << i; } cout << "Fuera del bucle, i = " << i; //Puede producir error... }
Ámbito Global Las variables con ámbito global son aquellas que son declaradas por fuera de todos los bloques (incluido el bloque de la función main()) y de las clases Pueden usarse en cualquier parte del archivo fuente (programa)
Ejemplo int a=3; void sumar5() { int b=5; a=a+5; } void main() { void sumar5(); a = a+4; } Ámbito de a (global) Ámbito de b (local)
Visibilidad La visibilidad se refiere a las partes del programa en las que puede accederse al espacio de memoria asignado a una variable. En algunas ocasiones una declaración de variable puede ocultar otra variable con el mismo nombre:
Ejemplo int a=8; int sumar5(int a) { cout <<a; // Imprime 4 (parámetro) Oculta la vble a global a=a+5; cout <<a; // Imprime 9 return a; } void main() { int b=4; b=sumar5(b); cout <<b; // Imprime 9 cout <<a;// Imprime 8 (vble global) }
MAPAS DE MEMORIA La memoria lógicamente se divide en: –Stack (pila) Almacena todas las vables con duración local, como las declaradas dentro de funciones y los parámetros por valor pasados a las funciones –Segmento de Datos En él se almacenan todas las variables globales y las constantes. Considérese el siguiente programa:
#include int p=4; float b=30.2; int sumar1(int a) { a = a+1; return a; } int buscar(char e) { char cadena[4]; int i=0; scanf("%s",cadena); while(cadena[i]!='\0') { if( cadena[i]==e ) return 1; i=sumar1(i); } return 0; } void main() { int resp=0; char letra='u'; resp=buscar(letra); cout<<resp; }
Ver seguimiento paso a paso de los Mapas de Memoria correspondientes en el Módulo 5