140 likes | 273 Views
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;
E N D
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.
0x3A28 0x3F3A normal ptr 10 Ejemplo de Operadores int normal = 10; int* ptr; ptr = &normal; *ptr = 15; cout<<ptr<<endl; cout<<normal<<endl; 0x3A28 0x3A28 15 15
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;
0xF150 0xE412 0xF012 0xF01A 0xF022 0xF02A pd v 2.5 5.0 7.5 10.0 0xF012 ‘\0’ Ejemplo double v[] = {2.5, 5.0, 7.5, 10.0}; double* pd = NULL; pd = v; 0xF012
0xF150 0xE412 0xA124 pd v i 0xF012 0xF012 0 Aritmética de Punteros double v[] = {2.5, 5.0, 7.5, 10.0}; double* pd = v; for (int i=0; i<4; i++){ cout << *pd << endl; pd++; } 0xF012 0xF01A 0xF022 0xF02A 2.5 5.0 7.5 10.0 2.5 5.0 7.5 10.0 0xF032 0xF01A 0xF022 0xF02A 1 2 3 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!
0xF150 0xE412 0xA124 pd v i 0xF012 0xF012 0 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; 0xF012 0xF01A 0xF022 0xF02A 2.5 5.0 7.5 10.0 2.5 5.0 7.5 10.0 3 1 2 4
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.
0xF150 0xE412 0xA124 pd v i 0xF012 0xF012 0 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; 0xF012 0xF01A 0xF022 0xF02A 2.5 5.0 7.5 10.0 2.5 5.0 7.5 10.0 3 1 2 4
Aritmética de Punteros (cont) • CONCLUSIÓN: • 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?