¿Cuál es la diferencia entre la variable de referencia en Java y los punteros en C?

las referencias en Java solo pueden hacer referencia a objetos válidos; los punteros en C pueden hacer referencia a cualquier dirección de memoria, ya sea que haya un objeto válido allí, haya un objeto válido allí, se refiera a la mitad de un objeto, se refiera a un objeto que se ha desasignado o se refiera a alguna memoria aleatoria, como la pila, el espacio de datos global, el montón o un área de memoria a la que su programa no puede acceder (esto es lo que generalmente causa fallas de segmentación); Los punteros en C también le permiten perder memoria, si olvida desasignar objetos de montón.

Los punteros en C deben usarse con cuidado, ya que hay muchas cosas que pueden salir mal. El único problema con las referencias en Java es si, por alguna razón, se aferra a referencias con las que realmente ha terminado, puede aumentar el consumo de memoria innecesariamente; los peores casos son pérdidas de memoria, sin embargo, esto es bastante raro en la práctica, en comparación con la frecuencia con la que la gente confunde los punteros en C.

La historia se vuelve un poco más complicada cuando comenzamos a hablar de C ++, pero en su mayor parte es muy similar a C. C ++ fomenta prácticas ligeramente mejores con respecto al casting, como tener OOP incorporado y, por lo tanto, una verificación de tipo real cuando lidiar con las relaciones de clase padre / hijo: en C el código tendría conversiones sin verificar; las plantillas son otra cosa que ayuda a evitar el uso de punteros nulos; También hay modelos de estilo C ++ que le permiten al compilador una idea de lo que realmente está tratando de hacer. A pesar de todo esto, el código C válido suele ser C ++ válido, por lo que aún puede usar el mismo estilo de código C propenso a errores en C ++.

Lo último que se debe mencionar sobre C ++ son las referencias de C ++. Las referencias de C ++ son principalmente azúcar sintáctica alrededor de punteros constantes (punteros cuyo objetivo no cambia; esto es diferente entre punteros a objetos constantes). Las referencias de C ++ nunca pueden ser nulas: se les asigna un objeto al declarar la referencia y luego la referencia siempre se refiere a ese objeto en el futuro. Puede usar esto para pasar variables por referencia de la misma manera que las variables se pasan por punteros, pero lo bueno es que no tiene que tener las desreferencias de puntero adicionales en todas partes en su código. Las referencias de C ++ difieren de las de Java ya que en Java las referencias pueden ser nulas y pueden reasignarse a otros objetos. Y también las referencias de C ++ pueden referirse a objetos que no son válidos / se han desasignado / etc., lo cual es imposible en Java.