Download - Programación III
Programación III
Clase 09Apuntadores
Declaración de Punteros
• Declaración:type* id;
• Ejemplo:int* ptr;
• ptr contendrá entonces una dirección a un entero.
Operadores con Punteros
Operador Uso
&objectRetorna la dirección de object(dirección de)
*ptrRetorna a lo que apunta ptr(indirección)
Ejemplo de Operadores
int normal = 10;int* ptr;ptr = &normal;*ptr = 15;cout<<ptr<<endl;cout<<normal<<endl;
0x3A28normal
10
0x3F3Aptr
15
0x3A28
0x3A2815
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;
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
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
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!
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
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.
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
Aritmética de Punteros (cont)
• CONCLUSIÓN:
][)(* ipdipd • Esta es la manera en que el compilador
interpreta el operador de subíndice de arreglos.
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.
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?