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 OperadorUso &object Retorna la dirección de object (dirección de) *ptr Retorna 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; 0x3A28 normal 10 0x3F3A ptr 15 0x3A28 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;
Ejemplo double v[] = {2.5, 5.0, 7.5, 10.0}; double* pd = NULL; pd = v; 0xF150 pd ‘\0’ 0xF012 0xE412 v 0xF xF0120xF01A0xF0220xF02A
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++; } 0xF150 pd 0xF012 0xE412 v 0xF xF0120xF01A0xF0220xF02A 0xA124 i 0 10xF01A xF02220xF02A30xF0324
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; 0xF150 pd 0xF012 0xE412 v 0xF xF0120xF01A0xF0220xF02A 0xA124 i
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; 0xF150 pd 0xF012 0xE412 v 0xF xF0120xF01A0xF0220xF02A 0xA124 i
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?