CC Punteros Direccin In direccin Aritmtica de direcciones

  • Slides: 18
Download presentation
C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Índice. n n n Revisando conceptos

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Índice. n n n 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.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Memoria. n n n La memoria

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Memoria. n n n La memoria es un conjunto de celdas contiguas donde se almacenan datos. 1 2 3 4 5 6 7 8 9 A B C D La unidad de memoria más pequeña es el bit. El byte es un conjunto de 8 bits. Unidad de memoria. E F 1 0 1 1 0 0 1 1 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. 171 186 137 99 101010111010 10001001 1100011 Celda: Valor Decimal Celda: Valor Binario Dirección: 0 x. C 100 n Dirección + 3: 0 x. C 103 Dirección +1: 0 x. C 101 Cada celda tiene dos valores asociados: Dirección y Contenido.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Variables n Una variable es una

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Variables n 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. n Declaramos: “int n=1523, m=121; ” n n Valor: 121 n Contenido: n n n Dirección: n n 1523 m 121 &n C 102 &m C 100 0000000 01111001 Dirección: C 100 Valor: 1523 00000101 11110011 Dirección: C 102 Es contenido binario se codifica (bits) de acuerdo al tipo de variable.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. El tipo de variable establece: Tipos

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. El tipo de variable establece: Tipos de Variables n n Rango de valores que maneja. Codificación binaria del dato. Cantidad de memoria requerida. Declaración Bytes Valor en Memoria Hexa Valor en Memoria Binario char c = ‘X’; 1 58 1011000 char w[ ] = “hola”; 4+1 68 6 F 6 C 61 00 01101000 01101111 01101100001 0000 int n[5] = {555, 444, 333, 222, 111} 5 x 2=10 02 2 B 01 BC 01 4 D 00 DE 00 6 F 000000101011 00000001 10111100 00000001 01001101 0000 11011110 0000 01101111 long l[3] = {100, 200, 300} 3 x 4=12 00 00 00 64 00 00 00 C 8 00 00 01 2 C 4 40 49 0 F D 8 n float f = 3. 141592 00000000 01100100 00000000 11001000 000000001 00101100 En todos los casos la dirección de almacenaje es “&variable”. 1000000010010010000111111011000

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros n n n n n

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros n n n n n 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” &n dirección del entero en “n” j contenido=“valor de la dirección”. *j contenido en la dirección de “j”. Representamos “int n=40, *j=&n; ” suponemos que se almacenan: n en la dirección 0 x. A 010 y Lugar: 2 byte donde esta almacenado n Lugar: 2 byte donde esta almacenado j j 0 x. A 010 Dirección: &j 0 x. F 234 j en la dirección 0 x. F 234 Valor *j=n 40 Dirección: j &n 0 x. A 010

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Algebra de punteros n n n

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Algebra de punteros n n n n 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] 40 30 n n 10 j &n[0] 0 x. A 010 *j =40 j++ &n[1] 0 x. A 014 *j =30 j+2 &n[3] 0 x. A 01 C *j =10 Si hacemos j=n; Dirección: 0 x. A 010 Dirección +4 0 x. A 014 *(j+2) n[2] 20 n 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. Dirección + 12 0 x. A 01 C

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros de Punteros n Un puntero

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros de Punteros n Un 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 0 x 3021 p 0 x 4310 &j 0 x 4310 Entonces: *p j 0 x 3021 **p *j 4562 &p 0 x 4 F 02 n Interpretación: n n n n 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)) 4562 *( j ) 4562 n 4562

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros de Punteros Representación gráfica de

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros de Punteros Representación gráfica de doble indirección Lugar: 2 byte donde esta almacenado p int n= 4562; &n 0 x 3021 int *j = &n; &j 0 x 4310 int **p =&j; &p 0 x 4 F 02 p 0 x 4310 Lugar: 2 byte donde esta almacenado j Dirección: &p 0 x 4 F 02 *p=j 0 x 3021 Lugar: 2 byte donde esta almacenado n Dirección: &j=p 0 x 4310 **p=*j=n 4562 *p=j 0 x 3021 p 0 x 4310 **p=*j=n 4562 Dirección: &n=j 0 x 3021

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Uso de Punteros n Ejemplo de

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Uso de Punteros n Ejemplo de un código, asignación y uso de punteros. A p se le asigno la dirección 0 x 14 E A j se le asigno la dirección 0 x 130 A a 1 se le asigno la dirección 0 x 1902 Compilador C (Code. Warrior)

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Uso de Punteros n Como obtiene

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Uso de Punteros n Como obtiene el valor de **p. Toma la dirección de p 0 x 14 E Compilador C (Code. Warrior)

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Uso de Punteros n Sumemos “p

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Uso de Punteros n Sumemos “p += 2; ”. El valor de **p queda. Toma la dirección de p 0 x 14 E Compilador C (Code. Warrior)

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Introducción a Estructuras n n Cuando

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Introducción a Estructuras n n Cuando definimos arreglos agrupamos datos del mismo tipo. “int dni[40], *pv=dni; ” n n Asignará 40 * 2 = 80 bytes contiguos para almacenar los 40 enteros Con pv puedo navegar sobre el arreglo (array). n Si necesito asociar varios tipos de datos de una misma entidad ( Registro) n Ejemplo: Registro de exámenes de un turno: n Acta, Fecha, Materia, Legajo, Nombre, Nota. n Necesito 6 arreglos para los siete tipos de datos. n Cada arreglo esta en posiciones de memorias no vinculadas entre si. n Agregar una entidad implica hacerlo en cada uno y luego rescatar cada dato del lugar y posición adecuadas. n Para introducir el concepto de registro, debemos definir un nuevo tipo de datos (nuestro), que maneje los seis valores “juntos”, asociados y agrupados.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Estructuras n Una definición global puede

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Estructuras n 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

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Estructuras n Una definición más elaborada:

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Estructuras n Una definición más elaborada: n Para usar … n Salida: n n 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

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Estructuras Formas de inicializar.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Estructuras Formas de inicializar. Array de Punteros. Uso de Punteros. Cálculo de tamaños. Salida.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Estructuras n Punteros. Direcciones.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Estructuras n Punteros. Direcciones. Valores. Salida. Más ejemplos.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Funciones. n n n

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Funciones. n n n Sintaxis: <tipo_devuelto>. . . (* nombre_puntero) (<parametros>). . . <tipo_devuelto> es el tipo de vuelto por la función señalada por el puntero, podríamos decir que es el tipo de variable señalada por el puntero en último extremo. Puede ser void. (* nombre_puntero) Esta parte es conocida como núcleo de la declaración. Sin los paréntesis de la declaración, cambia su sentido, ya que es considerada por el compilador como la declaración de una función. <parametros> es la lista de los argumentos aceptados por la función señalada por el puntero.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Funciones. Ejemplos.

C/C++ Punteros. Dirección. In dirección. Aritmética de direcciones. Punteros a Funciones. Ejemplos.