Simplemente no entiendo el sistema de puntero/referencia de C++

Simplemente no entiendo el sistema de puntero/referencia de C++

Respuesta corta:Eso depende.

Respuesta más larga:el operador de prefijo unario & , cuando se aplica a un objeto, de hecho produce la dirección del objeto:&obj . Sin embargo, también existe el modificador de tipo & , que, cuando se aplica a un tipo, lo modificará para que sea un tipo de referencia :int& .

Lo mismo se aplica a * :cuando se usa como un operador de prefijo unario , eliminará la referencia un puntero:*ptr . Cuando se usa como un modificador de tipo , modificará el tipo para que sea un puntero :int* .

Tampoco es útil que los modificadores de tipo se apliquen a la variable que se declara . Por ejemplo, este

int *p, **pp, i, &r = i; 

define un int puntero, un puntero a un puntero a un int , vainilla int y un int referencia. (Este último se inicializa inmediatamente, porque no puede tener una referencia sin inicializar). Tenga en cuenta que los modificadores de tipo pertenecen sintácticamente a la variable declarada cuyo tipo están modificando, no al tipo de la variable declarada. Sin embargo, escriba modificadores (* y & ) modificar el tipo de la variable
En el siguiente caso, sin embargo, con pp y i se presume que son variables que ya han sido declaradas

*pp = &i;

* y & son operadores de prefijo unarios que desreferencian pp y dando la dirección de i .

(Del mismo modo, el modificador de tipo [] cuando se aplica a una variable que se declara, modificará el tipo de variable a una matriz, mientras que el operador de infijo binario [] , cuando se aplica a un objeto de tipo matriz accederá a uno de sus subobjetos).

Para complicar aún más las cosas, además de los modificadores de tipo y los operadores de prefijo unario & y * , también están los operadores de infijos binarios & y * , que significa "Y bit a bit" y "multiplicación". Y para colmo de males, en C++ puede sobrecargar tanto el prefijo unario y el infijo binario variantes de estos operadores (y el infijo binario [] ) para tipos definidos por el usuario y ser completamente libre en cuanto a su semántica.


En el primer ejemplo, & se usa para declarar un tipo de referencia. No es lo mismo que & operador que se utiliza para obtener la dirección de un objeto.

Puede ver un tipo de referencia como un tipo que usa debajo de las cubiertas un puntero que nunca puede ser NULL .


En realidad, el operador &tiene dos propósitos, como se indicó anteriormente.

el primer propósito es la desreferencia, que se usa así:

int i = 123; //declare an integer variable named i with the value of 123
int *pI = &i; //declare an pointer-to-integer 
              //variable name pI pointing to the memory address of i

El operador &se usa con el significado de 'dame la dirección de memoria de'

el segundo propósito es emular la llamada por referencia (que c no tiene de forma nativa)

una declaración como

void foo(int& theInt)
{
  theInt = 123;
}

hará que la función foo acepte un parámetro int, al que se le devuelve cualquier modificación durante la ejecución de foo.

Sin el operador &, las modificaciones a theInt se harían solo en el ámbito de foo y se descartarían una vez que finalice la función.