[C con Clase] Disculpen, otra pequeña duda por hoy.

Steven Davidson srd4121 en njit.edu
Mie Nov 16 15:36:51 CET 2011


Hola Miguel Ángel,

2011/11/16 Miguel Angel Torres Fernandez-piñar <miguelangeltorresfp en gmail.com>:
> Hola, a ver si me pudieran ayudar con esta duda básica :
>
> Una variable tiene un identificador, una dirección de memoria y un valor.
>
> Si creamos una referencia a esta variable, esta referencia, tendrá a su vez,
> un identificador, su propia dirección de memoria y como valor la dirección
> de la variable ????.....es decir, podemos visualizarla igual que un puntero
> ???..........pero en este caso constante ???.....
>
> He visto en otros ejemplos como se visualizan en cajitas el uso de variables
> y punteros y queda muy claro, pero no he encontrado ningún ejemplo con
> referencias.........supongo que será similar a los punteros, no ???......
>

Primero de todo hay que distinguir un poco el nivel de explicación que
quieres dependiendo del punto de vista que hay: el concepto y su
posible implementación para el compilador.

Como concepto, la referencia no es más que un sobrenombre, un apodo, o
un pseudónimo de una variable. Es decir, es otro nombre más a la misma
variable. Hablando acerca de las propiedades de una variable: nombre,
dirección de memoria, y valor, pues la referencia simplemente agrega
otro nombre más a la misma variable. Por esta razón, hay que
inicializar una referencia; es decir, la referencia DEBE referirse a
alguna variable existente.

Como una posible implementación, el compilador tratará la referencia
como un puntero que automáticamente accede cada vez que se use tal
referencia. Por ejemplo,

int num = 10;
int &ref = num;

cout << ref << endl;

El compilador realmente trata la referencia de esta manera:

int num = 10;
int *__ptr = #

cout << *__ptr << endl;

Quiero dejar claro que esto solamente es UNA posible implementación.
En otros casos, el compilador es muy libre de tomar otra decisión como
puede ser en este otro ejemplo,

void cuadrar( int &ref )
{
  ref *= ref;
}

int main()
{
  int num = 10;

  cuadrar( num );
  cout << num << endl;

  return 0;
}

Aquí el compilador quizás realice las siguientes tareas:

void cuadrar()
{
  num *= num;
}

Es decir, no crea ningún puntero y simplemente pasa 'num' directamente
al "cuerpo" de la función. Bueno, es un poco difícil de explicarlo
así, pero es para hacerte una idea de que es posible que el compilador
no cree un puntero "escondido" en ciertos casos, favoreciendo una
forma más directa.

> Gracias, un saludo.........y disculpen que aún estoy muy verde con C y C++.
>

No hay disculpas que pedir. Creamos esta lista para aclarar cualesquier dudas.

Espero que lo haya hecho.

Steven




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