160 likes | 376 Views
Computación II. Capitulo VII Punteros. Presentación de la unidad. Objetivos: Ser capaces de utilizar punteros. Comprender las relaciones entre punteros, arreglos y cadenas. Comprender la utilización de punteros a funciones. Ser capaces de declarar y utilizar arreglos de cadenas.
E N D
Computación II Capitulo VII Punteros
Presentación de la unidad • Objetivos: • Ser capaces de utilizar punteros. • Comprender las relaciones entre punteros, arreglos y cadenas. • Comprender la utilización de punteros a funciones. • Ser capaces de declarar y utilizar arreglos de cadenas.
Presentación de la unidad • Contenidos: • Concepto de punteros; declaración e inicialización. • Operadores de punteros. • Relaciones entre punteros y arreglos. • Aritmética de punteros. • Arreglos de punteros. • Punteros a funciones. • Punteros a estructuras.
Concepto de puntero; declaración e inicialización • Los punteros son variables que contienen direcciones de memoria como sus valores. • Sintaxis: <tipo_de_dato>* <nombre_puntero>; • El tipo de dato de una variable de tipo puntero se corresponde con el tipo de dato de la variable a la que apunta. • Los punteros pueden ser inicializados cuando son declarados o en un enunciado de asignación. • Pueden ser inicializados a 0, NULL o a una dirección; un puntero con un valor NULL apunta a nada.
Concepto de puntero; declaración e inicialización • Inicialización • Estática: • Asignar una dirección de memoria a un puntero utilizando el operador de dirección (&). • Ejemplo: int x = 0; int *xPtr = &x; • Dinámica: • Asignación dinámica de memoria. Se utiliza el operador new(), de reserva de memoria; y el operador delete(), para la liberación de la memoria reservada. xPtr x 0
Operadores de punteros • &: operador de dirección; regresa la dirección de su operando. • *: operador de indirección; regresa el valor del objeto hacia el cual se apunta. • Ejemplo: int x = 7; int *xPtr = &x; cout<<"x="<<x<<endl; cout<<"xPtr="<<xPtr<<endl; cout<<"*xPtr="<<*xPtr<<endl;
Operadores de punteros • Representación en memoria: 500000 600000 xPtr x 600000 7 xPtr x 7
Operadores de punteros • Un puntero puede apuntar a otra variable de tipo puntero. • Ejemplo: int x = 7; int *xPtr = &x; int **xPtr1 = *xPtr; cout<<"x="<<x<<endl; cout<<"xPtr="<<xPtr<<endl; cout<<"*xPtr="<<*xPtr<<endl; cout<<"**xPtr="<<**xPtr<<endl; • Este concepto se utiliza para problemas largos y complejos.
Relaciones entre punteros y arreglos • Los punteros y los arreglos están relacionados y pueden ser utilizados “casi” en forma indistinta. • El nombre de un arreglo (sin subíndice) puede ser considerado un puntero constante. int y[4]={0,5,7,15}; int *yPtr; yPtr = y yPtr =&y[0] • El elemento del arreglo y[3] puede ser referenciado de las siguientes formas: • Notación puntero/desplazamiento: y[3] == *(yPtr + 3) ; // 3 es el desplazamiento del puntero y[3] == *(y + 3) ; • Notación puntero /subíndice: y[3] == yPtr[1];
Aritmética de punteros • Los punteros son operandos validos en expresiones aritméticas, en expresiones de asignación y de comparación. • Operaciones validas: • Incremento (++) • Decremento(--) • Añadir un entero a un puntero (+ ó +=) • Restar un entero a un puntero (+ ó +=) • Un puntero puede ser sustraído o restado a otro.
Aritmética de punteros • Ejemplo para una maquina con enteros de 4 bytes. int v[4]; int *vPtr = &v[0]; Posiciones en memoria: 3000 3004 3008 3012 vPtr
Aritmética de punteros • Cuando se añade o se resta un entero al puntero, el puntero se incrementa o decrementa el valor de dicho entero multiplicado por el tamaño del objeto al cual apunta. vPtr+=2 (3000+2*4) = 3008 • Las variables de tipo puntero pueden ser restadas la una a la otra: int V[4]; int *vPtr = v; int *vPtr1 = &v[2]; x = vPtr1 – vPtr; X es el numero de elementos del arreglo v, desde vPtr hasta vPtr1; en este caso 2;
Arreglo de punteros • Los arreglos pueden contener punteros, por ejemplo, cadena de caracteres. • Cada entrada en el arreglo es una cadena; en C++ una cadena es de hecho un puntero al primer elemento. char *suit[4]={“Corazones”, “Diamantes”,”Espadas”,”Treboles”};
Punteros a funciones • Un puntero a función contiene la dirección de la función en memoria. • Sintaxis: tipo_de_retorno (*puntero_funcion) (<lista_de_parametros>) • Los punteros a funciones pueden ser pasados a funciones, regresados a funciones, almacenados en arreglos y asignados a otros punteros. • Ejemplo: La función ordenamientoBurbuja ha sido modificada para que reciba un puntero a la función ascendente o descendente como argumento. El programa solicita al usuario que elija como va ser ordenado el arreglo. void swap(int *, int *); int ascendente(const int, const int); int descendente(const int, const int); void ordenamientoBurbuja(int *, int , int (*)(int, int));
Puntero a estructuras • Se puede declarar un puntero a una estructura tal y como se declara un puntero a otro objeto. • Cuando se referencia una estructura utilizando un puntero se utiliza el operador flecha ->, para acceder a un miembro de ella. • Ejemplo: struct fecha{ int dia, mes, anyo; }; struct datos{ char *nombre; struct fecha *fec; } ; struct datos dato; dato.nombre =“Carolina”; dato.fec->dia = 2; dato.fec->mes=10; dato.fec->anyo = 2008;