TIPOS DE DATOS ESTRUCTURAS DE DATOS www.espol.edu.ec www.fiec.espol.edu.ec
OBJETIVOS Manejo correcto y apropiado de punteros y reserva de memoria dinámica Reconocer el tipo de dato void y void * en C como una herramienta de potencial importancia Diferenciar entre arreglos y estructuras  Utilizar correctamente las estructuras, punteros a estructuras, arreglos de estructuras, etc.
DATO Información en bruto, sin ningún significado Dado un enunciado, evento o acción, los datos Permiten representar sus actores o participantes Analizándolos, se podrá obtener resultados deseados Analicemos el siguiente hecho: El estudiante de nombre Pedro Velez de 22 años, tiene un promedio de 7.5 Podemos tomar los siguientes datos Nombre:  Pedro Velez -> Conjunto de Caracteres Edad:  22 -> entero Promedio:  7.5 -> real
INFORMACIÓN Es el resultado deseado luego de procesar los datos Los datos, al ser procesados, se convierten en  información útil  o resultados. Procesamiento: Calcular salarios Juan, Perez  $320 Pedro, Rodriguez  $310 Luis, Pozo  $240 Datos de salida(se muestran en el monitor) Datos de entrada(ingresados x teclado) Juan, Perez  Pedro, Rodriguez Luis, Pozo 160 155 120 Empleado Horas Valor por hora = $2
¿Cómo representar los datos? Los seres humanos: Usamos lenguaje natural o símbolos Ejemplo: Para representar números, usamos el sistema decimal Para representar palabras, usamos el abecedario La computadora: Usa conjuntos de 1s y 0s El dato mas pequeño en el computador es  Un 1 o un 0 -> bit El conjunto de 8 bits -> 1 byte
TIPOS  DE DATOS Los datos se clasifican en TIPOS Son los diferentes dominios existentes. Ejemplo: Edad, Año de Nacimiento, Numero de multas Tienen dominio  numérico Nombre, Dirección, Num. Cedula,  Caen en el dominio de la  información tipo texto Y las operaciones permitidas para dicho dominio Un conjunto de  valores  y  operaciones  definidas solo para esos valores
RECORDAR Un tipo de dato es el conjunto de valores  Al que puede pertenecer una constante Que puede asumir una variable o expresión Que puede ser generado por una función De una constante, variable o expresión Se puede deducir su tipo de dato Ya sea de su forma o de su declaración Sin necesidad que se ejecute ningún proceso Las operaciones entre datos Necesitan participantes (argumentos) de determinado tipo Producen resultados de otro o el mismo tipo
TIPOS DE DATOS BASICOS Los podemos distinguir fácilmente, están en el diario vivir: El  Sr. Vera  de  63  años tiene cedula No.  0908815533 , y paga  $120  de impuestos Son tipos de datos simples Que permiten representar información numérica, caracteres, etc. NOMBRE CONJUNTO DE VALORES OPERACIONES Enteros Negativos y positivos sin decimal Sumar, restar, dividir, multiplicar, residuo Reales Negativos y positivos, con decimal Sumar, restar, dividir, multiplicar Lógicos Verdadero o Falso(1 o 0) And, Or, Not Caracteres Letras, números, especiales, juntos forman una cadena Sumar carácter + entero restar, multiplicar por entero
Y EN LA COMPUTADORA? Solo vienen integrados los tipos de datos básicos En la computadora Cada byte es un casillero y tiene una dirección en memoria Los datos (números y letras) se almacena en estos casilleros ¿Cuantas casilleros ocupa un dato? Depende de su tipo y del hardware de la computadora Un entero puede ocupar casillas de hasta 4 bytes Un doble siempre ocupara mas, por su mayor precisión PERO, un carácter SIEMPRE ocupara casillas de 1 byte 1000 1001 1002 1003
ALMACENANDO DATOS TIPO DE DATO #bytes Representación interna En ANSI C ENTEROS 2 4 8 Positivos: conjunto de bits 38  ->  00100110 Negativos:Complemento a Dos -38  ->  11011001 int long REALES 8 16 Mantisa x base (exponente) 387.53  -> 38753 x 10 -2 00000000100101110110000111111110 float double CARACTERES 1 ASCII 11000000  -> ‘A’ char
DECLARACION DE VARIABLES Una declaración de variables en  C  incluye Tipo de dato y  Nombre de variable(identificador) Ejemplo:  int a, b; float c; ¿Para que se declaran variables? Especifica cuanta memoria debe reservarse y Como se van a interpretar dichos datos f = a + b Es una suma de enteros, que al final se convierte a real Al declarar una variable se le asigna espacio en memoria y una  dirección  para dicho espacio int a; 4 bytes, dir: 100 1 byte, dir: 104 char c; 100 101 102 103 104
DIRECCIONES DE MEMORIA &a es 1000 Las variables  Tienen direcciones de memoria Si deseamos conocer dicha dirección En lenguaje C Se usa el operador  &  de dirección Ejemplo: int a; a = 3; printf(“Valor:%d Dir: %d”, a,  &a ); Un puntero Es una variable que puede almacenar dirección de memoria 1000 1001 1002 1003
DECLARACION DE PUNTEROS Un tipo de dato El puntero solo podrá almacenar direcciones de memoria de variables del tipo especificado Se pueden definir punteros de cualquier tipo:  float *pf;  char *pc;   Un identificador que siempre va antecedido del operador * pt almacena la dirección de x, se dice que  pt apunta a x x pt int *p; 1000 1001 1002 1003 1004 1005 1000 int *pt, x; x = 3; pt = &x; 3
CONSULTANDO CONTENIDO Si un puntero apunta a una variable A través del puntero se puede llegar a conocer todo sobre la variable Ejemplo: c = ‘A’ printf(“%c”, *pc1); *pc1 = ‘N’ printf(“%c”,c); Es equivalente a : printf(“%c”, c); Es equivalente a : c = ‘N’ Imprime ‘N’ pues c ya cambio char c, *pc1, *pc2; pc1 = &c; Si quiero conocer la dirección, uso directamente el puntero printf(“%d”, pc1);  //Imprimo la dir. Almacenada por pc1 pc2 = pc1;  //pc2 almacena la misma dir. que pc1 Si quiero conocer el contenido al que apunta un puntero, uso el operador *, sobre dicho puntero Ejercicio
EJERCICIO EN CLASE *p1 = *p2; int x,y; int *p1,*p2; x = -42; y = 163; p1 = &x; p2 = &y; *p1 = 17; *p2 = x+5; 1000  1004 Es equivalente a escribir  x = y; p1 = p2; Esto indica que p1 ahora apunta a la misma variable que p2 1004  p1 = NULL; p2 = NULL; Esto es equivalente a “encerar” el puntero, y decir que no apunta a ninguna variable -42 22 1000 1004 17 22 0 0 163 1004 1000 1004 1008 1012 x y p1 p2
PASO DE PARAMETROS Las funciones son porciones de código Ejecutan una tarea especifica Usualmente toman datos de entrada->parámetros Y retornan un valor Los parámetros se pueden enviar de dos formas: Por valor Por referencia
PASO POR VALOR La función no recibe la variable enviada Recibe una copia Similar a cuando va al hacer algún tramite y le piden al cédula No entrega la cédula verdadera Entrega una copia La verdadera estará segura, aunque quemen y destruyan la copia Ejemplo: x = 5 printf(“%d\n”,x); funct(x); printf(“%d\n”,x); void funct(int y){ y = y+1; printf(“%d\n”,y); } Se imprime 5, el valor de x no cambia aunque la función haya intentado modificarla
PASO POR REFERENCIA Aquí si la función recibe exactamente la variable enviada No hay copias Si algo se le hace al parámetro, se le esta haciendo a la variable Para esto, se usan punteros La función trabaja con un puntero a la variable enviada Sabe todo sobre esa variable y se pude acceder a través de * Ejemplo: x = 5 printf(“%d\n”,x); funct(&x); printf(“%d\n”,x); void funct(int *py){ *py = *py+1; printf(“%d\n”,*py); } Se imprime 6, el valor de x  cambió  dentro de la función Ejercicio
TIPOS DE DATOS COMPUESTOS En ocasiones se necesitan tipos de datos mas complejos, y estructurados Variables que almacenen mas de un valor Variables que representen información de la vida real Estarán formados a partir de tipos de datos simples En C, tenemos: TIPO FORMATO DECLARACION Bytes ARREGLOS int arrEj[10]; 10*2 = 20 ESTRUCTURAS typedef struct TReg{ int ID; char Texto[100]; }Reg; 2 + 100 = 102 UNIONES typedef union TUn{ int ID; char Texto[100]; }Un; 100
ARREGLOS Conjunto de elementos Finito, Ordenado y Homogéneo,  Todos sus elementos son del mismo tipo Un arreglo estático se declara int A[100]; El tipo de los elementos, el identificador y  El numero de elementos (dimensión) Cada elemento del arreglo tiene un índice En C, siempre el índice mas pequeño es el 0: limite inferior El limite superior, es 1 menos que la dimensión Si el arreglo tiene 100 elementos, el índice mas alto es el 99 Y si un entero ocupa 4 bytes, el arreglo ocupa 400 bytes seguidos ... A 0 1 2 3 4 99
OPERACIONES No basta con la declaración, para ser tratado como un tipo de dato Faltan las operaciones para actuar sobre él Consulta de un elemento //Consulto el contenido de los elementos 4 y 5 de A printf(“%d %d”,A[4], A[5]);  Modificación de un elemento A[3] = 2; //Almaceno un valor en el elemento 3 de A for(i = 0; i < 100; i++) A[i] = 0; Tipo de  dato: Conjunto de valores y  operaciones  definidas solo para esos valores
REPRESENTACION INTERNA Cuantos bytes ocupa un tipo de dato o variable? En C lo indica el operador  sizeof Ejemplo: int a; printf(“%d %d”, sizeof(int), sizeof(a)); El computador internamente No almacena la dirección de todos los elementos del arreglo Solo almacena la dirección del primer elemento El resto lo calcula así: &Lista[i]  -> &Lista[0] + (i*sizeof(Lista[0])) 1000 1008 1016 1024 1032 Lista[0] Lista[1] Lista[2] Lista[3] Lista[4]
RESERVA DE MEMORIA DINAMICA La declaración de una variable Siempre reserva memoria Aunque la variable no se use, ya se reservo memoria para ella: ESTATICA Si deseamos reservar memoria, pero no en la declaración Si no, a voluntad dentro del programa La reserva seria dinámica En C se usan  Punteros y Las funciones de librería #include <stdlib.h> void *malloc(size_t size); int *a; //No se reserva nada .. /*Cuando se desee, se reserva*/ a = malloc(sizeof(int));  //La variable normalmente *a = 3; a  no apunta a otra variable, tiene memoria propia, solo para el
ARREGLOS DINAMICOS En ocasiones deseamos usar arreglos Donde no hayamos “predefinido” cuantos elementos max. tendremos Queremos usar arreglos dinámicos Se declara el arreglo “potencial”: int *arreglo; Dentro del programa, se pide memoria cuando se necesite: arreglo = malloc(sizeof(int)*20); Para indicar el nuevo tamaño se puede usar una constante o una variable,o cualquier expresión main(){ int *arreglo, n; printf(“Ingrese el tamaño del arreglo:”); n = GetInteger(); arreglo = malloc(sizeof(int)*n); printf(“Ahora tiene %d elementos para trabajar\n”,n); ... }
Y LIBERA.. Al pedir memoria dinámicamente Se debe liberar dentro del programa En C se libera usando la función free int *a; a = malloc...; … free(a); Cuando se libera para una variable Ejercicio
ARITMETICA DE PUNTEROS Los operadores + y –  Se pueden usar con punteros Pero el significado de la operación cambia un poco Si un entero ocupa 4 bytes, tomemos este ejemplo int x; int *p; p = &x; Si la dirección de x es un valor 100 y decimos p = p+2; Que dirección almacena pi?  102 108 104 La suma indica que p se mueva 2 “enteros” mas adelante Cada entero equivale a 4 bytes 100 + 2*4 = 108
EJERCICIO EN CLASE main(){ double Lista[3]; double *p,*p1,*p2; int k; Lista[0] = 1; Lista[1] = 1.1; Lista[2] = 1.2; p = Lista; p = p + 2; printf(“%d”, *p); p = p - 1; printf(“%d”, *p); p1 = Lista+2; p2 = &Lista[0]; k = p1-p2; printf(“%d”, k); } p se mueve 2 desfases p retrocede un desfase Da el total de desfases entre p1 y p2 1 1.1 1.2 Ejercicio 1000 1008 1016 Lista[0] Lista[1] Lista[2] p p2 p1
PASO DE ARREGLOS A FUNCIONES Al pasar un arreglo a una función debe tomarse en cuenta ¿Necesitare también el tamaño del arreglo? Si es así, también debe incluirse como parámetro En prototipos y cabecera float CalcPromedio(float A[], int size); float funct(float B[]); En el cuerpo de la función float CalcPromedio(float A[], int size){ … .. A[i] = 3; } Siempre recuerde que  El paso de arreglos, es un paso por referencia Ejercicio
ARREGLOS BIDIMENSIONALES La programación ofrece innumerables opciones Un elemento de un arreglo, puede ser otro arreglo int A[3][3]; A[3] es un arreglo de tres elementos Cada elemento es otro arreglo de 3 elementos enteros int A[3][3]; Ejercicio A[0] A[1] A[2] A[0][0] A[1][0] A[2][0] A[0]1] A[1][1] A[2][1] A[0][2] A[1][2] A[2][2]
ESTRUCTURAS o REGISTROS Es un grupo de “componentes”. Cada componente Tiene su propio identificador, y  Se conoce como “elemento” o “campo” de la estructura Ejemplo: Es la declaración del nuevo “tipo de dato”: NombreCompleto Con este tipo de dato, podremos crear “variables”: NombreCompleto snombre, enombre; typedef struct  TNombreCompleto { char Primero[10]; char Inicial; char Ultimo[10]; } NombreCompleto ;
USANDO ESTRUCTURAS snombre  es una variable de tipo  NombreCompleto Tiene la misma forma que la del nuevo tipo de dato Cada miembro/campo ocupa memoria Para acceder a un campo, se indica,  La variable seguida de un punto y del nombre del campo. Ejemplo snombre.Inicial = ‘L’; snombre Los registros de tipo NombreCompleto, tendrán la misma “estructura”  Cada dato tiene diferente tamaño y espacio en memoria Cada dato representa una información diferente Ejercicio primero inicial ultimo
AMBITO DE VARIABLES Los parámetros y variables, dentro de una función,  Son variables con ámbito local Solo son validas en ese ambiente,  Las variables también pueden tener un ámbito “global” Empiezan a existir desde su declaración, y  Son liberadas con el alcance de un archivo: variables externas Para darle privacidad a una variable  Para que no pueda ser vista por otros archivos,  Se la declara static, con ámbito global para archivo únicamente

