Está en la página 1de 29

Programacin Orientada a Objetos con C++

Introduccin a los punteros

Punteros en C++

Un puntero es una variable que contiene la ubicacin fsica (direccin de memoria) de un elemento determinado del programa. int *p=25; //declaracin de p como puntero

0x2400

0x2400

!p

Punteros en C++

"l elemento apuntado puede constituir en #$$%


Un dato simple Una estructura de datos Una funcin Una variable de cualquier tipo

Muchas funciones predefinidas de C++ emplean punteros como argumentos e inclusive devuelven punteros. Para operar con punteros C++ dispone de los operadores & y * .

Declaracin de variables puntero

tipo * nombre_puntero;
Ejemplos: int *p1; float valor, *pvalor; double *p, *q;

l operador de direccin o referencia !


&odas las variables se almacenan en una posicin de memoria' la cual puede obtenerse con el operador ampersand (&)' que significa literalmente "la direccin de". (or e)emplo% *+, -emos usado en funciones este operador para .referenciar/ una direccin de memoria + definir alias de par0metros en el pasa)e por referencia.
void funcion_nueva(int a, int b, float &r);

Operador de indireccin "

#sando un puntero se puede acceder directamente al valor almacenado en la variable apuntada utili$ando el operador de referencia asterisco %*&' (ue puede ser traducido literalmente como "valor apuntado por". )s*' siguiendo con los valores del ejemplo previo' si se escribe+

int !p , int +12 , p 1 *+, cout22!p,

#so de punteros en programas


// uso de punteros include !iostream"#$ int main () % int valor1 & ', valor( & 1'; int *p1, *p(; p1 & &valor1; // p1 = direccin de valor1 p( & &valor(; // p2 = direccin de valor2 *p1 & 1); // valor apuntado por p1 = 10 *p( & *p1; //valor apuntado por p2=valor apuntado por p1 p1 & p(; // p1 = p2 (asignacin de punteros) *p1 & (); // valor apuntado por p1 = 20 cout !! *valor1&* !! valor1 !! */ valor(&* !! valor(; return ); +
Valor1=10 / valor2=20

Operaciones con punteros


a)3e puede asignar a una variable puntero la direccin de una variable no puntero. float ,, *p; """"" p&&,; b)4 una variable puntero puede asignarse el contenido de otra variable puntero si son compatibles (ambos punteros apuntan al mismo tipo de dato). int *u, *v; """"" u&v; c) 4 un puntero es posible asignarle el valor 5U66 (el puntero no apunta a direccin de memoria alguna). int *p; p&-.//; //Direccin nula: 0x000 en hexadeci al

Operaciones con punteros


