Está en la página 1de 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.
1000 1001 1002 1003 1004 1005

Como declaramos un puntero?

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; *p1 = *p2; p1 = p2; p1 = NULL; p2 = NULL; 1000 1004 1008 1012 -42 22 17 22 163 1004 1000 0 1004 0 x y p1 p2

Es equivalente a escribir x = y; Esto indica que p1 ahora apunta a la misma variable que 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.

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

main x y Intercambiar b tmp

4 a 4 3

4 3

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:

Paso de Parmetros por Referencia

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


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

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

main x

4 3
a

3 4
b

Intercambiar tmp

3 4

3 4

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

Para obtener un nmero aleatorio entre 1 y n:


rand() % n returna un nmero entre 0 y n - 1 Agregando 1 genera nmeros aleatorios entre 1 y n
1 + ( rand() % n );

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

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.

También podría gustarte