leccion 20

Embed Size (px)

Citation preview

MIGUEL . TOLEDO MARTNEZ

CONTENIDO DE LA LECCIN 20APUNTADORES Y CADENAS1. Introduccin 2. Declaracin e iniciacin de variables de apuntador 3. Operadores de los apuntadores3.1. Ejemplo 20.1

3 37 46

4. Llamado de funciones por referencia4.1. Ejemplo 20.2

67

5. Empleo del calificador const con apuntadores5.1. Ejemplo 2 20.3, 20.4, 20.5, 20.6, 20.7

1011

6. Ordenamiento de burbuja mediante llamada por referencia6.1. Ejemplos 20.8, 20.9, 20.10

1515

7. Expresiones de apuntadores y aritmtica de apuntadores 8. Relacin entre apuntadores y arreglos8.1. Ejemplos 20.11, 20.12

18 2122

9. Arreglos de apuntadores 10. Caso de estudio: Simulacin de barajado y reparticin de naipes10.1. Ejemplo 20.13

24 2528

11. Apuntadores y funciones11.1. Ejemplos 20.14, 20.15

2929

12. Introduccin al procesamiento de caracteres y cadenas12.1. Fundamentos de los caracteres y las cadenas 12.2. Funciones de manipulacin de cadenas de la biblioteca de manejo de cadenas12.2.1. Ejemplo 20.16, 20.17, 20.18, 20.19, 20.20

3333 3436

12.3. Ejercicios resueltos 12.4. Funciones de cadena que utilizan cadenas ubicadas fuera de los 64 kb (far string) 12.5. Nmero de ocurrencias de un carcter dentro de una cadena 12.6. Contar el nmero de ocurrencia de una subcadena dentro de una cadena 12.7. Obtener un ndice a una subcadena 12.8. Obtener la ocurrencia mas a la derecha de una subcadena 12.9. Remover una subcadena contenida dentro de una cadena 12.10. Reemplazo de una subcadena por otra 12.11. Determinar si un carcter es alfanumrico 12.12. Determinar si un carcter es una letra del alfabeto 12.13. Determinar si un carcter contiene un valor ASCII 12.14. Determinar si un carcter es un carcter de control 12.15. Determinar si un carcter es un digito 12.16. Determinar si un carcter es un carcter grfico 12.17. Determinar si un carcter es mayscula o minscula 12.18. Determinar si un carcter es imprimible 12.19. Determinar si un carcter es un smbolo de puntuacin 12.20. Determinar si un carcter es el carcter espacio 12.21. Determinar si un carcter es un valor hexadecimal 12.22. Carcter ASCII vlido

40 47 47 53 54 54 54 55 56 56 56 56 56 57 57 57 57 58 58 59

13. Pensando en objetos: Iteraciones entre los objetos 14. Errores comunes de programacin 15. Buenas prcticas de programacin 16. Propuestas de desempeoAPUNTADORES Y CADENA LECCIN 20

64 65 66 6720-1

MIGUEL . TOLEDO MARTNEZ

17. Sugerencias de portabilidad 18. Observaciones de Ingeniera de Software 19. Indicaciones de prueba y depuracin 20. Lo que necesita saber 21. Preguntas y problemas21.1. Preguntas 21.2. Problemas21.2.1. 21.2.2. 21.2.3. 21.2.4. 21.2.5. Seccin especial: construya su propia computadora Ms problemas de apuntadores Problemas de manipulacin de cadenas Seccin especial: manipulacin avanzada de cadenas Interesante proyecto de manipulacin de cadenas

67 67 67 68 7070 7375 79 84 85 88

APUNTADORES Y CADENA LECCIN 20

20-2

MIGUEL . TOLEDO MARTNEZ

LECCIN 20APUNTADORES Y CADENASINTRODUCCIN En esta leccin se estudiar una de las caractersticas ms poderosas del lenguaje de programacin C++: el apuntador. Los apuntadores son una de las capacidades de C++ ms difciles de dominar. En otra leccin vimos que las referencias pueden servir para hacer llamadas por referencia. Los apuntadores permiten a los programas simular la llamada por referencia y crear y manipular estructuras dinmicas de datos, es decir, estructuras de datos que pueden crecer y encogerse, como las listas vinculadas, colas, pilas y rboles. Esta leccin explica los conceptos bsicos acerca de los apuntadores. Tambin refuerza la relacin ntima entre los arreglos, los apuntadores y las cadenas e incluye un amplio conjunto de ejemplos de procesamiento de cadenas. En otro semestre se estudiarn el empleo de los apuntadores con estructuras. La programacin orientada a objetos se efecta con apuntadores y referencias. En ese semestre se presentan tcnicas de administracin dinmica de memoria y ejemplos de creacin y uso de estructuras dinmicas de datos. El enfoque de los arreglos y cadenas como apuntadores se deriva de C. En la especialidad de computacin se estudiarn los arreglos y las cadenas como objetos en toda forma.Los objetivos de esta leccin son: Aprender a utilizar los apuntadores. Emplear los apuntadores para pasar argumentos a las funciones mediante llamada por referencia. Entender la estrecha relacin entre los apuntadores, los arreglos y las cadenas. Comprender la utilidad de los apuntadores a funciones. Declarar y utilizar arreglos de cadenas. Asignar caracteres a una cadena de caracteres. Comprender la importancia del carcter NULL. Inicializar cadena de caracteres. Pasar cadena de caracteres a una funcin. Utilizar las funciones de las libreras en tiempo de ejecucin para manejar cadenas de caracteres.

