Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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.
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.
Introduccin
Por
Introduccin
Cules
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?
operadores:
Mal !!!!!
Y
por qu?.
primera solucin.
int *a; int b = 3; a = &b;
Un
dibujo.
15 ?
13B6 ?
Punteros y constantes
Punteros Puntero
y constantes:
a una constante. Puede cambiar el puntero pero no puede cambiar el valor apuntado.
int* int* const a = [Direccin de memoria];
Puntero
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 ); }
x
8A48
5 8 8 5
p1 p2 tmp
8A48
y
8A4A
8A4A
Memoria main
5 ?
Memoria intercambio
Para
Os
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:
devuelve esta funcin?. Qu necesita como parmetro?. Esta palabra reservada nos va a ser til: sizeof.
Memoria dinmica
12
Memoria dinmica
Importante
!!!!!!
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
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;
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
17
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);
} }
20
Punteros a funciones
Punteros a funciones
Qu
21