Concepto de paso por referencia y valor

sé que el el tema ya ha sido comentado y he ido checando detalladamente las aportaciones que se han presentado durante cada uno ,gracias a ellos creo que he logrado capturar realmente el concepto pero aún me quedan dudas de si lo he hecho de la manera correcta, les agradecería si alguien me pudiera confirmar mis hipótesis planteadas a continuación.

Puntos a considerar.

1.Java no cuenta con pasos por referencia.

2.C y C++ cuentan con pasos por refrencia.

Todos los lenguajes anteriores los he cubierto hasta los temas necesario para poder realizar este tipo de comparaciones.En Java puedo expresar la siguiente linea.

Persona p1 = new Persona(); 

Mientras que en C puedo realizar lo siguiente con estructuras.

Persona p1; Persona *ptrPersona = &p1; 

A partir de los ejemplos anteriores yo pensaba lo siguiente.

Java.

1.La referencia p1 hace referencia al objeto creado en esa misma linea de manera que la variable p1 contiene la dirección de memoria de dicho objeto.

C.

2.El puntero ptrPersona apunta hacia al objeto p1.

Es aquí donde tenia un choque de conceptos…Yo pensaba que el hecho de que el puntero en C apuntara hacia un objeto hacia énfasis en que el puntero era simplemente un tipo de variable que contenía direcciones de memoria pero al pensar en eso chocaba con el concepto de referencias en java y me surgía la duda de cual era la diferencia entre la referencia en java y el puntero en C si en ambos cuando se pasaban a una función realmente lo que se hacia era copiar esa dirección de memoria al parámetro de la función.

A partir de lo anterior intente buscar una respuesta que realmente me diera solucion a esta incognita y que me termino confundiendo un poco.

Puntos Hipotéticos que ahora creo entender.

1.El apuntador en C realmente no es una variable que contiene direcciones de memoria ,simplemente es un alias para la dirección de memoria a la que apunta.

2.La referencia en Java si guardar una dirección de memoria.

A través de los puntos anteriores entonces intente enlazar todas las respuestas que encontre… y llegue a la suposición de que el paso por referencia no existe en java y si en C por las siguientes circunstancias.

1.En C existe un paso por referencia debido a que si tu pasas un apuntador a una función realmente no le estas diciendo al parámetro de la función que copie la dirección de memoria que contiene el primer apuntador si no que le estas diciendo que ahora la variable parámetro va ser un nuevo alias para la dirección de memoria que “apuntaba” el primer apuntador o mas bien dicho a la que era alias el primer apuntador.

2.En Java no existe un paso por referencia debido a que si tu pasas una referencia de un objeto realmente lo único que estas pasando es la dirección de memoria,esto implica que indirectamente el lenguaje java deberá realizar un proceso oculto para acceder a esa dirección de memoria y que ademas en las celdas de memoria se tendrá almacenadas dos referencias o variables distintas que contienen una dirección de memoria igual de un objeto.

Les agradecería si me confirmaran si realmente esta es la diferencia que limita a que lenguajes como java no soporten el paso de parámetros por referencia a una función, ademas me gustaría recalcar el punto del puntero en C…Realmente un puntero en C no es como una variable que puede contener un valor(dirección de memoria) si no que es algo mas avanzado de manera que no contiene nada pero permite ser un alias para una dirección de memoria.Lo anterior lo menciono por que realmente he visto algunos autores menciona un puntero en C como una variable especial que contiene direcciones de memoria.