DECLARACIN E INICIACIN DE VARIABLES DE APUNTADOR Las variables de apuntador contienen direcciones de memoria como sus valores. Normalmente las variables contienen valores especficos. Por otra parte, los apuntadores contienen direcciones de variables que contienen valores especficos. En este sentido, los nombres de variables hacen referencia directa a un valor y los apuntadores hacen referencia indirecta a un valor (figura 20.1) La referencia a un valor a travs de un apuntador se llama indireccin.

APUNTADORES Y CADENA LECCIN 20

20-3

MIGUEL . TOLEDO MARTNEZ

contador 7 contadorPtr contador 7 contadorPtr hace referencia indirecta a una variable cuyo valor es 7. contador hace referencia directa a una variable cuyo valor es 7

Figura 20.1. Referencias directa e indirecta a una variable

Los apuntadores, como cualquier otra variable, se deben declarar antes de utilizarlos. La declaracin:int *contadorPtr, contador;

declara la variable contadorPtr como de tipo int * (es decir, como un apuntador a un valor entero) y se lee contadorPtr es un apuntador a int o contadorPtr apunta a un objeto de clase entero. Adems, la variable contador se declara como entero, no como apuntador a un entero. En esta declaracin, el * solamente se aplica a contadorPtr. Cada variable que se declara como apuntador debe ir precedida por un asterisco (*) Por ejemplo, la declaracin:float *xPtr, *yPtr;

indica que tanto xPtr como yPtr son apuntadores a valores float. El uso de * en una declaracin de esta manera indica que la variable que se est declarando es un apuntador. Los apuntadores pueden declararse para que apunten a objetos de cualquier clase de datos. Los apuntadores se deben inicializar, ya sea al declararlos o mediante una instruccin de asignacin. Un apuntador puede inicializarse a 0, a NULL o a una direccin. Un apuntador con el valor 0 o NULL no apunta a nada. NULL es una constante simblica definida en el archivo de encabezado (y en varios archivos de encabezado de la biblioteca estndar) La iniciacin a NULL de un apuntador es equivalente a inicializarlo a 0, pero en C++ se prefiere 0. Cuando se asigna 0, se convierte en un apuntador del tipo adecuado. El valor 0 es el nico valor entero que puede asignarse directamente a una variable de apuntador sin convertir primero mediante cast el entero a un tipo de apuntador. En la siguiente seccin se estudia la asignacin de la direccin de una variable a un apuntador. OPERADORES DE LOS APUNTADORES El &, u operador de direccin, es un aperador unario que devuelve la direccin de su operando. Por ejemplo, suponiendo las declaraciones:int y = 5; int *yPtr;

la instruccinyPtr = &y;

APUNTADORES Y CADENA LECCIN 20

20-4

MIGUEL . TOLEDO MARTNEZ

asigna la direccin de la variable y a la variable de apuntador yPtr. Se dice entonces que la variable yPtr apunta a y. La figura 20.2 muestra una representacin esquemtica de la memoria tras la ejecucin de la asignacin previa. En la figura mostramos la relacin de apuntador dibujando una flecha del apuntador hacia el objeto al que apunta. y 5 yPtr Figura 20.2. Representacin grfica de un apuntador que apunta a una variable entera en la memoria

La figura 20.3 muestra la representacin del apuntador en la memoria, suponiendo que la variable entera y est almacenada en la localidad 600000 y que la variable de apuntador yPtr est almacenada en la localidad 500000. El operando del operador de direccin debe ser un lvalue (left value) (es decir, algo a lo que puede asignarse un valor, como un nombre de variable); el operador de direccin no puede aplicarse a constantes, a expresiones que no den como resultado referencias, ni a variables declaradas con la clase de almacenamiento register. yPtr 500000 600000 600000 y 5

El operador *, conocido comnmente como operador de indireccin u operador de desreferenciacin, devuelve un sinnimo, alias o apodo del objeto hacia el que apunta su operando (es decir, su apuntador) Por ejemplo (haciendo referencia a la figura 20.2), la instruccin:cout