Punteros en C++

24
ALGORITMOS Y ESTRUCTURA DE DATOS 1 ¿Qué es un PUNTERO?: Un puntero es una variable que apunta a otra variable. Esta variable almacena la dirección de memoria de otra variable. No hay que confundir una dirección de memoria con el contenido de esa dirección de memoria. int x = 25; ... ... 25 ... ... ... ... Dirección 1502 1504 1506 1508 La dirección de la variable x (&x) es 1502 El contenido de la variable x es 25 PUNTEROS

description

punteros

Transcript of Punteros en C++

Page 1: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 1

¿Qué es un PUNTERO?:

Un puntero es una variable que apunta a otra variable. Esta

variable almacena la dirección de memoria de otra variable.

No hay que confundir una dirección de memoria con el

contenido de esa dirección de memoria.

int x = 25;

... ... 25 ... ... ... ...

Dirección 1502 1504 1506 1508

La dirección de la variable x (&x) es 1502

El contenido de la variable x es 25

PUNTEROS

Page 2: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 2

Las direcciones de memoria dependen de la arquitectura del

ordenador y de la gestión que el sistema operativo haga

de ella.

OPERADORES DE LOS APUNTADORES

Operador de dirección & Permite saber la dirección de

memoria de la variable:

&fnum representa la dirección de fnum.

Operador de contenido o indirección *

Si el operador * esta antes de la variable durante la

declaración, indica que esta declarando la variable tipo

puntero.

PUNTEROS

Page 3: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 3

Ejemplo

int *p, *q; // p y q son variables puntero que apunta a un

entero.

Si el operador * precede a una variable puntero (no en la

parte declarativa), indica que vamos acceder al dato de la

variable al cual apunta el puntero. Ejemplo

float *p, altura = 26.92;

p = &altura; //inicialización del puntero, p apunta a altura

cout<<altura<<endl // Escribe el valor de 26.92

cout<<*p<<endl; // Escribe el valor de altura, osea 26.92 ya

que p apunta la variable altura.

PUNTEROS

Page 4: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 4

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 una variable que

contiene un dato de tipo entero llamada punt.

char *car:

Es una variable puntero que apunta a una variable que

contiene un dato de tipo carácter llamada car.

Un puntero tiene su propia dirección de memoria: &punt

&car

PUNTEROS

Page 5: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 5

#include <iostream>

using namespace std;

int main()

{ int a, b, c, *p1, *p2;

p1 = &a; // Paso 1. La dirección de a es asignada a p1

*p1 = 1; // Paso 2. p1 (a) es igual a 1. Equivale a a = 1;

p2 = &b; // Paso 3. La dirección de b es asignada a p2

*p2 = 2; // Paso 4. p2 (b) es igual a 2. Equivale a b = 2;

p1 = p2; // Paso 5. El valor del p1 = p2

*p1 = 0; // Paso 6. b = 0

p2 = &c; // Paso 7. La dirección de c es asignada a p2

*p2 = 3; // Paso 8. c = 3

cout<<a<<b<<c<<endl; // Paso 9. ¿Qué se imprime?

}

PUNTEROS

Page 6: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 6

Paso a

0x22ff74

b

0x22ff70

c

0x22ff6c

p1

0x7c80b4cb

p2

0x304fc24

1 0x22ff74

2 1 0x22ff74

3 1 0x22ff74 0x22ff70

4 1 2 0x22ff74 0x22ff70

5 1 2 0x22ff70 0x22ff70

6 1 0 0x22ff70 0x22ff70

7 1 0 0x22ff70 0x22ff6c

8 1 0 3 0x22ff70 0x22ff6c

9 1 0 3 0x22ff70 0x22ff6c

PUNTEROS

Page 7: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 7

PUNTEROS Y ARRAYS

Sea el array de una dimensión:

int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};

en el que cada elemento, por ser tipo int, ocupa dos bytes

de memoria.

Suponemos que la dirección de memoria del primer

elemento, es 1500:

&mat[0] es 1500

&mat[1] será 1502

&mat[7] será 1514

PUNTEROS

Page 8: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 8

PUNTEROS Y ARRAYS

int mat[ ] = {2, 16, -4, 29, 234, 12, 0, 3};

En total los 8 elementos ocupan 16 bytes.

Podemos representar las direcciones de memoria que ocupan los

elementos del array , los datos que contiene y las posiciones del array

en la forma:

1500 1502 1504 1506 1508 1510 1512 1514

PUNTEROS

2 16 -4 29 234 12 0 3

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

Page 9: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 9

Analizando las direcciones de memoria del array:

PUNTEROS

2 16 -4 29 234 12 0 3

Dirección del

elemento 0 Dirección del

octavo elemento

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

mat mat+1 mat+2 mat+3 mat+4 mat+5 mat+6 mat+7

Puntero a la dirección

del elemento 0

mat++

Incremento en una

unidad int (dos bytes)

Page 10: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 10

De lo anterior se obtienen varias conclusiones:

- Es lo mismo &mat[0] que mat, &mat[2] que mat + 2

- Para pasar de un elemento al siguiente, es lo mismo

PUNTEROS

for(i=0; i<8; i++)

cout<<&mat[i]<<endl;

for(i=0; i<8; i++)

cout<<mat + i<<endl;

que el código:

A esta forma de desplazarse se llama aritmetica de punteros.

Page 11: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 11

La aritmética de punteros implica usar los operadores para

suma(+), resta (-) o incremento(++) o decremento (--).

a

Ejemplo:

int *p, a;

p=&a;

p=p+5; // Esta sentencia implica que p se desplaza a la siguiente

dirección de memoria según la siguiente formula.

p=p+5*sizeof(int);// Suponiendo que int ocupa 2 bytes, la nueva

