Académique Documents
Professionnel Documents
Culture Documents
Introduccin
Los punteros en C constituyen el tema mas
temido por los estudiantes de este lenguaje.
Sin embargo, su concepto, como su
manipulacin son bastante sencillas.
Un puntero no es ms que una variable
esttica cuyo contenido es una direccin de
memoria.
Introduccin
Los punteros en C constituyen el tema mas
temido por los estudiantes de este lenguaje.
Sin embargo, su concepto, como su
manipulacin son bastante sencillas.
Son extremadamente tiles para trabajos
complejos:
Permiten ahorrar espacio en memoria
Reservar dinmicamente memoria
Paso de parmetros por referencia
Direcciones de Memoria
Al declarar una variable. Por ejemplo: int a;
Estamos reservando espacio en memoria (uno o mas bytes)
Cada byte tiene una direccin. La direccin es un numero
entero, nico para cada byte.
Una variable tiene una direccin en memoria.
Es la direccin del primer byte asignado a la misma
Es imposible predecir que direccin de memoria va a tener una
variable.
Pero si es posible, conocer la direccin que ya se ha asignado
DIRECCIONES DE MEMORIA
Las variables
Ejemplo:
int a;
a = 3;
printf(Valor:%d Dir: %d ,a , &a);
Un puntero
1000
1001
1002
1003
&a es
1000
Bytes
usados
por la
variable a
DECLARACION DE PUNTEROS
int *p;
Un tipo de dato
El puntero solo podr almacenar direcciones de
memoria de variables del tipo especificado
Se pueden definir punteros de cualquier tipo:
float *pf;
char *pc;
1000
1001
1002
1003
1004
1005
1000 pt
direccin de x, se dice
que pt apunta a x
1000
1001
1002
1003
1004
1005
int x;
int *pt;
pt almacena la direccin de x,
se dice que pt apunta a x
char *pt2;
1000 pt
pt = &x;
Un puntero se denota por el * antes del nombre de la variable.
pt podr almacenar la direccin de cualquier entero, es un puntero a entero.
A travs de pt podremos acceder a x, pues pt apunta a x.
char *pt2 es un puntero a char, puede almacenar direcciones de variables
tipo char.
Operador contenido
El objetivo de un puntero es poder manipular la
variable a la que apunta.
El operador * se conoce como operador de
contenido.
El operador * ubicado antes de un puntero,
representa a la variable a la que este apunta
Me da el contenido de una posicin de memoria
CONSULTANDO CONTENIDO
Si un puntero apunta a una variable
A travs del puntero se puede llegar a conocer todo sobre la variable
Ejemplo:
Es equivalente a :
c = N
Imprime N pues c ya
cambio
Punteros II
Acceso al contenido de la variable referenciada
printf (%d, *ptr);
int radio;
int *ptr;
radio = 8;
ptr = &radio; // ptr apunta a radio
Ejemplo
*ptr = 32;
printf ("%d \n", radio);
printf ("%d \n", &radio);
Ejercicio en clase
Acceso al contenido de la variable referenciada
int x,y;
-42
17
22
1000
int *p1,*p2;
x = -42;
1004
22
163
y = 163;
1008
1000
1004
0
p1 = &x;
1012
p2 = &y;
1004
0
*p1 = 17;
Es equivalente a escribir
*p2 = x+5;
x = y;
*p1 = *p2;
p1 = p2;
p1 = NULL;
p2 = NULL;
x
y
p1
p2
PASO DE PARAMETROS
Las funciones son porciones de cdigo
Ejecutan una tarea especifica
Usualmente toman datos de entrada->parmetros
Y retornan un valor
Paso de Parmetros
main
x
a4
3
4
Intercambiar
b
tmp
4
3
}
void intercambiar(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
Ejemplo:
x = 5
printf(%d\n,x);
funct(x);
printf(%d\n,x);
void funct(int y){
y = y+1;
}
Se imprime 5, el valor de x no
cambia aunque la funcin haya
intentado modificarla
main
x
3
4
4
3
a
Intercambiar
3
4
tmp
3
4
void main()
{
int x, y;
printf(Ingrese x:);
scanf(%d,&x);
printf(Ingrese y:);
scanf(%d,&y);
printf(x = %d, y= %d, x, y);
intercambiar(&x,&y);
printf(x = %d, y= %d, x, y);
}
void intercambiar(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
Ejemplo:
x = 5
printf(%d\n,x);
funct(&x);
printf(%d\n,x);
ARREGLOS
Conjunto de elementos
Finito, Ordenado y Homogneo,
Todos sus elementos son del mismo tipo
... 99
OPERACIONES
No basta con la declaracin, para ser tratado como
un tipo de dato
Faltan las operaciones para actuar sobre l
Consulta de un elemento
//Consulto el contenido de los elementos 4 y 5 de A
printf(%d %d,A[4], A[5]);
Modificacin de un elemento
A[3] = 2; //Almaceno un valor en el elemento 3 de A
for(i = 0; i < 100; i++)
A[i] = 0;
REPRESENTACION INTERNA
Cuantos bytes ocupa un tipo de dato o
variable?
En C lo indica el operador sizeof
Ejemplo:
int a;
printf(%d %d, sizeof(int), sizeof(a));
El computador internamente
1000
1008
Lista[1]
1016
Lista[2]
&Lista[i]
Lista[0]
Lista[3]
Lista[4]
Memoria dinmica
Arreglos dinmicos
Suponga que deseamos crear un programa que almacene
notas de estudiantes, en donde el numero de estudiantes es
desconocido.
Para la nica solucin conocida es tener un arreglo esttico
de un tamao tal que pueda almacenar todas las notas que
suponemos pueda haber.
El nmero mximo
de notas que el
programa puede
almacenar es 30
Y que tal si el
curso contiene 40
estudiantes.
El programa no
servira.
RESERVA DE MEMORIA
DINAMICA
a no apunta a otra
variable, tiene
memoria propia,
solo para el
En C se usan
Punteros y
#include <stdlib.h>
void *malloc(size_t size);
void main()
{
int *arreglo, n;
printf(Ingrese tamao del arreglo: );
scanf(%d,&n);
arreglo = malloc(n*sizeof(int));
printf(Tiene %d elementos para trabajar\n,n);
free(arreglo);
}
Se define un
puntero al inicio de
un arreglo
Al final se libera el
espacio separado
LIBERAR MEMORIA
Al pedir memoria dinmicamente
Se debe liberar dentro del programa
En C se libera usando la funcin free
int *a;
a = malloc...;
free(a);
Cuando se
libera para
una
variable
Aritmtica de Punteros
Los operadores +(avanzar) y (retroceder)
Se pueden usar con punteros, pero el significado de la operacin cambia un poco
p2
EJERCICIO EN CLASE
main(){
double Lista[3];
double *p,*p1,*p2;
int k;
Lista[0] = 1;
Lista[1] = 1.1;
Lista[2] = 1.2;
p = Lista;
p = p + 2;
printf(%d, *p);
p = p - 1;
printf(%d, *p);
p1 = Lista+2;
p2 = &Lista[0];
k = p1-p2;
printf(%d, k);
}
1000
Lista[0]
1008
1.1
1016
1.2
p se mueve 2
desfases
p retrocede un
desfase
Da el total de desfases
entre p1 y p2
Lista[1]
Lista[2]
p1
En prototipos y cabecera
float CalcPromedio(float A[], int size);
float funct(float B[]);
En el cuerpo de la funcin
..
A[i] = 3;
ARREGLOS BIDIMENSIONALES
La programacin ofrece innumerables opciones
Un elemento de un arreglo, puede ser otro arreglo
int A[3][3];
A[3] es un arreglo de tres elementos
Cada elemento es otro arreglo de 3 elementos enteros
int A[3][3];
(0,0) (0,1) (0,2)
A[0]
A[1]
A[2]
RESUMEN
numPares
35
RESUMEN
RESUMEN
Referencias y Funciones
Normalmente, funciones reciben paso de parmetros por valor
La variable en s misma no se enva, se crea una copia