6 Punteros C++

download 6 Punteros C++

of 51

Transcript of 6 Punteros C++

  • 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 -

    [email protected]

    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 -

    [email protected]

    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 -

    [email protected]

    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 -

    [email protected]

    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 -

    [email protected]

    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 -

    [email protected]

    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 -

    [email protected]

    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 -

    [email protected]

  • 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 -

    [email protected]

  • 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 -

    [email protected]

    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