programación iii

14

Click here to load reader

Upload: bradley-jarvis

Post on 13-Mar-2016

44 views

Category:

Documents


1 download

DESCRIPTION

Programación III. Clase 09 Apuntadores. Declaración de Punteros. Declaración: type* id; Ejemplo: int* ptr; ptr contendrá entonces una dirección a un entero. Operadores con Punteros. 0x3A28. 0x3F3A. normal. ptr. 10. Ejemplo de Operadores. int normal = 10; int* ptr; ptr = &normal; - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Programación III

Programación III

Clase 09Apuntadores

Page 2: Programación III

Declaración de Punteros

• Declaración:type* id;

• Ejemplo:int* ptr;

• ptr contendrá entonces una dirección a un entero.

Page 3: Programación III

Operadores con Punteros

Operador Uso

&objectRetorna la dirección de object(dirección de)

*ptrRetorna a lo que apunta ptr(indirección)

Page 4: Programación III

Ejemplo de Operadores

int normal = 10;int* ptr;ptr = &normal;*ptr = 15;cout<<ptr<<endl;cout<<normal<<endl;

0x3A28normal

10

0x3F3Aptr

15

0x3A28

0x3A2815

Page 5: Programación III

Retomando Arreglos

• En la siguiente declaración:int ar[4];

• ¿Cuál será el tipo de ar?• Por lo tanto se podría hacer:

int* p = NULL;p = ar;

Page 6: Programación III

Ejemplo

double v[] = {2.5, 5.0, 7.5, 10.0};double* pd = NULL;pd = v;

0xF150pd

‘\0’0xF012

0xE412v

0xF012 2.5 10.07.55.0

0xF012 0xF01A 0xF022 0xF02A

Page 7: Programación III

Aritmética de Punterosdouble v[] = {2.5, 5.0, 7.5, 10.0};double* pd = v;for (int i=0; i<4; i++){cout << *pd << endl;pd++;

}

0xF150pd

0xF012

0xE412v

0xF012 2.5 10.07.55.0

0xF012 0xF01A 0xF022 0xF02A

0xA124i

010xF01A

2.5

5.0

7.5

10.0

0xF022 20xF02A 30xF032 4

Page 8: Programación III

Aritmética de Punteros (cont)

• Cuando a un double* se le suma 1, no se le suma 1 a la dirección, sino que avanza una casilla de double completa (8 bytes).

• Es por esta razón que pd que vale 0xF012 inicialmente al operar pd++ su valor es de 0xF01A. (Ojo la suma es hexadecimal)

• Ahora bien, en el ejemplo anterior: ¡pd quedó apuntando afuera del arreglo!

Page 9: Programación III

Aritmética de Punteros (cont)double v[] = {2.5, 5.0, 7.5, 10.0};double* pd = v;for (int i=0; i<4; i++)cout << *(pd+i) << endl;

0xF150pd

0xF012

0xE412v

0xF012 2.5 10.07.55.0

0xF012 0xF01A 0xF022 0xF02A

0xA124i

01

2.5

5.0

7.5

10.0

234

Page 10: Programación III

Aritmética de Punteros (cont)

• Al cambiar la instrucción de pd++, por *(pd+i) se logra imprimir todos los elementos del arreglo utilizando aritmética de punteros, pero esta vez sin cambiar pd en el proceso.

Page 11: Programación III

Aritmética de Punteros (cont)double v[] = {2.5, 5.0, 7.5, 10.0};double* pd = v;for (int i=0; i<4; i++)cout << pd[i] << endl;

0xF150pd

0xF012

0xE412v

0xF012 2.5 10.07.55.0

0xF012 0xF01A 0xF022 0xF02A

0xA124i

01

2.5

5.0

7.5

10.0

234

Page 12: Programación III

Aritmética de Punteros (cont)

• CONCLUSIÓN:

][)(* ipdipd • Esta es la manera en que el compilador

interpreta el operador de subíndice de arreglos.

Page 13: Programación III

Ahora con Matrices• Por ejemplo:int m[2][3] = {{1,3,5},{2,4,6}};

• ¿Cuál es el tipo de m?• ¿Cuál es el tipo de m[0]?• ¿Cuál es el tipo de m[0][0]?• Entonces se podría:

int** p = m; int* t = m[0];//Algunos compiladores requieren conversión.

Page 14: Programación III

Con Matrices…

int m[2][3] = {{1,3,5},{2,4,6}};int* p = m[0];for (int i=0; i<6; i++)cout << p[i] << endl;

¿Cuál será la salida de este segmento de código?