punteros en c++
Post on 09-Dec-2015
276 Views
Preview:
DESCRIPTION
TRANSCRIPT
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
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
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
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
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
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
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
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]
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)
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.
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
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
‘#’
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
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)
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
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
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
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
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
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
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;
}
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;
}
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");
}
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
top related