1 Índice. Revisando conceptos acerca de la memoria.Las variables en los programas. Punteros y direcciones. Aritmética de punteros. Estructuras y Uniones. Extendiendo los conceptos a funciones.
2 Memoria. La memoria es un conjunto de celdas contiguas donde se almacenan datos. La unidad de memoria más pequeña es el bit. El byte es un conjunto de 8 bits. Unidad de memoria. El lugar (ubicación) de cada byte es único y es su dirección. Si los bytes son consecutivos la dirección se ira incrementando secuencialmente. Cada celda tiene dos valores asociados: Dirección y Contenido. 1 2 3 4 5 6 7 8 9 A B C D E F 1 171 186 137 99 Celda: Valor Decimal Celda: Valor Binario Dirección:0xC100 Dirección + 3: 0xC103 Dirección +1: 0xC101
3 Variables Una variable es una porción de memoria identificada por un nombre. El tipo de dato define su representación binaria y longitud. Tiene tres valores asociados: Nombre, Contenido y Dirección. Declaramos: “int n=1523, m=121;” Contenido: n 1523 m 121 Dirección: &n C102 &m C100 Es contenido binario se codifica (bits) de acuerdo al tipo de variable. Valor: 121 Valor: 1523 Dirección: C100 Dirección: C102
4 Tipos de Variables El tipo de variable establece:Rango de valores que maneja. Codificación binaria del dato. Cantidad de memoria requerida. En todos los casos la dirección de almacenaje es “&variable”. Declaración Bytes Valor en Memoria Hexa Valor en Memoria Binario char c = ‘X’; 1 58 char w[ ] = “hola”; 4+1 68 6F 6C 61 00 int n[5] = {555,444,333,222,111} 5x2=10 02 2B 01 BC 01 4D 00 DE 00 6F long l[3] = {100,200,300} 3x4=12 C C float f = 4 F D8
5 Punteros Un puntero es una variable cuyo contenido es una dirección.Como todas las variable tiene nombre, contenido y dirección. Un puntero “apunta a”: un dato, un array, un objeto, una función, etc. “int n;” declara una variable entera (16 bits / 2 bytes) “int *j;” declara un puntero tipo entero (solo almacena direcciones). “j” contiene una dirección donde comienza un entero. “*j” valor entero almacenado en la dirección apuntada por “j” (indirección). n contenido=“valor del entero” j contenido=“valor de la dirección”. &n dirección del entero en “n” *j contenido en la dirección de “j”. Representamos “int n=40, *j=&n;” suponemos que se almacenan: n en la dirección 0xA010 y j en la dirección 0xF234 Lugar: 2 byte donde esta almacenado n Lugar: 2 byte donde esta almacenado j j0xA010 Valor *j=n 40 Dirección: &j0xF234 Dirección: j &n 0xA010
6 Algebra de punteros Los punteros se usan como cualquier otra variable.Su comportamiento es de acuerdo al tipo definido. “long n[ ]={40,30,20,10}, *j=n;” j se inicializa con &n[0] j &n[0] 0xA010 *j =40 j++ &n[1] 0xA014 *j =30 j+2 &n[3] 0xA01C *j =10 Si hacemos j=n; *(j+2) n[2] 20 Valor apuntado por j más 2 posiciones Como j es tipo long incrementará 8 (4*2) bytes El incremento depende del tipo. j Tiene un lugar de memoria para su contenido. j esta almacenada en &j, ocupa 8/16/32/64 bits de acuerdo al micro. 40 30 20 10 Dirección: 0xA010 Dirección +4 0xA014 Dirección + 12 0xA01C
7 Punteros de Punteros n 4562Un puntero puede almacenar una dirección de otro puntero. El valor final apuntado puede obtenerse en forma directa. “int n, *j, **p”; hacemos “n=4562”; “j=&n”; “p=&j”; Supongamos que: &n 0x3021 &j 0x Entonces: &p 0x4F02 Interpretación: Con el valor de p obtiene la dirección de j: *p &j Con el valor de j obtiene la dirección de n: *j &n Con el tipo de p interpreta el valor de n. Esta es la secuencia de **p p 0x4310 *p j 0x3021 **p *j 4562 *(*(p)) 4562 *( j ) 4562 n 4562
8 Punteros de Punteros Representación gráfica de doble indirecciónint n= 4562; &n 0x3021 int *j = &n; &j 0x4310 int **p =&j; &p 0x4F02 Lugar: 2 byte donde esta almacenado p p0x4310 Lugar: 2 byte donde esta almacenado j Dirección: &p0x4F02 *p=j 0x3021 Lugar: 2 byte donde esta almacenado n Dirección: &j=p0x4310 **p=*j=n 4562 **p=*j=n 4562 *p=j 0x3021 p 0x4310 Dirección: &n=j0x3021
9 Uso de Punteros Ejemplo de un código, asignación y uso de punteros.A p se le asigno la dirección 0x14E A j se le asigno la dirección 0x130 A a1 se le asigno la dirección 0x1902 Compilador C (CodeWarrior)
10 Uso de Punteros Como obtiene el valor de **p.Toma la dirección de p 0x14E Compilador C (CodeWarrior)
11 Uso de Punteros Sumemos “p += 2;”. El valor de **p queda.Toma la dirección de p 0x14E Compilador C (CodeWarrior)
12 Introducción a EstructurasCuando definimos arreglos agrupamos datos del mismo tipo. “int dni[40], *pv=dni;” Asignará 40 * 2 = 80 bytes contiguos para almacenar los 40 enteros Con pv puedo navegar sobre el arreglo (array). Si necesito asociar varios tipos de datos de una misma entidad (Registro) Ejemplo: Registro de exámenes de un turno: Acta, Fecha, Materia, Legajo, Nombre, Nota. Necesito 6 arreglos para los siete tipos de datos. Cada arreglo esta en posiciones de memorias no vinculadas entre si. Agregar una entidad implica hacerlo en cada uno y luego rescatar cada dato del lugar y posición adecuadas. Para introducir el concepto de registro, debemos definir un nuevo tipo de datos (nuestro), que maneje los seis valores “juntos”, asociados y agrupados.
13 Estructuras Una definición global puede ser: Nombre de la estructura.Lista de campos miembros. Lista de variables. Referencia a campos miembros. Array de estructuras. Compilador C++ Microsoft 9.0
14 Compilador C++ Microsoft 9.0Estructuras Una definición más elaborada: Para usar … Salida: Acta: 123 Codigo de Materia: 43 Fecha:14/09/2009 A-1613/8 Apellido, Nombre calle, nro, piso, ... Nota:8.25 Compilador C++ Microsoft 9.0
15 Punteros a EstructurasFormas de inicializar. Array de Punteros. Uso de Punteros. Cálculo de tamaños. Salida.
16 Punteros a Punteros a EstructurasMás ejemplos. Punteros. Direcciones. Valores. Salida.
17 Punteros a Funciones. Sintaxis:
18 Punteros a Funciones. Ejemplos.