Republica Bolivariana de Venezuela Ministerio de Educación y Deporte Colegio Universitario Francisco de Miranda Programación Trabajo de Programación: Punteros
Integrantes: Contreras Jonathan Zerpa Gabriel
Caracas
Resumen
Los punteros son de amplia utilización en programación y casi todos los lenguajes permiten la manipulación de los mismos. La razón de ser principal de los punteros reside en manejar datos alojados en la zona de memoria dinámica o heap (aunque también se pueden manipular objetos en la zona estática), bien sean datos elementales, estructuras (struct en C) u objetos pertenecientes a una clase (en lenguajes Orientados a Objetos). Gracias a esta propiedad, los punteros permiten modelar un grafo, en donde los elementos de éste son los datos residentes en memoria y las relaciones entre los elementos son los propios apuntadores. Sin embargo, los punteros son un gran dolor de cabeza para los programadores novatos y para cualquier programador que deba depurar una aplicación. En nuevos lenguajes de alto nivel, los punteros se han tratado de abstraer. De tal forma que en el lenguaje C# sólo pueden ser usados en zonas de código delimitadas como "inseguras", o llegando a su total desaparición en lenguajes como Java o Eiffel. Un puntero o apuntador es una variable que referencia una región de memoria; en otras palabras es una variable cuyo valor es una dirección de memoria. Si se tiene una variable ' p ' de tipo puntero que contiene una dirección de memoria en la que se encuentra almacenado un valor ' v ' se dice que ' p ' apunta a ' v '. Trabajar con punteros implica la no manipulación de las variables en sí, sino manejar direcciones de memoria en la cuales residen los datos. El ejemplo: Que sigue es propio del lenguaje C/C++ y no es de aplicación en otros lenguajes de programación: struct Elemento // Ejemplo de un nodo de lista doble enlazada { int dato;
struct Elemento *siguiente; // Para la declaración de un puntero se usa '*' struct Elemento *anterior; }; Para acceder a los atributos como punteros de una estructura que va a ser tratada como tal, se debe desreferenciar el puntero y acceder a sus miembros como se haría con una variable normal, o usar directamente el operador: ->. De tal modo que: Elemento *elem; Elemento sig1 = (*elem).siguiente; Elemento sig2 = elem->siguiente; /* Se cumple que: sig1==sig2 */ Otro ejemplo en C++ void swap(int *x, int *y) { int temp; temp = *x; // copia el valor apuntado por x a temp *x = *y;
// copia el valor apuntado por y en la ubicación del puntero x
*y = temp; // copia el valor de temp en la ubicación apuntada por y } Ejemplo en C# //Suma de dos números enteros private unsafe int Suma(int* a, int* b) { return *a + *b; } // Su uso (El método llamador también debe tener la palabra clave 'unsafe'): // int x, y; // int *ptr1 = &x; // int *ptr2 = &y; // Suma(ptr1, ptr2);