direccion de memoria que almacena p es = 1014

Recuerda que las direcciones de memoria esta dado en formato

hexadecimal.

ARITMETICA DE PUNTEROS

1004

50

Direccion

de

memoria

Contenido en

esa Direccion

de memoria

Page 12: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 12

Ejemplos: x c

float x, *y; char car, *q;

y=&x;

// Asuma que un lotante ocupa 4 bytes

y+=3; // Cual es la nueva dirección que almacena y…?.

q=&c; // Sabemos que un char ocupa 1 byte en la memoria

q++; // Cual es la nueva dirección que almacena q…?

Un puntero solo puede apuntar al tipo de dato con el cual fue

declarado.

ARITMETICA DE PUNTEROS

1012

3,25

1002

‘#’

Page 13: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 13

Utilizando la aritmética de punteros nos desplazamos de unas

posiciones de memoria a otras. Pero. ¿cómo acceder a los

contenidos de esas posiciones utilizando notación de punteros?

PUNTEROS

2 16 -4 29 234 12 0 3

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

mat[0] = 2

*(mat+3) *(mat+5)

Empleamos el operador *, indirección que nos da el contenido de

la dirección de memoria apuntada.

*mat = 2

mat[7] = 3

*mat *(mat+1) *(mat+2) *(mat+4) *(mat+6)

*(mat+7) = 3

Page 14: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 14

Punteros a CADENAS DE CARACTERES:

Una cadena de caracteres es un array de caracteres. La forma de

definir un puntero a una cadena de caracteres:

char *cadena;

El identificador del array es la dirección de comienzo del array.

Para saber dónde termina la ca, el compilador añade el carácter ‘\0’

(ASCII 0, NULL):

char *nombre = “PEPE PEREZ”;

PUNTEROS

P E P E P E R E Z \0

nombre

contenido

dirección de memoria

*(nombre+2)

Page 15: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 15

PUNTEROS

P E P E P E R E Z \0

nombre

*(nombre+2)

Si quiero recorrer la cadena con notación de puntero:

i = 0;

do

cout<<*(nombre+i)<<endl;

while(*(nombre+ i ++));

Condición de

salida

Page 16: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 16

#include <iostream>

#include <stdlib.h>

//Declaracion de funciones

using namespace std;

void VerContenido(int x[],int);

void VerDireccion(int *p,int);

void VerContenido1(int *p,int);

void VerDireccion1(int *p,int);

// programa principal

int main()

{ int x[]={10,20,5,80,45,15,54},*p,n;;

n=sizeof(x)/sizeof(n);

p=x; //p=&x[0];

VerContenido(x,n); VerDireccion(p,n);cout<<endl;

VerContenido1(x,n); VerDireccion1(x,n);

cout<<"N="<<n<<endl; system("pause");

}

PUNTEROS

Page 17: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 17

//Declaraciones de funciones

void VerContenido(int x[],int n)

{ int i;

for(i=0;i<n;i++)

cout<<" "<<x[i]<<"\t";

cout<<endl;

}

void VerDireccion(int *p,int n)

{ int i;

for(i=0;i<n;i++)

cout<<(p+i)<<" ";

cout<<endl;

}

PUNTEROS

Page 18: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 18

void VerContenido1(int *p,int n)

{ int i;

for(i=0;i<n;i++)

cout<<*(p+i)<<"\t";

cout<<endl;

}

void VerDireccion1(int *p,int n)

{ int i;

for(i=0;i<n;i++)

cout<<p++<<" ";

cout<<endl;

}

PUNTEROS

Page 19: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 19

#include <iostream> #include <ctype.h> #include <string.h> using namespace std; const int N=80; // funciones prototipo void SoloVocales(char *, char *); int main() { char s[N],s1[N]; cout<<"Ingrese Cadena:";cin.getline(s,80); cout<<endl<<endl; SoloVocales(s,s1); cout<<"La cadena de vocales es "<<s1<<endl<<endl; system("PAUSE"); }

PROBLEMAS CON PUNTEROS

Page 20: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 20

void SoloVocales(char *cad,char *cpas) { char c; int i=0; strlwr(cad); while(*cad!='\0') { c=*cad; if((c=='a') || (c=='e') || (c=='i') || (c=='o') || (c=='u' ))

cpas[i++]=c; cad++; } cpas[i]='\0'; }

PROBLEMAS CON PUNTEROS

Page 21: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 21

PROBLEMAS CON PUNTEROS #include <iostream>

#include <conio.h>

using namespace std;

char *MinusculasMayusculas(char *p)

{ char *x=p;

while(*p!=0)

{ if(*p>='a' && *p<='z')

*p-=32;

p++;

}

return x;

}

Page 22: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 22

PROBLEMAS CON PUNTEROS

void Leer(char *q)

{ cout<<"Ingrese la cadena:";

while((*q=getchar())!='\n')

q++;

*q='\0';

}

int Numero(char *s)

{ int m=0; while(*s!=0)

{ if(*s>='0' && *s<='9')

m=m*10+*s-48; s++;

}

return m;

}

Page 23: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 23

PROBLEMAS CON PUNTEROS

//Programa principal

int main()

{ char c[254],cn[254];

Leer(c);

cout<<"\n\nCadena actual:"<<c<<endl;

cout<<"\nNueva cadena: "<<MinusculasMayusculas(c)<<endl;

cout<<endl;

cout<<"Ingrese Cadena numerica:";gets(cn);

cout<<"El numero es:"<<Numero(cn)<<endl;

cout<<endl;

system("pause");

}

Page 24: Punteros en C++

A L G O R I T M O S Y E S T R U C T U R A D E D A T O S 24

PROBLEMAS CON PUNTEROS