[C con Clase] Pregunta sobre Punteros

victor the.lonesome en gmail.com
Sab Feb 2 03:09:12 CET 2013


Edwin en tu código, te comento tu código.

Siempre hay que tener en cuenta algunas cosas al trabajar con punteros: Todas las variables tienen asociadas (a grandes rasgos), un valor y una dirección. Así como los enteros sólo reciben números enteros (wow!), los punteros a enteros sólo reciben "direcciones de memoria en donde estén almacenados enteros". Así: "int a" no es igual a "int* a", el primero recibe sólo números enteros, el segundo sólo recibe direcciones de memoria en donde están localizados tipos enteros.

Ahora, para acceder a la dirección de la memoria de un dato, se utiliza el operador &. El operador * es un poco confuso porque tiene "dos usos" (en realidad 3, porque también es multiplicación). Su primer uso es el de declarar un puntero, así, "int* a", como te decía, indica que "a" sólo puede tener como valor direcciones de memoria que tengan datos tipo entero. Una vez creado el puntero, el operador * toma otro significado, el de "desreferencia", con el que puedes acceder al valor que está almacenado en la dirección a la que apunta. Ejemplo

- int a = 45;
"a" tiene tanto un valor (45) como una dirección de memoria (que puede ser cualquiera que le asigne el S.O.), por ejemplo 0x32929
- int* b;
"b" es un puntero a entero, no un entero. Así, a "b" sólo se le pueden asignar direcciones de memoria que contengan datos enteros. Pero al mismo tiempo "b" tiene su propia dirección de memoria.
- b = &a;
Con el operador "&" obtengo la dirección de memoria de "a", y como "b" es un puntero a entero (sólo puede recibir direcciones de memoria que contengan tipos de datos enteros), la asignación es correcta, ahora "b" tiene el valor de la dirección de memoria de "a".
- *b = 5;
El operador "desreferencia" accede al valor almacenado en la dirección de memoria a la que apunta "b" (que es la dirección de "a") y en este caso lo modifica.

Aquí tus códigos comentados.


> int main() { 
>    int a; 
>    int *p;
>    a = 100; // el valor de a = 100, pero además de su valor, a tiene asociada una dirección de memoria.
>    p = &a; // el valor de p es la dirección de a (no el valor de a, sino su dirección)
>    funcion(p); // paso un puntero que tiene por valor la dirección de "a"
>    cout << "Variable a: " << a << endl; 
>    cout << "Variable *p: " << *p << endl; 
>    return 0; 
> }
>  
> void funcion(int *q) {
>  /*en este caso la función recibe una copia del valor de "p", que es la dirección de "a", por lo tanto
>    el valor de "q" (sin *) es la dirección de "a". El operador "desreferencia", o sea, el *, modifica el valor que hay en la dirección a la que apunta "q", en este caso, la dirección de "a", así, modifica el valor de "a"
> *q += 50;
> }

Para el otro caso:

> int main() { 
>    int a; 
>    int *p; 
>    a = 100; // a vale 100
>    p = &a;  //p tiene por valor la dirección de "a"
>    funcion(p); // 
>    cout << "Variable a: " << a << endl; 
>    cout << "Variable *p: " << *p << endl; 
>    return 0; 
> }
>  
> void funcion(int *&q) { 
>    /*En este caso el parámetro de la función se podría dividir en *(&q), primero, con &q tú le indicas que quieres recibir una dirección y con *(&q) le indicas que quieres recibir el valor que hay en esa dirección. En este caso, "&q" hace referencia a la dirección de "p" (que es la variable que le pasaste) y con *(&q) le indicas que quieres el valor de ese puntero (en este caso el valor de "p" es la dirección de "a". Entonces pasa lo mismo, tú tienes en "q", almacenada la dirección de "a", y con el operador de desreferencia *, accedes (o modificas) su valor */ 
> *q += 50; 
> }




El 01/02/2013, a las 18:23, Edwin Alexander Bohorquez Gamba escribió:

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130201/9f7edcc6/attachment.html>


Más información sobre la lista de distribución Cconclase