A ver, vamos por partes.
El que tu digas que una funcion llamada ObtenerDireccionEntero devuelve la direccion de un entero, no tiene mucho sentido, pues el operador & ya devuelve una direccion, y se puede utiliza para devolver la direccion de cualquier tipo de variable, no solo las de tipo entero, entonces no tiene caso "inventar" una funcion para devolver la direccion de variables, si ya existe un operador en C/C++ que hace precisamente eso.
En segundo lugar, int *ObtenerDireccionEntero(int num),
NO devuelve una direccion, en realidad lo que devuelve es un
apuntador a un entero, que de manera implicita los apuntadores manejan direcciones de memoria, y que estas direcciones se manejen por medio de enteros, no significa que podamos usar variables de tipo entero como sustituto de variables apuntador. De hecho, segun el tipo de apuntador (char, int, float, etc), el compilador genera el codigo adecuado para manejarlo, ya que cada tipo de variable utiliza internamente diferente cantidad de memoria (char un byte, int 2 bytes, float 6 bytes), entonces cuando declaramos un arreglo dinamico de apuntadores por medio de memoria dinamica (lease malloc, o new) se genera codigo para que se desplace por el arreglo de manera correcta, de esa forma si tenemos un arreglo dinamico de floats, casa vez que el apuntador se mueve hacia adelante, se mueve 6 bytes, y no un byte como si fuera char, no se si me explique lo suficiente.
Por ultimo, si querias saber que pasaria si substituyes * por &, en realidad lo que pasaria es que te devolveria el valor contenido en la direccion de memoria y no la direccion de memoria en si, aunque eso lo podrias saber directamente usando la variable, en lugar de la funcion.
A continuacion te muestro un programa que te muestra los diferentes supuestos. En mi caso me mostro una advertencia porque estoy tratando de obtener la direccion de una variable local que fue destruida, lo que podria causar porblemas si trato de usar esa direccion, ya que como dije antes fue destruida, y entonces usarla podria corromper la memoria de otra variable.
El 1er numero que imprime es la direccion de la variable local num.
El 2o numero veras que es el valor contenido en la variable local num, en este caso 10, que es el que le pasamos como parametro por medio de la variable numero
El 3er Numero es la direccion de numero, obtenido por medio de la funcion.
El 4o Numero es la direccion de numero, obtenido por medio del operador &, como veras da el mismo numero, con lo que como dje antes, es innecesario crear una funion qe devuelva la direccion, si ya existe.
Saludos
#include <cstdio>
#include <cstdlib>
int r;
int *ObtenerDireccionEntero1(int num)
{
return #
}
int &ObtenerDireccionEntero2(int num)
{
return num;
}
int *ObtenerDireccionEntero3(int* num)
{
return &*num;
}
int main()
{
int numero = 10;
printf("%dn", ObtenerDireccionEntero1(numero));
printf("%dn", ObtenerDireccionEntero2(numero));
printf("%dn", ObtenerDireccionEntero3(&numero));
printf("%dn", &numero);
return 0;
}