Tipos De Datos

  • 1.
    TIPOS DE DATOSESTRUCTURAS DE DATOS www.espol.edu.ec www.fiec.espol.edu.ec
  • 2.
    OBJETIVOS Manejo correctoy apropiado de punteros y reserva de memoria dinámica Reconocer el tipo de dato void y void * en C como una herramienta de potencial importancia Diferenciar entre arreglos y estructuras Utilizar correctamente las estructuras, punteros a estructuras, arreglos de estructuras, etc.
  • 3.
    DATO Información enbruto, sin ningún significado Dado un enunciado, evento o acción, los datos Permiten representar sus actores o participantes Analizándolos, se podrá obtener resultados deseados Analicemos el siguiente hecho: El estudiante de nombre Pedro Velez de 22 años, tiene un promedio de 7.5 Podemos tomar los siguientes datos Nombre: Pedro Velez -> Conjunto de Caracteres Edad: 22 -> entero Promedio: 7.5 -> real
  • 4.
    INFORMACIÓN Es elresultado deseado luego de procesar los datos Los datos, al ser procesados, se convierten en información útil o resultados. Procesamiento: Calcular salarios Juan, Perez $320 Pedro, Rodriguez $310 Luis, Pozo $240 Datos de salida(se muestran en el monitor) Datos de entrada(ingresados x teclado) Juan, Perez Pedro, Rodriguez Luis, Pozo 160 155 120 Empleado Horas Valor por hora = $2
  • 5.
    ¿Cómo representar losdatos? Los seres humanos: Usamos lenguaje natural o símbolos Ejemplo: Para representar números, usamos el sistema decimal Para representar palabras, usamos el abecedario La computadora: Usa conjuntos de 1s y 0s El dato mas pequeño en el computador es Un 1 o un 0 -> bit El conjunto de 8 bits -> 1 byte
  • 6.
    TIPOS DEDATOS Los datos se clasifican en TIPOS Son los diferentes dominios existentes. Ejemplo: Edad, Año de Nacimiento, Numero de multas Tienen dominio numérico Nombre, Dirección, Num. Cedula, Caen en el dominio de la información tipo texto Y las operaciones permitidas para dicho dominio Un conjunto de valores y operaciones definidas solo para esos valores
  • 7.
    RECORDAR Un tipode dato es el conjunto de valores Al que puede pertenecer una constante Que puede asumir una variable o expresión Que puede ser generado por una función De una constante, variable o expresión Se puede deducir su tipo de dato Ya sea de su forma o de su declaración Sin necesidad que se ejecute ningún proceso Las operaciones entre datos Necesitan participantes (argumentos) de determinado tipo Producen resultados de otro o el mismo tipo
  • 8.
    TIPOS DE DATOSBASICOS Los podemos distinguir fácilmente, están en el diario vivir: El Sr. Vera de 63 años tiene cedula No. 0908815533 , y paga $120 de impuestos Son tipos de datos simples Que permiten representar información numérica, caracteres, etc. NOMBRE CONJUNTO DE VALORES OPERACIONES Enteros Negativos y positivos sin decimal Sumar, restar, dividir, multiplicar, residuo Reales Negativos y positivos, con decimal Sumar, restar, dividir, multiplicar Lógicos Verdadero o Falso(1 o 0) And, Or, Not Caracteres Letras, números, especiales, juntos forman una cadena Sumar carácter + entero restar, multiplicar por entero
  • 9.
    Y EN LACOMPUTADORA? Solo vienen integrados los tipos de datos básicos En la computadora Cada byte es un casillero y tiene una dirección en memoria Los datos (números y letras) se almacena en estos casilleros ¿Cuantas casilleros ocupa un dato? Depende de su tipo y del hardware de la computadora Un entero puede ocupar casillas de hasta 4 bytes Un doble siempre ocupara mas, por su mayor precisión PERO, un carácter SIEMPRE ocupara casillas de 1 byte 1000 1001 1002 1003
  • 10.
    ALMACENANDO DATOS TIPODE DATO #bytes Representación interna En ANSI C ENTEROS 2 4 8 Positivos: conjunto de bits 38 -> 00100110 Negativos:Complemento a Dos -38 -> 11011001 int long REALES 8 16 Mantisa x base (exponente) 387.53 -> 38753 x 10 -2 00000000100101110110000111111110 float double CARACTERES 1 ASCII 11000000 -> ‘A’ char
  • 11.
    DECLARACION DE VARIABLESUna declaración de variables en C incluye Tipo de dato y Nombre de variable(identificador) Ejemplo: int a, b; float c; ¿Para que se declaran variables? Especifica cuanta memoria debe reservarse y Como se van a interpretar dichos datos f = a + b Es una suma de enteros, que al final se convierte a real Al declarar una variable se le asigna espacio en memoria y una dirección para dicho espacio int a; 4 bytes, dir: 100 1 byte, dir: 104 char c; 100 101 102 103 104
  • 12.
    DIRECCIONES DE MEMORIA&a es 1000 Las variables Tienen direcciones de memoria Si deseamos conocer dicha dirección En lenguaje C Se usa el operador & de dirección Ejemplo: int a; a = 3; printf(“Valor:%d Dir: %d”, a, &a ); Un puntero Es una variable que puede almacenar dirección de memoria 1000 1001 1002 1003
  • 13.
    DECLARACION DE PUNTEROSUn tipo de dato El puntero solo podrá almacenar direcciones de memoria de variables del tipo especificado Se pueden definir punteros de cualquier tipo: float *pf; char *pc; Un identificador que siempre va antecedido del operador * pt almacena la dirección de x, se dice que pt apunta a x x pt int *p; 1000 1001 1002 1003 1004 1005 1000 int *pt, x; x = 3; pt = &x; 3
  • 14.
    CONSULTANDO CONTENIDO Siun puntero apunta a una variable A través del puntero se puede llegar a conocer todo sobre la variable Ejemplo: c = ‘A’ printf(“%c”, *pc1); *pc1 = ‘N’ printf(“%c”,c); Es equivalente a : printf(“%c”, c); Es equivalente a : c = ‘N’ Imprime ‘N’ pues c ya cambio char c, *pc1, *pc2; pc1 = &c; Si quiero conocer la dirección, uso directamente el puntero printf(“%d”, pc1); //Imprimo la dir. Almacenada por pc1 pc2 = pc1; //pc2 almacena la misma dir. que pc1 Si quiero conocer el contenido al que apunta un puntero, uso el operador *, sobre dicho puntero Ejercicio
  • 15.
    EJERCICIO EN CLASE*p1 = *p2; int x,y; int *p1,*p2; x = -42; y = 163; p1 = &x; p2 = &y; *p1 = 17; *p2 = x+5; 1000 1004 Es equivalente a escribir x = y; p1 = p2; Esto indica que p1 ahora apunta a la misma variable que p2 1004 p1 = NULL; p2 = NULL; Esto es equivalente a “encerar” el puntero, y decir que no apunta a ninguna variable -42 22 1000 1004 17 22 0 0 163 1004 1000 1004 1008 1012 x y p1 p2
  • 16.
    PASO DE PARAMETROSLas funciones son porciones de código Ejecutan una tarea especifica Usualmente toman datos de entrada->parámetros Y retornan un valor Los parámetros se pueden enviar de dos formas: Por valor Por referencia
  • 17.
    PASO POR VALORLa función no recibe la variable enviada Recibe una copia Similar a cuando va al hacer algún tramite y le piden al cédula No entrega la cédula verdadera Entrega una copia La verdadera estará segura, aunque quemen y destruyan la copia Ejemplo: x = 5 printf(“%d\n”,x); funct(x); printf(“%d\n”,x); void funct(int y){ y = y+1; printf(“%d\n”,y); } Se imprime 5, el valor de x no cambia aunque la función haya intentado modificarla
  • 18.
    PASO POR REFERENCIAAquí si la función recibe exactamente la variable enviada No hay copias Si algo se le hace al parámetro, se le esta haciendo a la variable Para esto, se usan punteros La función trabaja con un puntero a la variable enviada Sabe todo sobre esa variable y se pude acceder a través de * Ejemplo: x = 5 printf(“%d\n”,x); funct(&x); printf(“%d\n”,x); void funct(int *py){ *py = *py+1; printf(“%d\n”,*py); } Se imprime 6, el valor de x cambió dentro de la función Ejercicio
  • 19.
    TIPOS DE DATOSCOMPUESTOS En ocasiones se necesitan tipos de datos mas complejos, y estructurados Variables que almacenen mas de un valor Variables que representen información de la vida real Estarán formados a partir de tipos de datos simples En C, tenemos: TIPO FORMATO DECLARACION Bytes ARREGLOS int arrEj[10]; 10*2 = 20 ESTRUCTURAS typedef struct TReg{ int ID; char Texto[100]; }Reg; 2 + 100 = 102 UNIONES typedef union TUn{ int ID; char Texto[100]; }Un; 100
  • 20.
    ARREGLOS Conjunto deelementos Finito, Ordenado y Homogéneo, Todos sus elementos son del mismo tipo Un arreglo estático se declara int A[100]; El tipo de los elementos, el identificador y El numero de elementos (dimensión) Cada elemento del arreglo tiene un índice En C, siempre el índice mas pequeño es el 0: limite inferior El limite superior, es 1 menos que la dimensión Si el arreglo tiene 100 elementos, el índice mas alto es el 99 Y si un entero ocupa 4 bytes, el arreglo ocupa 400 bytes seguidos ... A 0 1 2 3 4 99
  • 21.
    OPERACIONES No bastacon la declaración, para ser tratado como un tipo de dato Faltan las operaciones para actuar sobre él Consulta de un elemento //Consulto el contenido de los elementos 4 y 5 de A printf(“%d %d”,A[4], A[5]); Modificación de un elemento A[3] = 2; //Almaceno un valor en el elemento 3 de A for(i = 0; i < 100; i++) A[i] = 0; Tipo de dato: Conjunto de valores y operaciones definidas solo para esos valores
  • 22.
    REPRESENTACION INTERNA Cuantosbytes ocupa un tipo de dato o variable? En C lo indica el operador sizeof Ejemplo: int a; printf(“%d %d”, sizeof(int), sizeof(a)); El computador internamente No almacena la dirección de todos los elementos del arreglo Solo almacena la dirección del primer elemento El resto lo calcula así: &Lista[i] -> &Lista[0] + (i*sizeof(Lista[0])) 1000 1008 1016 1024 1032 Lista[0] Lista[1] Lista[2] Lista[3] Lista[4]
  • 23.
    RESERVA DE MEMORIADINAMICA La declaración de una variable Siempre reserva memoria Aunque la variable no se use, ya se reservo memoria para ella: ESTATICA Si deseamos reservar memoria, pero no en la declaración Si no, a voluntad dentro del programa La reserva seria dinámica En C se usan Punteros y Las funciones de librería #include <stdlib.h> void *malloc(size_t size); int *a; //No se reserva nada .. /*Cuando se desee, se reserva*/ a = malloc(sizeof(int)); //La variable normalmente *a = 3; a no apunta a otra variable, tiene memoria propia, solo para el
  • 24.
    ARREGLOS DINAMICOS Enocasiones deseamos usar arreglos Donde no hayamos “predefinido” cuantos elementos max. tendremos Queremos usar arreglos dinámicos Se declara el arreglo “potencial”: int *arreglo; Dentro del programa, se pide memoria cuando se necesite: arreglo = malloc(sizeof(int)*20); Para indicar el nuevo tamaño se puede usar una constante o una variable,o cualquier expresión main(){ int *arreglo, n; printf(“Ingrese el tamaño del arreglo:”); n = GetInteger(); arreglo = malloc(sizeof(int)*n); printf(“Ahora tiene %d elementos para trabajar\n”,n); ... }
  • 25.
    Y LIBERA.. Alpedir memoria dinámicamente Se debe liberar dentro del programa En C se libera usando la función free int *a; a = malloc...; … free(a); Cuando se libera para una variable Ejercicio
  • 26.
    ARITMETICA DE PUNTEROSLos operadores + y – Se pueden usar con punteros Pero el significado de la operación cambia un poco Si un entero ocupa 4 bytes, tomemos este ejemplo int x; int *p; p = &x; Si la dirección de x es un valor 100 y decimos p = p+2; Que dirección almacena pi? 102 108 104 La suma indica que p se mueva 2 “enteros” mas adelante Cada entero equivale a 4 bytes 100 + 2*4 = 108
  • 27.
    EJERCICIO EN CLASEmain(){ double Lista[3]; double *p,*p1,*p2; int k; Lista[0] = 1; Lista[1] = 1.1; Lista[2] = 1.2; p = Lista; p = p + 2; printf(“%d”, *p); p = p - 1; printf(“%d”, *p); p1 = Lista+2; p2 = &Lista[0]; k = p1-p2; printf(“%d”, k); } p se mueve 2 desfases p retrocede un desfase Da el total de desfases entre p1 y p2 1 1.1 1.2 Ejercicio 1000 1008 1016 Lista[0] Lista[1] Lista[2] p p2 p1
  • 28.
    PASO DE ARREGLOSA FUNCIONES Al pasar un arreglo a una función debe tomarse en cuenta ¿Necesitare también el tamaño del arreglo? Si es así, también debe incluirse como parámetro En prototipos y cabecera float CalcPromedio(float A[], int size); float funct(float B[]); En el cuerpo de la función float CalcPromedio(float A[], int size){ … .. A[i] = 3; } Siempre recuerde que El paso de arreglos, es un paso por referencia Ejercicio
  • 29.
    ARREGLOS BIDIMENSIONALES Laprogramación ofrece innumerables opciones Un elemento de un arreglo, puede ser otro arreglo int A[3][3]; A[3] es un arreglo de tres elementos Cada elemento es otro arreglo de 3 elementos enteros int A[3][3]; Ejercicio A[0] A[1] A[2] A[0][0] A[1][0] A[2][0] A[0]1] A[1][1] A[2][1] A[0][2] A[1][2] A[2][2]
  • 30.
    ESTRUCTURAS o REGISTROSEs un grupo de “componentes”. Cada componente Tiene su propio identificador, y Se conoce como “elemento” o “campo” de la estructura Ejemplo: Es la declaración del nuevo “tipo de dato”: NombreCompleto Con este tipo de dato, podremos crear “variables”: NombreCompleto snombre, enombre; typedef struct TNombreCompleto { char Primero[10]; char Inicial; char Ultimo[10]; } NombreCompleto ;
  • 31.
    USANDO ESTRUCTURAS snombre es una variable de tipo NombreCompleto Tiene la misma forma que la del nuevo tipo de dato Cada miembro/campo ocupa memoria Para acceder a un campo, se indica, La variable seguida de un punto y del nombre del campo. Ejemplo snombre.Inicial = ‘L’; snombre Los registros de tipo NombreCompleto, tendrán la misma “estructura” Cada dato tiene diferente tamaño y espacio en memoria Cada dato representa una información diferente Ejercicio primero inicial ultimo
  • 32.
    AMBITO DE VARIABLESLos parámetros y variables, dentro de una función, Son variables con ámbito local Solo son validas en ese ambiente, Las variables también pueden tener un ámbito “global” Empiezan a existir desde su declaración, y Son liberadas con el alcance de un archivo: variables externas Para darle privacidad a una variable Para que no pueda ser vista por otros archivos, Se la declara static, con ámbito global para archivo únicamente