IntroducciónEl puntero es una técnica muy potente que hace que la programaciónC++ sea tan utilizada. La técnica de punteros apoya a la programaciónorientada a objetos, que es una de las grandes diferencias entre C y C++.Definición: Un puntero es una variable que almacena una dirección dememoria
PUNTERO
Diapositiva 2
Permiten simular el paso por referencia, crear y manipular estructuras
dinamicas de datos, tales como listas enlazadas, pilas, colas y árboles.
Generalmente las variables contienen valores especificos. Los punteros
son variables pero en vez de contener un valor especifico, contienen las
direcciones de las variables a las que apuntan. Para obtener o
modificar el valor de la variable a la que apuntan se utiliza el
operador de indirección. Los punteros, al ser variables deben ser
declaradas como punteros antes de ser utilizadas.
Caracteristica:
Diapositiva 3
Aplicacion
C++ no inicializa los punteros cuando se declaran y es necesario inicializarlos antes depoder utilizarlos. Para asignar una dirección de memoria a un puntero se utiliza el operadorde referencia (&). Ejemplo: &var1, significa la dirección de la variable var1. Por tal razón lainicialización de un puntero requiere:➢Asignar memoria definiendo una variable➢Declarar un puntero➢Hacer que el puntero apunte a la dirección de la variable.Para asignar un valor a la dirección de memoria a la que apunta el puntero ptr se utiliza el operador sobrecargado (*)
Diapositiva 4
La declaración de un apuntador debe indicar al compilador el tipo de dato al que apunta,para ello se hace preceder a su identificador con un asterisco (*) como sigue:<Tipo de dato>* <identificador de puntero>;también es perfectamente valido utilizar <Tipo de dato> *<identificador de puntero>;
Declaración de punteros
Diapositiva 5
La única diferencia es que el primer caso sugiere que '*' forma parte del tipo de dato', y en elsegundo que '*' forma parte del identificador. Lo recomendable es adoptar la primera forma,ya que la segunda se presta a confundir el operador '*' con el operador de indirección, y esmuy importante comprender que aquí no hay nada de indirección, es solo una declaración deun identificador, ligado a un tipo (<Tipo de dato>*). Es el mensaje del compilador el quenos indica esta ultima interpretación.Ejemplos:in t* ptr1; //Puntero a un tipo de dato entero (int)long* ptr2;//Puntero a un tipo de dato entero largo (long int)char* ptr3;//Puntero a un tipo de dato char float* ptr4;//Puntero a un tipo de dato float
Diapositiva 6
Puntero a una funcion
Cuando pasamos un puntero como parámetro de una función por valor
pasa lo mismo que con cualquier otro objeto.
Dentro de la función trabajamos con una copia del parámetro, que en este caso
es un puntero. Por lo tanto, igual que pasaba con el ejemplo anterior, las
modificaciones en el valor del parámetro serán locales a la función y no
se mantendrán después de retornar.
Sin embargo, no sucede lo mismo con el objeto apuntado por el puntero, puesto
que en ambos casos será el mismo, ya que tanto el puntero como el parámetro tienen
como valor la misma dirección de memoria. Por lo tanto, los cambios que hagamos en
los objetos apuntados por el puntero se conservarán al abandonar la función.
Diapositiva 7
Ejemplo:
#include <iostream>
using namespace std;
void funcion(int *q);
int main() {
int a;
int *p;
a = 100;
p = &a;
// Llamamos a funcion con un puntero
funcion(p); // (1)
cout << "Variable a: " << a << endl;
cout << "Variable *p: " << *p << endl;
// Llamada a funcion con la dirección de "a" (constante)
funcion(&a); // (2)
Diapositiva 8
Punteros y areglo en una dimension
Existe una estrecha relación
entre apuntadores
y arreglos, tanto que pueden ser usados en forma casi indistinta.
Una variable de tipo arreglo puede
considerarse
como un apuntadoral tipo del arreglo.
Los apuntadores pueden ser
utilizados
en cualquier
operación que involucre subíndices de arreglos.
Diapositiva 9
#include <stdlib.h>
#include <stdio.h>
int main()
{
int tabla[10],i,x,*pt,*ptr;
pt = &tabla[0];
x = *pt;
for (i=0; i <10; i++)
*(pt+i) = rand() % 100;
ptr = tabla;
for (i=0; i <10; i++)
printf(''%d
\n'',*(ptr+i),tabla[i]);
}
Cuando se suma 1 a un apuntador el
incremento
se adecua al tamaño en memoria del objeto apuntado. Un apuntador es una variable, por
lo
que operaciones
como pa = a y pa++ son permitidas.Un nombre de un arreglo es una constante,
no una variable, de ahí que a = pa o a++ o p = a.
Ejemplo relacion apuntadores y arreglos
Diapositiva 10
Asignacion dinamica de memoria
Cuando se declara un puntero se reserva memoria para albergar una dirección dememoria, pero NO PARA ALMACENAR EL DATO AL QUE APUNTA EL PUNTERO.El espacio de memoria reservado para almacenar un puntero es el mismo independientemente del tipo de dato al que apunte. La forma de indicar la dirección
de una variable, es utilizando el operador &de tipo monario precediendo al
nombre de la variable, por tanto, hay que diferenciar en una variable, cuando
se está empleando su valor (referenciado por su nombre) o cuando se está
empleando su dirección (al preceder su nombre con el símbolo &).
Int cant; Cant = 15;
&cant; /* Indica la dirección de la variable cant*/
Para que una
variable puntero apunte a otra variable es necesario asignar la dirección de
dicha variable al puntero.
Diapositiva 11
Operaciones con punteros
Int a = 5, b, c;
Int *p1 =&a, *p2;
P2 = p1;
B = *p1;
c = *p2;
ARITMÉTICA DE PUNTEROS
Sumar o restar un número entero a un puntero.
Nombre_punter + n = Dirección + n
*tamaño_tipo_dato
Float num, *punt, *pnum
Punt =#
Pnum =punt + 2
/ * Si se se supone que la dirección contenida
en punt es 4274, la dirección que contiene ‘pnum’ es 4274 + 2 * 4 = 4282 * /
Diapositiva 12
Funciones a otras funciones
Una función es un conjunto de líneas de código que realizan una tarea
específica y puede retornar un valor. Las funciones pueden tomar
parámetros que modifiquen su funcionamiento. Las funciones son
utilizadas para descomponer grandes problemas en tareas simples y para
implementar operaciones que son comúnmente utilizadas durante un
programa y de esta manera reducir la cantidad de código. Cuando una
función es invocada se le pasa el control a la misma, una vez que esta
finalizó con su tarea el control es devuelto al punto desde el cual la
función fue llamada.
Diapositiva 13
Funcion anfitriona
La palabra-clave friend es un especificador de acceso. Se usa para declarar que una función o
clase (la denominaremos "invitada"), tiene derecho de acceso a los miembros de la clase en que se declara
(denominada "anfitriona"), sin que la clase invitada tenga que ser miembro de la anfitriona. En todos los otros
aspectos la invitada es una función o clase normal en lo que se refiere a su declaración, definición y ámbito.
Dicho en otras palabras: friend es un especificador de ámbito que
"alarga" el ámbito del invitado (clase o función) al interior de
la clase anfitriona (a todo
el interior, incluyendo miembros privados y protegidos ).