1 / 14

Programación III

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;

Télécharger la présentation

Programación III

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programación III Clase 09 Apuntadores

  2. Declaración de Punteros • Declaración: type* id; • Ejemplo: int* ptr; • ptr contendrá entonces una dirección a un entero.

  3. Operadores con Punteros

  4. 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

  5. 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;

  6. 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

  7. 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

  8. 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!

  9. 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

  10. 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.

  11. 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

  12. Aritmética de Punteros (cont) • CONCLUSIÓN: • Esta es la manera en que el compilador interpreta el operador de subíndice de arreglos.

  13. 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.

  14. 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?

More Related