You are on page 1of 12

Punteros

Fundamentos de Programacin

Introduccin
Los punteros en C constituyen el tema mas
temido por los estudiantes novatos 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
Entre otros.

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

Qu direccin tiene la variable a?


El operador & colocado antes del nombre de la variable, retorna
la direccin de memoria de la misma.

Direcciones de memoria
int a;
printf(La direccion de la variable a es %d, &a);
1000
1001
1002
1003

Bytes usados por la


variable a.
La direccin de a se
obtiene a travs de
&a y es 1000.

Qu son los punteros?


Podemos saber la direccin de una variable usando el operador &
Y.. en que tipo de variable la podemos poner?
En un tipo de variable llamado: puntero
Un puntero es una variable que puede almacenar direcciones de memoria de
otras variables.

Como declaramos un puntero?

1000
1001
1002
1003
1004
1005

int x;
1000 pt
pt almacena la direccin de x,
int *pt;
se dice que pt apunta a x
char *pt2;
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

Ejercicio en clase
int x,y;
int *p1,*p2;
x = -42;
y = 163;
p1 = &x;
p2 = &y;
*p1 = 17;
*p2 = x+5;

Es equivalente a escribir
x = y;

*p1 = *p2;
p1 = p2;

Esto indica que p1 ahora apunta


a la misma variable que p2

p1 = NULL;
p2 = NULL;

1000

-42
17
22

1004

22
163

1008

1000
1004
0

p1

1012

1004
0

p2

Esto es equivalente a encerar el


puntero, y decir que no apunta a
ninguna variable

Paso de Parmetros

Ya que conocemos de funciones, y sabemos crearlas, podemos crear una funcin que reciba dos valores
y los retorne, intercambiados.
Podramos decir que el prototipo sera:

void intercambiar(int a, int b);


void main()
{

Al retornar la funcin no efectuara el


cambio, como lo deseamos. Recordemos
que, al pasar parmetros, se efecta una
copia de los valores. Este tipo de paso de
parmetros se conoce como PASO DE
PARAMETROS POR VALOR.

main
x

a4

3
4

Intercambiar
b

tmp

4
3

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;
}

Paso de Parmetros por Referencia


Para este tipo de problemas, en los cuales necesitamos modificar
directamente los datos que se reciben como parmetros, se usa la llamada
de parmetros POR REFERENCIA
De esta forma, el prototipo seria:

void intercambiar(int *a, int *b);


Al retornar la funcin si habr
efectuado el cambio sobre las
variables que se pasaron por
referencia.

main
x

3
4

4
3
a

Intercambiar
b

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;
}

Aplicacin: Juegos de Azar


Generacin de Nmeros Aleatorios

Generacin de Nmeros Aleatorios


Funcin rand
Cargar <stdlib.h>
Returnar nmeros aleatorios entre 0 y RAND_MAX (por lo
menos 32767)
i = rand();

Nmeros Pseudoaleatorios
Secuencia pre-establecida de nmeros aleatorios
La misma secuencia para cada llamada a la funcin

Para obtener un nmero aleatorio entre 1 y n:


1 + ( rand() % n );

rand() % n returna un nmero entre 0 y n - 1


Agregando 1 genera nmeros aleatorios entre 1 y n

1 + ( rand() % 6); //Nmero entre 1 y 6

Generacin de Nmeros Aleatorios


Funcin srand
<stdlib.h>
Toma un entero y salta a esa posicin de su
secuencia aleatoria.
srand( time(NULL) ); //CARGAR <time.h>
time( NULL )
Returna el tiempo en el cual el programa fue compilado en
segundos.

You might also like