d) "s posible sumar o restar una cantidad entera n a una variable puntero. 6a nueva direccin de memoria obtenida difiere de la inicial en una cantidad de b+tes dada por% n ! si7eof(tipo apuntado por el puntero). int *p; """"" p0&1; //la dir original de p se incre ent 1! b"tes p2&1; //#a dir anterior de p se decre ent en $ b"tes

e) "s posible comparar dos variables puntero si estas son compatibles (apuntan a datos de igual tipo) u&&v u3&v u&&-.// u!v u$&v
%) "s posible operar los datos apuntados a trav8s de la notacin de punteros%

*p!*q

*p00

(*q) 22

*r&(4"'

Punteros y arreglos
l concepto de arreglo est, estrechamente unido al de puntero. De hecho' el identificador de un arreglo representa a la direccin de memoria de su primer elemento. Por ejemplo+ int vector51)6&%(',44,17,18,'1,9(,11,41,(8,7'+; int *p implica (ue la siguiente asignacin sea v,lida+ p & vector; o tambi-n+ p & &vector5)6;

Punteros y arreglos
.iguiendo el ejemplo anterior' si se asigna int *p; p&vector;
25 33 17 49 51 62 11 31 29 75

vector

cout!!*p; // obtiene 2& en la salida p00; // despla'a el puntero p $ b"tes


25 33 17 49 51 62 11 31 29 75

vector

Punteros y arreglos
p&vector; *(p04)& ::;
25 33 17 88 51 62 11 31 29 75

vector

p+3

cout!!*vector!!; ;!!*(vector01); //obtiene 2& " (( en la salida p& &vector586; *p& 88


25 33 17 49 51 62 11 31 29 99

vector

Punteros y arreglos
// )s punteros " arreglos
10 20 30 40 50

include !iostream$ int main () % int numeros5'6; int *p; p & numeros;*p & 1); p00; *p & (); p & &numeros5(6; *p & 4); p & numeros 0 4; *p & 1); p & numeros; *(p01) & '); for (int n&); n!'; n00) cout !! *(p0n) !! * * ; return ); +

Punteros void

6os punteros void pueden apuntar a cualquier tipo de dato.

3u 9nica limitacin es que el dato apuntado no puede ser referenciado directamente (no se puede usar el operador de referencia * sobre ellos)' dado que la longitud del dato apuntado es indeterminada.

(or lo anterior' siempre se debe recurrir a la conversin de tipos (type casting) o a asignaciones para transformar el puntero void en un puntero de un tipo de datos concreto.

Punteros void
include !iostream$ void incrementar (void *dato, int tipo); int main () % c#ar a & '; s#ort b & 8; lon< c & 1(; incrementar (&a,si=eof(a)); incrementar (&b,si=eof(b)); incrementar (&c,si=eof(c)); cout !! (int)a !! *, * !! b !! *, * !! c; return ); + void incrementar (void* dato, int tipo) % s>itc# (tipo) % case si=eof(c#ar) : (*((c#ar*)dato))00; brea?; case si=eof(s#ort): (*((s#ort*)dato))00; brea?; case si=eof(lon<) : (*((lon<*)dato))00; brea?; + + 6, 10, 13

Punteros a funciones

// puntero a funcin

s posible pasar una funcin como par,metro a otra funcin'.

int suma (int a, int b) % return (a0b); + int resta (int a, int b) % return (a2b); + int (*menos)(int,int) & resta; int (*mas)(int,int); mas(int, int)&&suma;

Punteros a funciones

// puntero a funcin #include !iostream$ int suma (int a, int b) int resta (int a, int b)

s posible pasar una funcin como par,metro a otra funcin'.


% return (a0b); + % return (a2b); +

int (*menos)(int,int) & resta; int operacion (int ,, int @, int (*func_a_llamar)(int,int)) % int <; < & (*func_a_llamar)(,,@); return (<); + int main () % int m,n; m & operacion (7, ', &suma); n & operacion ((), m, menos); cout !!n; return ); }

structuras din,micas

0esuelven los siguientes problemas+

Crear variables cuyo tama1o se desconoce en tiempo de compilacin. Datos (ue no perduran durante toda la ejecucin del programa.

Operadores ne2 y ne234

Para re(uerir memoria din,mica e5iste el operador new. new va seguido por un tipo de dato y opcionalmente el n6mero de elementos re(ueridos dentro de corchetes 56. 0etorna un puntero (ue apunta al comien$o del nuevo blo(ue de memoria asignado durante la ejecucin del programa. .u forma es+
puntero & ne> tipo o puntero & ne> tipo 5elementos6

Por ejemplo+
int *uno* uno = ne+ int* int *lista* lista= ne+ int ,&-*

lista

Operadores ne2 y ne234

#na ve$ (ue no se precisa m,s hacer uso de una estructura din,mica es posible liberar los recursos (ue ella invlolucra y ponerlos disponibles para las aplicaciones (ue se est,n ejecutando.
delete puntero; delete 56 puntero;

Memoria din,mica

// recordador include !iostream"#$ include !stdlib"#$ int main () % c#ar in<reso51))6; int i, n; int *,, dato, total & ); cout !!*ABantidad de datosC *; cin$$i; ,& ne> int5i6; if (, && -.//) e,it (1); for (?&); ?!i; n00) %cout !! *Dn<rese un nEmero: *; cin$$ ,5?6; + cout !!*.sted a in<resado estos datos: *; for (?&); ?!i; n00) cout !! ,5?6 !! *, *; delete56 ,; return ); +

ABantidad de datosC & Dn<rese un nEmero: .& Dn<rese un nEmero: $(! Dn<rese un nEmero: 10!. Dn<rese un nEmero: / Dn<rese un nEmero: (2 .sted a in<resado estos datos: 7', 149, 1)97, :, 4(,

Puntero a estructuras
// punteros a estructuras estruct)("cpp include !iostream"#$ include !stdlib"#$ struct pelicula % c#ar titulo 5')6; int anio; +; int main () % c#ar cadena5')6; pelicula peli; pelicula *ppeli; ppeli & & peli; cout !! *Dn<resar titulo: *; cin"<etline (ppeli2$titulo,')); cout !! *Dn<resar anio: *; cin"<etline (cadena,')); ppeli2$anio & atoi (cadena); cout !! *Fn.sted a in<resado:Fn*; cout !! ppeli2$titulo; cout !! * (* !! ppeli2$anio !! *)Fn*; return ); + Dn<resar titulo: 0atrix Dn<resar anio: 1111 .sted a in<resado: Gatri, (1888)

Puntero a estructuras
El operador 2$. Este es un operador de acceso a miembros es usado e!clusi"amente con punteros a estructuras punteros a clases. 7os permite eliminar el uso de par-ntesis en cada referencia a un miembro de la estructura. n el ejemplo anterior+

ppeli23titulo
puede ser traducido como+

(*ppeli).titulo
ambas e5presiones son v,lidas y significan (ue8 se est, evaluando el elemento titulo de la estructura apuntada por ppeli.

Puntero a estructuras
Las distintas notaciones para acceder a ie !ros de "n str"ct#
peli"titulo: elemento titulo de la struct peli

ppeli2$titulo: elemento titulo del struct apuntado por ppeli (*ppeli)"titulo% idem anterior *peli"titulo: valor apuntado por el puntero titulo del struct peli

9unciones (ue devuelven structs


// //4allar los 2 a"ores de un arreglo de enteros // e plear uan %uncin 5ue 6devuelva6 a bos valores 7include 8iostrea 3 using na espace std* t"pede% struct dos ax 9int ax1* int ax2*:* dosma, calcula_dosma,(int ,56, int n); int ain() 9 dos ax * int a,20-;n* cout886<uantos datos=:6* cin33n* %or (int i=0* i8n* i>>) 9 cout88endl886a,688i886-=6* cin33a,i-* :* = calcula?dos ax(a;n)* cout8860a"or es:688 . ax188endl* cout886@egundo a"or es:688 . ax288endl* return 0*:

9unciones (ue devuelven structs


// //4allar los 2 a"ores de un arreglo de enteros // e plear uan %uncin 5ue 6devuelva6 a bos valores dos ax calcula?dos ax(int x,-; int n) 9 dos ax d* i% (x,0-3x,1-) 9 d. ax1=x,0-* d. ax2=x,1-*: else 9d. ax2=x,0-*d. ax1=x,1-*:* %or (int i=2* i8n* i>>)9 i% (x,i-3d. ax1) 9 d. ax2=d. ax1* d. ax1= x,i-* : else i% (x,i-3d. ax2) d. ax2= x,i-* :* return d* :

9unciones (ue reciben punteros


dosma, calcula_dosma,(int ,56, int n); dosma, calcula_dosma,(int *,, int n); void func(c#ar *a);

9unciones (ue devuelven punteros


int *func(int a56, int n);

int *func(int *a, int n);

c#ar *strcp@(c#ar *c1, const c#ar *c()

9unciones (ue devuelven arreglos


include 8iostrea 3 using na espace std* int *func(int a56); int ain( ) 9 int x,-=92(;($;$&;$0;!.;./;/1;11:* int *p* p=%unc(x)*// genera un arreglo p de $ enteros %or (int i=0* i8$* i>>) cout88p>i886 688p,i-88endl* cout88p886 688x* return 0* : int *func(int a56) % int *q& ne> int516; q5)6&a516; q516&a5'6; q5(6&a596; q546&a576; return q; +