referencias referencia punteros puntero por paso pasar parametros ejercicios apuntadores c++ oop pointers reference handle

c++ - punteros - Cuál es la diferencia entre: mango, puntero y referencia



punteros en c (4)

La diferencia es el contexto.

El significado básico de un mango es que se refiere a algún objeto en un contexto muy limitado; p.ej. un SO puede mantener solo 20 archivos abiertos para un usuario o pid. Un puntero se refiere al mismo objeto en el contexto de "memoria". Y la referencia es un "alias" para un objeto: se refiere a un objeto en el contexto del código fuente; por lo tanto, la referencia a una referencia no existe como una referencia que ya "es" el objeto.

¿Cómo se diferencia una manija de un puntero a un objeto y también por qué no podemos tener una referencia a una referencia?


Para incluso hacer la pregunta, "¿por qué no podemos tener una referencia a una referencia?" significa que no entiendes lo que es una referencia.

Una referencia es otro nombre para un objeto; nada mas. Si tengo un objeto almacenado en la variable X, puedo crear una variable Y que sea una referencia a este objeto. Ambos hablan del mismo objeto, entonces, ¿qué significa exactamente tener una referencia a Y? No sería diferente de tener una referencia a X porque todos hacen referencia a la misma cosa.

Un "identificador" no tiene una definición en lo que respecta al lenguaje C ++. En términos generales, un "mango" es una construcción de alguna forma que representa algún tipo de recurso. Lo obtiene de alguna API que crea el recurso. Llama a funciones que toman el control como parámetro para consultar el estado del recurso o modificarlo. Y cuando haya terminado con esto, se lo dará a alguna otra función API.

Un puntero podría ser un asa. Una referencia podría ser un mango. Un objeto podría ser un mango. Un entero podría ser un mango. Todo depende de lo que el sistema que implementa el mango quiera hacer con él.


Un handle también se denomina a veces "cookie mágica". Es solo un valor de algún tipo opaco que identifica un objeto. En algunos casos, se implementa como un puntero real, por lo que si lo convierte en un puntero al tipo correcto, puede desreferenciarlo y trabajar con cualquier cosa que apunte.

En otros casos, se implementará como algo más que un puntero; por ejemplo, puede tener una tabla de objetos de ese tipo, y el identificador es realmente solo un índice en esa tabla. A menos que conozca la dirección base de la tabla, no puede hacer gran cosa con el índice.

C ++ simplemente dice que las referencias a referencias no son posibles. No hay mucho en el camino de un "por qué"; si lo hubieran querido lo suficiente, sin duda podrían haberlo permitido (al igual que matrices de referencias, para el caso). Se tomó la decisión, sin embargo, de que era mejor restringir las referencias (mucho), así que eso es lo que hicieron.


Un identificador suele ser una referencia opaca a un objeto. El tipo de manejador no está relacionado con el elemento al que se hace referencia. Considere por ejemplo un descriptor de archivo devuelto por la llamada al sistema open() . El tipo es int pero representa una entrada en la tabla de archivos abiertos. Los datos reales almacenados en la tabla no están relacionados con el int que devolvió open() liberó a la implementación de mantener la compatibilidad (es decir, la tabla real se puede refactorizar de forma transparente sin afectar el código del usuario. misma interfaz de biblioteca, que puede reasignar el manejador al objeto real.

Un puntero es la combinación de una dirección en la memoria y el tipo de objeto que reside en esa ubicación de memoria. El valor es la dirección, el tipo del puntero le dice al compilador qué operaciones se pueden realizar a través de ese puntero, cómo interpretar la ubicación de la memoria. Los punteros son transparentes porque el objeto al que se hace referencia tiene un tipo concreto que está presente desde el puntero. Tenga en cuenta que, en algunos casos, un puntero puede servir como un identificador (un void* es completamente opaco, un puntero a una interfaz vacía es igual de opaco).

Las referencias son alias de un objeto. Es por eso que no puede tener una referencia a una referencia: puede tener múltiples alias para un objeto, pero no puede tener un alias de un alias. Al igual que con los indicadores, las referencias se escriben a máquina. En algunas circunstancias, las referencias pueden ser implementadas por el compilador como punteros a los que se les quita referencias automáticamente en el uso, en otros casos el compilador puede tener referencias que no tienen almacenamiento real. La parte importante es que son alias para un objeto, deben inicializarse con un objeto y no pueden reabrirse para referirse a un objeto diferente después de que se inicialicen. Una vez que se inicializan, todos los usos de la referencia son usos del objeto real.