7/31/2019 6 Punteros C++
1/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
1
Universidad Nacional Mayor de San Marcos
Facultad de Ingeniera Industrial
7/31/2019 6 Punteros C++
2/51
Qu es un puntero?Un puntero es una variable que guarda o
contiene la direccin de memoria de otra
variable. Cuando una variable contiene ladireccin de memoria de otra variable;
entonces se dice que la primera variable
apunta a la segunda variable. Al respectoexamine la figura 1.
21/10/2012
Mg. Edgar Ruiz Lizama -
2
7/31/2019 6 Punteros C++
3/51
La variable aptrX apunta a la variable x
0x22ff70 0x22ff71 0x22ff72 0x22ff73 0x22ff74Direccin dememoria
Variables enmemoria
aptrX x
0x22ff74 150
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
3
Figura 1
Para entender mejor el concepto de punteros
suponga que la variable x contiene el valor150 ysu direccin de memoria es 0x22ff74; entonces la
variable aptrX almacena 0x22ff74.
7/31/2019 6 Punteros C++
4/51
Operadores de punteros
C y C++ posee dos operadores para trabajar con punteros:
Operador &, llamado tambin de referencia
Operador *, llamado tambin de desreferencia
Los punteros se declaran con el operador *:int *aptrX;// puntero a un entero.
float*aptrF:// puntero a un flotante
char *cad;// puntero a un arreglo de caracteres
Y se asignan con &:aptrX = &x; //asigna la direccin de x a aptrX
21/10/2012
Mg. Edgar Ruiz Lizama -
4
7/31/2019 6 Punteros C++
5/51
Ejemplo 1: Programa que utiliza una variable entera y unavariables puntero a entero. Note el uso de los operadores * y &.
#include //mostrar el uso de punterosusingnamespace std;int main() // punter0.cpp{
int x; // variable entera
int *ptrX; // puntero a enterox = 150; // asignacionptrX = &x; // asignacioncout
7/31/2019 6 Punteros C++
6/51
21/10/2012
Mg. Edgar Ruiz Lizama -
6
150x
0x22ff74
0x22ff74ptrX0x22ff70
150x
ptrX
Figura 3: Abstraccin de la memoria para lo que ocurre conel programa punter0.cpp
Figura 2: Salida del programa punter0.cpp
7/31/2019 6 Punteros C++
7/51
Ejemplo 2:Ejemplo de punteros y asignacin de punteros
#include
#include //punteros y sentencias de asignacionusingnamespace std;int main() //punter2.cpp{int i, j; // variables enterasint *pi, *pj; //variables puntero a entero
// parte 1i = 220;pi = &i; //asignar la direccion de i a pipj = pi; //asignar pi a pjcout
7/31/2019 6 Punteros C++
8/51
//parte 2
j = 500;
pj = &j;
cout
7/31/2019 6 Punteros C++
9/51
//parte 3*pj = *pi;
cout
7/31/2019 6 Punteros C++
10/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
10
Figura 4: Salida del programa punter2.cpp
7/31/2019 6 Punteros C++
11/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
11
220i
0x22ff74
0x22ff74 0x22ff74pi pj
i = 220;
pi = &i;
pj = pi;
Parte 1:
220i
pi pj
500j
0x22ff70
0x22ff70 0x22ff70pi pj
j = 500;
pj = &j;
pi = pj;
Parte 2:
500j
pi pj
Figura 5: Abstraccin de memoria del programa
punter2.cpp
7/31/2019 6 Punteros C++
12/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
12
500j
0x22ff70
0x22ff70 0x22ff70pi pj
*pj = *pi;
Parte 3:
500j
pi pj
220
0x22ff74
i
0x22ff6c 0x22ff68
220i
7/31/2019 6 Punteros C++
13/51
Aritmtica de punterosLas operaciones de suma y resta son las nicas que estnpermitidas a nivel de punteros, aunque su significado no es elmismo que en los tipo_dato base. Asuma que ptr1 es unpuntero a entero y almacena 0xA100 y que adems, losenteros ocupan una longitud de cuatro bytes. Despus derealizar la expresin
ptr1++;
Har que ptr1 ahora contenga 0xA104. Esto significa quecada vez que ptr1 se incrementa en 1, apunta al siguienteentero en la memoria. Lo inverso tambin es cierto. Porejemplo si ptr1 contiene 0xA100, la expresin.
ptr1--;
hace que ptr1 tenga almacenado 0xA096.
21/10/2012
Mg. Edgar Ruiz Lizama -
13
7/31/2019 6 Punteros C++
14/51
Reglas de la aritmtica de punteros
Regla 1: Cada vez que se incrementa unpuntero, apunta a la posicin de memoria del
siguiente elemento de su tipo_dato.
Regla 2: Cada vez que se decrementa unpuntero apunta a la posicin de memoria delelemento anterior al de su tipo_dato.
21/10/2012
Mg. Edgar Ruiz Lizama -
14
7/31/2019 6 Punteros C++
15/51
Estas reglas no son exclusivas para los operadores deincremento y disminucin, tambin se aplican a los
operadores de suma y resta, por ejemplo se pueden sumar yrestar enteros a punteros. De all que si ptrC es una variableque guarda la direccin de memoria 0xA110 y es un punteroa caracter (un caracter se almacena en un byte); entoncesla expresin.
ptrC = ptrC + 5;hace que ptrC apunte al elemento que se encuentra en laquinta posicin despus de ptrC; es decir, ptrC almacenaahora 0xA115;
21/10/2012
Mg. Edgar Ruiz Lizama -
15
Las dems operaciones aritmticas como multiplicar y dividir
punteros no estn definidas; tampoco, se pueden aplicar la suma o
resta del tipo float o double a los punteros.
7/31/2019 6 Punteros C++
16/51
Ejemplo 3: Programa que utiliza la aritmtica de punteros
#include constint N = 10;usingnamespace std;int main() //punter6.cpp{
int *px, i;
int x[N];//cargando el arrayfor (i=0; i
7/31/2019 6 Punteros C++
17/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
17
Figura 6: Salida del programa punter6.cpp
7/31/2019 6 Punteros C++
18/51
Comparacin de punterosDos punteros pueden compararse en una expresinrelacional. Por ejemplo si p y r se han declarado ydefinido como punteros, la expresin.
if (p < r)cout
7/31/2019 6 Punteros C++
19/51
Punteros a arrays
Es posible declarar un puntero a un array deenteros o de cualquier otro tipo de datos ypasarlos como argumentos a una funcin. El
programa del ejemplo 4, muestra el paso de unarray como un puntero al arreglo. En este caso elidentificador del array es un puntero al array.Observe el primer argumento de la funcin
pasarArray_3.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
19
7/31/2019 6 Punteros C++
20/51
Ejemplo 4: Paso de un puntero a un array de enteros
#include
constint MAX = 30;//prototipo de funcionvoidpasarArray_3( int *num, int n );usingnamespace std;
int main() //funarrayPunter.cpp{ int i, n, num[MAX];coutn;
//leer los elementos del array
cout
7/31/2019 6 Punteros C++
21/51
//Paso de un array como una referencia o puntero a elvoidpasarArray_3( int *num, int n )
{ cout
7/31/2019 6 Punteros C++
22/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
22
Figura 7: Salida del programa funarrayPunter.cpp
7/31/2019 6 Punteros C++
23/51
Arrays de punteros
Al igual que cualquier otro tipo de datos, los punterostambin pueden configurarse como arrays depunteros. La siguiente sentencia.
int*x[4];
declara x como un array de punteros a enteros(int) detamao 4. Ver figura 8.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
23
7/31/2019 6 Punteros C++
24/51
21/10/2012
Mg. Edgar Ruiz Lizama -
24
int
int
int
int
int *x[4];
0
1
2
3
Figura 8: Un arreglo de punteros a int
Si queremos asignar la direccin de una variable entera llamada
pruebaal tercer elemento del array de punteros a enteros de la figura7.13 escribimos
x[2] = &prueba;
Ahora, para encontrar el valor de prueba, escribimos*x[2];
El siguiente ejemplo muestra el paso de un array de punteros a una
funcin.
7/31/2019 6 Punteros C++
25/51
Ejemplo 5: muestra el paso de un array de punteros aenteros a una funcin
#include//prototipo de funcionvoidpasarArrayPunteros( int *num[], int n );usingnamespace std;int main() //funarrayPunter2.cpp
{ int i, n = 5;int*x[5]; // array de punteros a cinco int//asignacion de enteros al array de punteros a int
int prueba[] = {10,20,30,40,50};for ( i = 0; i < 5; i++)
x[i] = &prueba[i];pasarArrayPunteros(x, n); //llamada a la funcion
return 0;}
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
25
7/31/2019 6 Punteros C++
26/51
//como una referencia o punterovoidpasarArrayPunteros( int *num[], int n )
{
cout
7/31/2019 6 Punteros C++
27/51
No olvide que num en realidad no es un puntero a entero, sinoun puntero a un array de punteros. Por tanto, el parmetronum se declara como un array de punteros a enteros como seve en la funcin pasarArrayPunteros, es decir; num no es unpuntero a enteros.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
27
Figura 9: Salida para funarrayPunter2.cpp
7/31/2019 6 Punteros C++
28/51
Indireccin simple versus Indireccinmltiple.
Al escribir cdigo como el siguiente
int x, *ptrX;
x = 50;ptrX = &x;
trabajamos con la indireccin simple. Pero
podemos hacer que un puntero apunte a otropuntero que apunte a un valor de destino final. Aesto se conoce como indireccin mltiple opunteros a punteros.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
28
7/31/2019 6 Punteros C++
29/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
29
0x22ff74 500
ptrX x
0x22ff70 0x22ff74
I ) Indireccin simple
0x22ff70 0x22ff78 2500
ptrA ptrB ab
0x22ff700x22ff66 0x22ff78
II ) Indireccin mltiple
7/31/2019 6 Punteros C++
30/51
Para que una variable sea un puntero a punterotiene que ser declarada como tal. Para lograrlo secoloca un * adicional delante del identificador onombre de la variable. Por ejemplo la declaracin.
float**sueldoNuevo;
Indica al compilador que sueldoNuevo es unpuntero a un puntero a float y no un simple puntero
a float.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
30
7/31/2019 6 Punteros C++
31/51
Ejemplo 6: Indireccin simple Vs. Indireccin
mltiple#include usingnamespace std;int main() //punteroPuntero.cpp{
float pago = 1250.50;float *sueldo, **sueldoNuevo;sueldo = &pago;
sueldoNuevo = &sueldo;cout
7/31/2019 6 Punteros C++
32/51
Punteros, arrays y cadenas
Se dice que existe una relacin muy estrecha entrelos punteros y los arrays. Al respecto veamos lassiguientes lneas de cdigo.
char cad[80], *ptrC;
ptrC = cad;
El efecto de estas lneas es asignar a ptrC ladireccin del primer elemento del array decaracteres cad.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
32
7/31/2019 6 Punteros C++
33/51
Como ya sabemos el ndice de un array comienzaen 0. De all que
cad [8]
*(ptrC + 8)
se refieren al noveno elemento del array cad, estoes; para acceder al noveno elemento puedeusarse 8 como ndice de cad, o tambin se puedesumar 8 al puntero ptrC; porque en el instante desu asignacin ptrC apunta realmente al primerelemento de cad.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
33
7/31/2019 6 Punteros C++
34/51
Se dice que el identificador de una cadena es unpuntero a dicha cadena, de all que las declaraciones
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
34
A
char s[] = AMOR;
M O R \0s
y
A
char *s = AMOR;
M O R \0
s
Se consideran equivalentes.
7/31/2019 6 Punteros C++
35/51
Ejemplo 7:Dos versiones para calcular
la longitud de una cadena// Version 1
int longcad( char *s )
{int i = 0;
while (*s++)
++i;return i;
}
21/10/2012
Mg. Edgar Ruiz Lizama -
7/31/2019 6 Punteros C++
36/51
// Version 2
int longcad( char *s )
{
inti = 0;
while (s[i] != 0)
++i;
return i;
}
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
36
7/31/2019 6 Punteros C++
37/51
Devolucin de cadenasLas cadenas pueden ser devueltas por una funcinsiempre que se haga como un puntero a ella.
La siguiente declaracin de funcin
char* devolverCadena(char cad1[], char cad2[]);
Indica al compilador que se devolver un puntero a unarray de cadena de caracteres. Examine el ejemplo 8.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
37
7/31/2019 6 Punteros C++
38/51
Ejemplo 8: Devolviendo la cadena que resulta deconcatenar dos cadenas recibidas como argumento.
#include #include #include char* devolverCadena( char cad1[], char cad2[] );usingnamespace std;int main() // cadena25.cpp{
char cad1[80], cad2[80];cout
7/31/2019 6 Punteros C++
39/51
char* devolverCadena(char cad1[], char cad2[])
{
char blanco[] = " ";
//adicionando un blanco al final de cad1
strcat(cad1,blanco);
return (strcat(cad1,cad2));
}
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
39
7/31/2019 6 Punteros C++
40/51
Ejemplo 9: Dos versiones para una funcinque copia cadenas
// Version 1
char* copiacad(char *dest, char *orig)
{ int tam = strlen(orig);
dest = newchar[tam+1];int i = 0;
for ( ; orig[i] != 0; i++)
dest[i] = orig[i];
dest[i]='\0'; // marca de fin de cadenareturn dest;
}
21/10/2012
Mg. Edgar Ruiz Lizama -
7/31/2019 6 Punteros C++
41/51
// Version 2
char* copiacad(char *dest, char *orig)
{
int tam = strlen(orig);
dest = newchar[tam+1];int i = 0;
while( dest[i] = orig[i])
i++;
return dest;
}
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
41
7/31/2019 6 Punteros C++
42/51
Ejemplo 10:Programa que crea un array de punteros
a cadenas de caracteres, segn la figura 10.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
42
Figura 10: Un array de punteros a cadenas
char *p[];
0
1
2
3
4
5 NULL
i e lG a b r
e l l aE s t r
\0J a r a
i \0C o r
L u c iA n a a \0
d M eD a v i e zl e n d \0
s s \0M e l i a
7/31/2019 6 Punteros C++
43/51
#include #include /* Objetivo: Arrays de punteros a cadenas *///prototipo de las funcionesint buscaNombres(char *p[], char *nomb);
void printArrayCadenas(char *p[]);usingnamespace std;
int main() // Array_Punteros_Cadenas.cpp{
char *nombres[] = {"Gabriel Jara", "Estrella Cori", "Ana Lucia","David Melendez", "Melissa", NULL};
printArrayCadenas(nombres);cout
7/31/2019 6 Punteros C++
44/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
44
int buscaNombres(char *p[], char *nomb){
for (int i = 0; p[i] ; ++i)
if ( strcmp(p[i], nomb) == 0 )return i;
return -1; //codigo de error: no se encuentra}
voidprintArrayCadenas(char *p[])
{cout
7/31/2019 6 Punteros C++
45/51
Vectores de cadena
Es posible crear un vector de cadenas, por ejemplola declaracin
char vectorCads[4][80];
crea un vector de 4 cadenas cada una de longitudhasta 80 caracteres. Asumiendo que estas cuatrocadenas son: Hola como, estan, todosustedes, poralli; se mapean en memoria como:
Hola como estan todos ustedes por allivectorCads
21/10/2012
Mg. Edgar Ruiz Lizama -
45
21/10/201246
7/31/2019 6 Punteros C++
46/51
Ejemplo 11: Escribir la funcin cuyo prototipo esel siguiente:
int GeneraVectorCadena( char C[], char nC[N][M], char car);
donde C es la cadena original, nC es el vector de cadenas agenerar y car es un carcter alfabtico cualquiera. Lafuncin genera un vector de cadenas cuyo contenido son las
palabras que empiezan con el carctercar y finalmentedevuelve la cantidad de elementos que se guardaron en elvector de cadenas. As por ejemplo, si car es el carctere yla cadena C es:
Electron, tipo de particula elemental de carga negativa que
forma parte de la familia de los leptones y que, junto con losprotones y los neutrones, forma los atomos y las molculas. Loselectrones estan presentes en todos los atomos y cuando sonarrancados del atomo se llaman electrones libres".
Tomado de Microsoft Encarta 2007. Se han omitido las tildes.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
46
21/10/201247
7/31/2019 6 Punteros C++
47/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
47
El vectornC generado por la funcin ser:
elemental electrones estan en electrones
#include
#include
constint N = 20;constint M = 80;
int GeneraVectorCadena( char C[], char nC[N][M], char car);
usingnamespace std;int main() // Matriz_Cadenas_071.cpp{
char *C = "Electron, tipo de particula elemental de carga
negativa que forma parte de la familia de los leptones y que,junto con los protones y los neutrones, forma los atomos y las
molculas. Los electrones estan presentes en todos los atomos y
cuando son arrancados del atomo se llaman electrones libres";
21/10/201248
7/31/2019 6 Punteros C++
48/51
cout
7/31/2019 6 Punteros C++
49/51
int GeneraVectorCadena( char C[], char nC[N][M], char car){
int i = 0, j, k = 0, contPal = 0;char palab[20];while ( C[i] != 0 )
{ // sacando cada palabraj = 0;while ( C[i] != ' ' ){palab[j] = C[i];j++;i++;
}palab[j] = '\0';// si primer caracter de palabra es igual a carif ( palab[0] == car ){ // se mete en el vector de cadenasstrcpy(nC[k], palab);cout
7/31/2019 6 Punteros C++
50/51
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
50
Figura 11: Salida del programa matrizCadenas071.cpp
21/10/201251
7/31/2019 6 Punteros C++
51/51
Referencias1. Deitel H.M. y Deitel P.J. (2003). "C++ Cmo Programar".
Mxico. Prentice-Hall Hispanoamericana., 1320 p.
2. Kernighan Brian W. & Ritchie Dennis M. (1991). El lenguaje deProgramacin C Mxico. 2da. Edicin. Prentice-HallHispanoamericana., 294 p.
3. Ruiz Lizama Edgar (2009). Programacin con C++ Lima, 1ra.Edicin, fondo editorial UNMSM, 434 p.
4. Ruiz Lizama, Edgar (1999). "Curso de Lenguaje C" Lima,
UNMSM Facultad de Ingeniera Industrial 150 p.5. Schildt Herbert (2000). C Manual de Referencia Espaa.
4ta. Edicin, Osborne McGraw-Hill S.A. 709p.6. Schildt Herbert (1996). C++ Para Programadores Madrid.
McGraw Hill/Interamericana de Espaa S.A. 398p.7. Stroustrup, Bjarne (1993). "El Lenguaje de Programacin C++".
U.S.A. Addison Wesley Iberoamericana. 710 p.8. Stroustrup, Bjarne (2002) "El Lenguaje de Programacin C++
Edicin especial". Espaa. Addison WesleyPEARSONEDUCACION S.A. 1050 p.
E.R.L.
21/10/2012
Mg. Edgar Ruiz Lizama [email protected]
51
Top Related