Está en la página 1de 21

Punteros

ndice
1. 2. 3. 4. 5. 6. 7. 8.

Qu es un puntero y por que son importantes. Punteros a tipos bsicos. Punteros sin tipo. Memoria dinmica. Punteros a estructuras. Punteros a matrices. Punteros a punteros a punteros. Punteros a funciones.

Qu es un puntero y por qu son importantes

Introduccin
En Java existen punteros y reserva dinmica de memoria !!!!!!!. Lo que no existe es aritmtica de punteros ni liberacin de memoria dinmica.

Introduccin
Alguien se atreve a definir lo que es un puntero?.
Un puntero es una variable capaz de almacenar
direcciones de memoria y mediante los operadores adecuados acceder a la informacin que contiene la direccin de memoria a la que apunta en cada momento.

Alguien puede decir esto con otras palabras?. Y hacer un dibujo?.

Introduccin
Por

qu son importantes los punteros?.


Tablas y cadenas. Parmetros por referencia. Biblioteca de funciones (scanf). Coger la memoria que necesitamos.

Introduccin
Cules

son los peligros / errores tpicos con punteros?.


Olvidarnos de reservar memoria. Olvidarnos de devolver memoria. Apuntar a dnde no es. No utilizar el operador adecuado (*, &).

Punteros a tipos bsicos

Punteros a tipos bsicos


As

se declaran punteros:
int *a; // puntero a entero char *c; // puntero a caracter

necesita saber el tipo apuntado para poder manipularlo. Qu guarda la variable a, y la variable c justo despus de declararla?

Punteros a tipos bsicos


2

operadores:

* : valor apuntado & : direccin de memoria.


int *a; . a *a &a Cul es la diferencia (un dibujo)?

Punteros a tipos bsicos


Cmo

podemos declarar un puntero que apunte al nmero 3?.


int *a; *a = 3;

Mal !!!!!
Y

por qu?.

Punteros a tipos bsicos


Una

primera solucin.
int *a; int b = 3; a = &b;

Un

dibujo.

Punteros a tipos bsicos


Ejemplos de uso de operadores de punteros. Se declaran dos variable enteras i y j y un puntero a entero p int i, j, *p; Suponemos que i y j se ubican en las direcciones 13B6 e 5FC4, respectivamente. Contenido operacin Variable de la memoria i=15; p=&i; (p apunta a i) j=*p; (se accede a lo apuntado por p) i j p 13B6 5FC4 ? ? 15

15 ?
13B6 ?

Punteros y constantes
Punteros Puntero

y constantes:

const int* int* a;

a una constante. Puede cambiar el puntero pero no puede cambiar el valor apuntado.
int* int* const a = [Direccin de memoria];

Puntero

constante. Puede cambiar el valor pero no la direccin de memoria.

Punteros
En

C tambin tenemos NULL. Ojo, se escribe todo en maysculas y NO es una palabra reservada. Para qu utilizamos NULL?.
int *a = NULL; . if (a == NULL) { printf(a no apunta a ningn sitio ); }

Parmetros por referencia


Se pasan las direcciones de las variables que queremos sean modificadas por la funcin. Dentro de la funcin definimos los punteros que almacenan las citadas direcciones.
#include #include<stdio.h> <stdio.h> void intercambio (int *, *); void intercambio (int *p1, int void intercambio (int *,int int *); void intercambio (int *p1, int*p2) *p2) void main (void) { void { main (void) {{ int inttmp; tmp; 8 lo El contenido de int y=8; intx=5, x=5, y=8; tmp = *p1; tmp = *p1; Son punteros almacenan intercambio (&x, intercambio (&x,&y); &y); apuntado por p1 *p1 = *p1 =*p2; *p2; direcciones printf (\n x= %d, x); printf (\n x= %d, x); *p2 = *p2 =tmp; tmp; printf (\n y= %d, y); printf (\n y= %d, y); }} }}

x
8A48

5 8 8 5

p1 p2 tmp

8A48

y
8A4A

8A4A

Memoria main

5 ?

Memoria intercambio

Se pasan las direcciones

Punteros sin tipo

Punteros sin tipo


Qu

es un puntero sin tipo?. Un puntero de tipo void.


void *p;

Para

qu sirve un puntero sin tipo?


p = &a; P = &b;

void *p; int a = 5; double b = 3.4

Punteros sin tipo


Antes

de usar el valor apuntado necesitamos forzar el tipo.


void *p; int a = 5, b; p = &a; b = (* (int *)p );

Os

imaginis como estn hechas printf y scanf?.

Memoria dinmica

10

Memoria dinmica
Los

punteros y la memoria dinmica estn muy relacionados pero no siempre van juntos. Podemos trabajar con punteros sin memoria dinmica. Un ejemplo?. Parmetros por referencia. Tablas.

Memoria dinmica
Qu

es la memoria dinmica?. Memoria que reservamos durante la ejecucin de nuestro programa. Ejemplo tpico: romper la limitacin de las tablas (listas, pilas, colas, etc.)

11

Memoria dinmica
Reservar

memoria:

#include <stdlib.h> stdlib.h> void *malloc( malloc( size_t size );


Qu

devuelve esta funcin?. Qu necesita como parmetro?. Esta palabra reservada nos va a ser til: sizeof.

Memoria dinmica

Cmo podemos crear un puntero al nmero 5 con memoria dinmica?.


1. 2. 3.

int *p; p = (int *)malloc(sizeof(int)); (*p)=5;

12

Memoria dinmica
Importante

