/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Consulta sobre punteros

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
$un$



Registrado: 29 Jun 2012
Mensajes: 1

MensajePublicado: 29/06/2012 9:44 am
Título: Consulta sobre punteros

[C++]
Quisiera saber exactamente cuál es la diferencia del uso de '*' con '&', en los siguientes contextos:
- Al declarar un subprograma.
- Al hacer el llamado a dicho subprograma (dentro de main, por ejemplo).
- Al validar el subprograma (cuando desarrollo todo lo que éste tiene que hacer).
Muchas gracias. Espero sus prontas respuestas Rolling Eyes
Volver arriba
Sorancio



Registrado: 29 May 2009
Mensajes: 1157
Ubicación: España

MensajePublicado: 30/06/2012 1:17 am
Título:

Imagino que la declaración de un subprograma se refiere a la declaración de un método o función...

Sea un método o función:

Código:
T &foo(T &t);


En este caso la función o método recibe una referencia a un objeto de tipo T y devuelve una referencia a un objeto de tipo T. Las referencias diferen de la copia de valores en que, por supuesto, no se pasa una copia del valor, si no el mismo objeto. Un ejemplo:

Código:
void multiplica_2(int &valor) {
   valor *= 2;
}
...
int k = 15;
multiplica_2(k);
printf("k = %d\n", k);


La salida será: k = 30

Si no fuese así, pasarías una copia y k no se modificaría. Esto es peligroso así que manejalo con cuidado.

El símbolo & en la declaración de cualquier cosa es el símbolo de referencia. Pero cuando está en un rvalue (en la parte de la derecha de una asignación, por ejemplo) es el operador de dirección de. Tiene una relación estricta con el operador * de puntero e indirección.

Compila este programa y ejecútalo para entenderlo:

Código:
#include <stdio.h>

int main() {
   int *puntero;
   int valor = 52;

   puntero = &valor;
   *puntero += 25;

   printf("puntero apunta a %p\n", puntero);
   printf("la dirección de memoria de valor es %p\n", &valor);
   printf("el valor de 'valor' es %d\n", valor);
   printf("el valor de aquello a lo que apunta puntero es %d\n", *puntero);

   return 0;
}

_________________
Mi página web (en inglés):
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 30/06/2012 4:02 am
Título:

Supongo que querías poner:
Código:

#include <stdio.h>
int main() {
   int *puntero;
   int valor = 52;
    puntero = &valor;
    printf("puntero apunta a %p\n", puntero);
    printf("la direccion de memoria de valor es %p\n", &valor);
    printf("el valor de 'valor' es %d\n", valor);
    printf("el valor de aquello a lo que apunta puntero es %d\n", *puntero);
    *puntero += 25;
    printf("el valor de aquello a lo que apunta puntero es %d\n", *puntero);
   return 0;
}

........................Laughing Laughing Laughing Laughing Laughing...................................
Volver arriba
leosan



Registrado: 19 Abr 2012
Mensajes: 730
Ubicación: GRAN CANARIA

MensajePublicado: 30/06/2012 5:45 am
Título:

Espero no haberme equivocado en la "descripción" :
Código:

#include <stdio.h>
int main() {
    int i=0,*puntero,*pmat;
    int valor = 52;
    int mat [10];
    mat[0]=10, mat[1]=30,mat[2]=50,mat[3]=60;
    puntero = &valor;
    printf("puntero apunta a %p\n", puntero);
    printf("la direccion de memoria de valor es %p\n", &valor);
    printf("el valor de 'valor' es %d\n", valor);
    printf("el valor de aquello a lo que apunta puntero es %d\n", *puntero);
    *puntero += 25;
    printf("el valor de aquello a lo que apunta puntero es %d\n\n\n", *puntero);

    pmat=&mat[0] ;//<=== pmat "apunta=da" a la direccion de mat[0]
    printf("pmat apunta a %p\n", pmat);
    printf("el valor de aquello a lo que apunta pmat es %d\n\n", *pmat);//1

    i=*++pmat;//<=== pmat "apunta" a la direccion de mat[1]
    printf("el valor de aquello a lo que apunta *++pmat es %d\n\n", i);//30

    i=*pmat+1;
    printf("el valor de aquello a lo que apunta *pmat+1 es %d\n\n", i);//31

    i=*(pmat+1);//<=== pmat "apunta" a la direccion de mat[2]
    printf("el valor de aquello a lo que apunta *(pmat+1) es %d\n\n", i);//50

    i=*++pmat;//<=== pmat "apunta" a la direccion de mat[2];
    printf("el valor de aquello a lo que apunta *++pmat es %d\n\n", i);//50

    i=*++pmat;//<=== pmat "apunta" a la direccion de mat[3]
    printf("el valor de aquello a lo que apunta *++pmat es %d\n\n", i);//60

    i=*pmat+5;//<=== pmat "apunta" a la direccion de mat[3]+5
    printf("el valor de aquello a lo que apunta *pmat+5 es %d\n\n", i);//65

    return 0;
}


......................Wink Wink Wink Wink Wink ..................................
Volver arriba
Sorancio



Registrado: 29 May 2009
Mensajes: 1157
Ubicación: España

MensajePublicado: 30/06/2012 11:36 am
Título:

leosan escribió:
Supongo que querías poner:
Código:

#include <stdio.h>
int main() {
   int *puntero;
   int valor = 52;
    puntero = &valor;
    printf("puntero apunta a %p\n", puntero);
    printf("la direccion de memoria de valor es %p\n", &valor);
    printf("el valor de 'valor' es %d\n", valor);
    printf("el valor de aquello a lo que apunta puntero es %d\n", *puntero);
    *puntero += 25;
    printf("el valor de aquello a lo que apunta puntero es %d\n", *puntero);
   return 0;
}

........................:lol: :lol: :lol: :lol: :lol:...................................

Los dos son válidos y muestran el mismo significado xD
_________________
Mi página web (en inglés):
Volver arriba
Masakre



Registrado: 06 Jun 2012
Mensajes: 245

MensajePublicado: 03/07/2012 12:26 pm
Título:

Pues, me parece que preguntaba en C++ (la diferencia en este caso, ¿estaría simplemente determinada por los cout y cin?).

Estos son justamente los temas que poco entiendo Rolling Eyes (aún no llegamos a ellos en lo que me van enseñando, pero los he visto ser usados y como que no explican mucho de ello).
Volver arriba
untio



Registrado: 17 Sep 2008
Mensajes: 380
Ubicación: MICA S.A.

MensajePublicado: 05/07/2012 11:02 am
Título:

Hola,

Imagina que tienes que pasar un montón de parámetros por referencia.

Que si * en la declaración.

Que si * al modificar el contenido de la dirección.

Pues, para hacer la vida más fácil en C++ está &.

Ten en cuenta que C++ quiere significar C + 1 paso más.

Espero que sirva para algo.
_________________
Hago algo muy raro: primero leo las instrucciones.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com