You are on page 1of 18

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

ndice.

Revisando conceptos acerca de la memoria. Las variables en los programas. Punteros y direcciones. Aritmtica de punteros. Estructuras y Uniones. Extendiendo los conceptos a funciones.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Memoria.

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 E F

La unidad de memoria ms pequea es el bit. El byte es un conjunto de 8 bits. Unidad de memoria.


1 0 1 1 0 0 1 1

El lugar (ubicacin) de cada byte es nico y es su direccin. Si los bytes son consecutivos la direccin se ira incrementando secuencialmente. 171 186 137 99
Celda: Valor Decimal 10101011 Celda: Valor Binario Direccin:0xC100 Direccin +1: 0xC101 Direccin + 3: 0xC103 10111010 10001001 1100011

Cada celda tiene dos valores asociados: Direccin y Contenido.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Variables

Una variable es una porcin de memoria identificada por un nombre. El tipo de dato define su representacin binaria y longitud. Tiene tres valores asociados: Nombre, Contenido y Direccin. Declaramos: int n=1523, m=121;
Valor: 121 Valor: 1523 00000101 11110011

Contenido:

n 1523 m 121 &n C102 &m C100

0000000

01111001

Direccin:

Direccin: C100

Direccin: C102

Es contenido binario se codifica (bits) de acuerdo al tipo de variable.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Tipos de Variables

El tipo de variable establece: Rango de valores que maneja. Codificacin binaria del dato. Cantidad de memoria requerida.
Bytes
1 4+1 5x2=10

Declaracin
char c = X; char w[ ] = hola; int n[5] = {555,444,333,222,111}

Valor en Memoria Hexa


58 68 6F 6C 61 00 02 2B 01 BC 01 4D 00 DE 00 6F

Valor en Memoria Binario


1011000 01101000 01101111 01101100 01100001 00000000 00000010 00101011 00000001 10111100 00000001 01001101 00000000 11011110 00000000 01101111 00000000 00000000 00000000 01100100 00000000 00000000 00000000 11001000 00000000 00000000 00000001 00101100 1000000010010010000111111011000

long l[3] = {100,200,300}

3x4=12

00 00 00 64 00 00 00 C8 00 00 01 2C

float f = 3.141592

40 49 0F D8

En todos los casos la direccin de almacenaje es &variable.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Punteros

Un puntero es una variable cuyo contenido es una direccin. Como todas las variable tiene nombre, contenido y direccin. Un puntero apunta a: un dato, un array, un objeto, una funcin, etc. int n; declara una variable entera (16 bits / 2 bytes) int *j; declara un puntero tipo entero (solo almacena direcciones). j contiene una direccin donde comienza un entero. *j valor entero almacenado en la direccin apuntada por j (indireccin). n contenido=valor del entero &n direccin del entero en n j contenido=valor de la direccin. *j contenido en la direccin de j.
j en la direccin 0xF234
Lugar: 2 byte donde esta almacenado n j0xA010 Valor *j=n 40

Representamos int n=40, *j=&n; suponemos que se almacenan:

n en la direccin 0xA010 y
Lugar: 2 byte donde esta almacenado j

Direccin: &j0xF234

Direccin: j &n 0xA010

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

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;
Direccin: 0xA010 Direccin +4 0xA014 Direccin + 12 0xA01C 40 30 20 10

*(j+2) n[2] 20

Valor apuntado por j ms 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.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Punteros de Punteros

Un puntero puede almacenar una direccin 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 p 0x4310 &j 0x4310 Entonces: *p j 0x3021 **p *j 4562 &p 0x4F02

Interpretacin:

Con el valor de p obtiene la direccin de j: *p &j Con el valor de j obtiene la direccin 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. Direccin. In direccin. Aritmtica de direcciones.

Punteros de Punteros
Representacin grfica de doble indireccin
int n= 4562;
Lugar: 2 byte donde esta almacenado p

&n 0x3021 &j 0x4310 &p 0x4F02

int *j = &n; int **p =&j;


p0x4310

Lugar: 2 byte donde esta almacenado j


Direccin: &p0x4F02 *p=j 0x3021

Lugar: 2 byte donde esta almacenado n


Direccin: &j=p0x4310

**p=*j=n 4562

**p=*j=n *p=j p

4562 0x3021 0x4310


Direccin: &n=j0x3021

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Uso de Punteros

Ejemplo de un cdigo, asignacin y uso de punteros.


A p se le asigno la direccin 0x14E

A j se le asigno la direccin 0x130

A a1 se le asigno la direccin 0x1902

Compilador C (CodeWarrior)

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Uso de Punteros

Como obtiene el valor de **p.


Toma la direccin de p 0x14E

Compilador C (CodeWarrior)

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Uso de Punteros

Sumemos p += 2;. El valor de **p queda.


Toma la direccin de p 0x14E

Compilador C (CodeWarrior)

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Introduccin a Estructuras

Cuando 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 exmenes 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 posicin adecuadas. 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. Direccin. In direccin. Aritmtica de direcciones.

Estructuras

Una definicin 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. Direccin. In direccin. Aritmtica de direcciones.

Estructuras

Una definicin ms 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

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Punteros a Estructuras
Formas de inicializar. Array de Punteros.

Uso de Punteros.

Clculo de tamaos.

Salida.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Punteros a Punteros a Estructuras

Ms ejemplos.

Punteros.

Direcciones.

Valores.

Salida.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Punteros a Funciones.

Sintaxis: <tipo_devuelto> ... (* nombre_puntero) (<parametros>) ... <tipo_devuelto> es el tipo de vuelto por la funcin sealada por el puntero, podramos decir que es el tipo de variable sealada por el puntero en ltimo extremo. Puede ser void. (* nombre_puntero) Esta parte es conocida como ncleo de la declaracin. Sin los parntesis de la declaracin, cambia su sentido, ya que es considerada por el compilador como la declaracin de una funcin. <parametros> es la lista de los argumentos aceptados por la funcin sealada por el puntero.

C/C++

Punteros. Direccin. In direccin. Aritmtica de direcciones.

Punteros a Funciones. Ejemplos.