!!!!!!

Si reservamos memoria hemos de liberarla. Nadie lo va a hacer en nuestro lugar.


Si

no la liberamos, es un trozo de memoria que NADIE puede usar. Si perdemos el puntero al trozo de memoria, ya no podremos liberarla.

Memoria dinmica

Liberar memoria. #include <stdlib.h> void free( void *ptr ); Un ejemplo:


1. 2. 3. 4.

int *p; p = (int )); (int *)malloc(sizeof(int *)malloc(sizeof(int)); (*p)=5; free(p); free(p);

13

Punteros a estructuras

Punteros a estructuras
Acceso a los campos de una estructura:
struct structTR TR {{ T1 T1c1; c1; T2 T2c2; c2; ... ... Tn Tncn; cn; }};; struct structTR TRr, r,*pr; *pr;

Son necesarios los parntesis porque el operador . es de mayor precedencia que el *

Acceso Accesoaatravs travsde devariable variableestructura estructura Acceso Accesoaatravs travsde depuntero punteroaaestructura estructura (*pr).ci (*pr).ci

r.ci r.ci

14

Punteros a estructuras
Acceso a los campos de una estructura: En C (y en C++) existe un operador para simplificar el acceso a los campos de una estructura referenciada por un puntero: ->
typedef typedefstruct struct {{ Cadena Cadenanombre, nombre,apellido1, apellido1,apellido2; apellido2; int intedad; edad; long longdni; dni; char charsexo; sexo; }}Tpersona; Tpersona; Tpersona Tpersonaempleado, empleado,*p; *p; Acceso Accesoaatravs travsde devariable variableestructura estructura strcpy strcpy(empleado.nombre, (empleado.nombre,"Alicia"); "Alicia"); printf printf("%d", ("%d",empleado.edad); empleado.edad); Acceso a travs Acceso a travsde depuntero punteroaaestructura estructura p->sexo = m; p->sexo = m; (*p).sexo (*p).sexo==m; m;

Punteros a estructuras
Cmo creamos nuevas estructuras de manera dinmica?.
typedef typedefstruct struct {{ Cadena Cadenanombre, nombre,apellido1, apellido1,apellido2; apellido2; int edad; int edad; long longdni; dni; char charsexo; sexo; }}Tpersona; Tpersona; Tpersona Tpersona*p; *p; p p==(Tpersona (Tpersona*) *)malloc(sizeof(Tpersona)); malloc(sizeof(Tpersona)); /* /*p papunta apuntaaauna unaestructura estructurade detipo tipo Tpersona cuya memoria ha sido Tpersona cuya memoria ha sidoreservada reservada durante durantela laejecucin ejecucin*/ */

15

Punteros a matrices

Punteros a matrices
Una

matriz es un puntero constante a la primera de un conjunto de posiciones de memoria consecutivas que guardan datos del mismo tipo

16

Punteros a matrices
Cmo recorremos una matriz con un puntero?
int int t[] t[] = = {1, {1, 2, 2, 3, 3, 5}; 5}; int *p; int *p; int int i; i; p p= = &t[0]; &t[0]; for for (i (i = = 0; 0; ii < < 5; 5; i++) i++) { { printf("%d ", (*(p+i)) printf("%d ", (*(p+i)) ); ); } }

Memoria dinmica

Cmo podemos crear dinmicamente una tabla de enteros de 5 posiciones?.


1. 2. 3.

int *p; p = (int ) *5 ); (int *)malloc(sizeof(int *)malloc(sizeof(int) (*p)=5; Qu significa esto?

17

Siempre que se llama a malloc hay que llamar a 4. free(p);

Punteros a punteros a punteros a punteros.

18

Punteros a punteros.
Puedo

tener punteros que apunten a punteros. Y punteros que apunten a punteros que apunten a punteros. Y punteros que apunten a punteros que apunten a punteros que apunten a punteros. Y ..

Punteros a punteros.
Cmo declaramos un puntero que apunte a un puntero a entero?. int **a; Cmo guardamos en a el entero 5 (usando todas las variables auxiliares necesarias)? int b = 5, *c; c = &b; a = &c;

19

Punteros a punteros.
Cmo mostramos el valor de a?. printf(%d , **a); Un dibujo.

Punteros a punteros.

Un ejemplo: intercambiar dos punteros de manera que, cuando termine la funcin, a apunta a donde apuntaba b y b a donde apuntaba a.
void voidintercambia(int intercambia(int*a, *a,int int*b) *b){ { int *tmp; int *tmp; tmp tmp= =a; a; a = b; a = b; b b= =tmp; tmp; } }

void voidintercambia(int intercambia(int*a, *a,int int*b); *b); int intmain() main(){ { int int*a, *a,*b; *b; int intx=1, x=1,y=2; y=2; a = a =&x; &x; b b= =&y; &y; intercambia(a, intercambia(a,b); b); printf("%d printf("%d//%d %d\n", \n",*a, *a,*b); *b);

} }

Por qu no funciona? Cmo lo arreglamos?

20

Punteros a funciones

Punteros a funciones
Qu

es un puntero a una funcin?. Para qu sirve?. Un ejemplo:


void calcular(int r, void (*avisa)(int)); void m1(int); void m2(int); void main() { calcular(5, m1); calcular(8, m1); } void m1(int r) { printf("1: %d\n", r); } void m2(int r) { printf("2: %d\n", r); } void calcular(int r, void (*avisa)(int)) { int t = r+1; (*avisa)(t); }

21

También podría gustarte