void * fun (int i)
Это не то же самое i
от основного, скорее его копия из другого места исключительно в рамках этой функции fun
. Использование его вне области действия функции через ее адрес приведет к неопределенному поведению. Таким образом, вместо передачи по ссылке, и она будет принимать те же i
от основного
void* fun(int &i)
Второе - приведение целого числа к void *
. Это преобразование целого числа в адрес местоположения и разыменование его снова вызывает UB.
return (void *)&i;
Вернет адрес, который можно привести обратно к int *
.