Sie sind auf Seite 1von 11

Qu es un PUNTERO?: Un puntero es un objeto que apunta a otro objeto.

Es decir, una variable cuyo valor es la direccin de memoria de otra variable. No hay que confundir una direccin de memoria con el contenido de esa direccin de memoria. int x = 25; Direccin 1502 1504 1506 1508

...

...

25

...

...

...

...

La direccin de la variable x (&x) es 1502 El contenido de la variable x es 25


1

Una variable puntero se declara como todas las variables. Debe ser del mismo tipo que la variable apuntada. Su identificador va precedido de un asterisco (*):

int *punt;
Es una variable puntero que apunta a variable que contiene un dato de tipo entero llamada punt. Un puntero tiene su char *car: propia Es un puntero a variable de tipo carcter. direccin de memoria: long float *num; &punt float *mat[5]; // . . . &car 2

Es decir: hay tantos tipos de punteros como tipos de datos, aunque tambin pueden declararse punteros a estructuras ms complejas (funciones, struct, ficheros...) e incluso punteros vacos (void ) y punteros nulos (NULL). Declaracin de variables puntero: Sea un fragmento de programa en C: char dato; //variable que almacenar un carcter. char *punt; //declaracin de puntero a carcter.

punt = &dato; //en la variable punt guardamos la direccin // de memoria de la variable dato; punt apunta // a dato. Ambas son del mismo tipo, char.
3

int *punt = NULL, var = 14; punt = &var; cout<< punt << &var) //la misma salida: direccin de memoria cout<<*punt, <<var); //salida: 14, 14 Hay que tener cuidado con las direcciones apuntadas:

Cout<<*(punt+1) << var+1);


*(punt + 1) repesenta el valor contenida en la direccin de memoria aumentada en una posicin (int=2bytes), que ser un valor no deseado. Sin embargo var+1 representa el valor 15. punt + 1 representa lo mismo que &var + 1 (avance en la direccin de memoria de var). 4

Al trabajar con punteros se emplean dos operadores especficos: Operador de direccin: & Representa la direccin de memoria de la variable que le sigue: &fnum representa la direccin de fnum.

Operador de contenido o indireccin:

El operador * aplicado al nombre de un puntero indica el valor de la variable apuntada: float altura = 26.92, *apunta; apunta = &altura; //inicializacin del puntero
5

float altura = 26.92, *apunta; apunta = &altura; //inicializacin del puntero cout<< altura; cout<< *apunta; No se debe confundir el operador * en la declaracin del puntero: int *p; Con el operador . //salida 26.92

*p = 27;

en las instrucciones:

cout<<Contenido : << *p;


cout<<Direccin de memoria de p : << &p; 6

Veamos con otro ejemplo en C++ la diferencia entre todos estos conceptos

void main(void) {
int a, b, c, *p1, *p2; void *p;

p1 = &a;
*p1 = 1; p2 = &b; *p2 = 2; p1 = p2; *p1 = 0;

// Paso 1. La direccin de a es asignada a p1


// Paso 2. p1 (a) es igual a 1. Equivale a a = 1; // Paso 3. La direccin de b es asignada a p2 // Paso 4. p2 (b) es igual a 2. Equivale a b = 2; // Paso 5. El valor del p1 = p2 // Paso 6. b = 0
7

p2 = &c; *p2 = 3;

// Paso 7. La direccin de c es asignada a p2 // Paso 8. c = 3 // Paso 9. Qu se imprime?

Cout<<a << b<< c); p = &p1;

// Paso 10. p contiene la direccin de p1

*p = p2;
*p1 = 1;

// Paso 11. p1= p2;


// Paso 12. c = 1 // Paso 13. Qu se imprime?

Cout<<a <<b <<c);

Analizando las direcciones de memoria del array: Direccin del elemento 0 Direccin del octavo elemento

&mat[0] &mat[1] &mat[2] &mat[3] &mat[4] &mat[5] & mat[6] &mat[7]

2
mat

16

-4

29

234

12

3
mat+7

mat+1 mat+2

mat+3 mat+4 mat+5 mat+6

Puntero a la direccin del elemento 0

Incremento en una

mat++
9

unidad int (dos bytes)

Aritmtica de punteros (I):


-A una variable puntero se le puede asignar la direccin de cualquier objeto.
-A una variable puntero se le puede asignar la direccin de otra variable puntero (siempre que las dos sealen el mismo objeto) -A un puntero se le puede inicializar con el valor NULL

-Una variable puntero puede ser restada o comparada con otra si ambas apuntan a elementos de un mismo array.
10

Aritmtica de punteros (III): -Observar las siguientes instrucciones: int *p; double *q;

void *r; //puntero genrico


p = &34; // las constantes no tienen direccin p = &(i+1); // las expresiones no tienen direccin

&i = p; // las direcciones no se pueden cambiar


p = q; // ilegal // legal
11

p = (int *)q;