El problema cuando haces algo como &&a;
es que estás pidiendo "la dirección de la dirección de a
".
Eso no tiene sentido. Podemos obtener la dirección de a
bien, pero eso no nos da una variable que podemos tomar la dirección de. Simplemente nos da un valor de puntero. Hasta que ese valor esté almacenado en algún lugar, no podemos tomar sus direcciones.
Si tiene un código como 2+2
, el resultado tampoco tiene una dirección. Es solo el valor 4, pero aún no se ha almacenado en ninguna parte, por lo que no podemos tomar una dirección. Una vez que lo almacenamos en una variable int
, podemos tomar la dirección de esa variable.
Básicamente, el problema es la diferencia entre valores y variables. Un valor es solo un número (o un carácter, o algún otro dato). Una variable es un lugar en la memoria donde se almacena un valor. Una variable tiene una dirección, pero un valor no.
En C++ - speak, es la diferencia entre rvalues y lvalues. Un rvalue es esencialmente temporal, generalmente es un valor que se devolvió de otra operación (como el operador &
en su caso), pero que aún no se ha almacenado en ningún lugar.
Una vez que lo almacena en una variable, obtiene un valor l, y lvalues tiene una dirección que puede tomar.
Así que sí, necesita las dos declaraciones por separado. Primero tomas la dirección y luego almacenas esa dirección en alguna parte. Y luego puedes tomar la dirección de este "en algún lugar".
¿Por qué crees que necesitas un puntero a un puntero, en este caso? – SingleNegationElimination
posible duplicado de [¿Cómo funciona el puntero a los punteros en C?] (Http://stackoverflow.com/questions/897366/how-do-pointer-to-pointers-work-in-c) –
@Jens Gustedt, esto no es un duplicado La pregunta relacionada pregunta sobre punteros en general. Esta pregunta es sobre un caso específico. –