No he visto todo el código porque deje de leer cuando vi los arreglos globales. Yo te recomendaría que te bajes "Como programar en C/C++" de Deitel y Deitel y en todo caso vayas directo al capitulo de punteros.
Si no entendes algo de lo mencionado anteriormente, postea las dudas puntuales y las vemos.
Esto te lo digo porque al parecer no entendiste lo que te mencione antes, y me pareció que estaba bien explicado. Es decir, en vez de modificar el diseño del programa para pasar el array por referencia, optaste por usar un array global logrando que no tenga sentido siquiera pasar nada por referencia. Es decir, un array declarado en un scope global permite que puedas acceder a ese array desde cualquier función sin necesidad de ningún tipo de pasaje ni de ningún tipo de retorno, por tanto el uso de los punteros en este caso en particular pierde el sentido completamente.
Mira este ejemplo:
#include <iostream>
using namespace std;
void imprimir(); //Funcion que retorna void, no acepta ningun parámetro.
int array[]={1,2,3,4,5}; //Array global
int main()
{
imprimir(); //Llamando funcion
cin.get();
}
void imprimir()
{
for(int i=0;i<5;i++)//Imprimiendo elementos del array global
cout<<array[i]<<endl;
}
Como podrás ver, accedes perfectamente desde cualquier función al array global sin necesidad de pasarlo siquiera como parámetro, por eso mismo se denomina global. Es una mala practica declarar variables/objetos globales dado que cualquier función puede modificar su contenido y por ende se hace mas difícil validar los datos u controlar los errores.
Por otro lado, el manejo de punteros es bastante amplio y dependiendo de como se utilicen depende el significado de la sentencia, no es lo mismo hacer esto:
cout<<*ptr<<endl;
ptr++;
que hacer esto:
cout<<ptr[i]<<endl; // == *(ptr+i);
Un ejemplo:
Para ordenar un array pasándolo como referencia a una función, te basta con seguir este pequeño bosquejo:
#include <iostream>
using namespace std;
void imprimir(int*); //Puede ser bool o int, dependiendo si queres retornar algun valor util para chequeo de errores
int main()
{
int array[]={1,2,3,4,5};
imprimir(array); // Pasaje por referencia automatico, el identificador del array es como si fuese un puntero
cin.get();
}
void imprimir(int *ptr)
{
for(int i=0;i<5;i++)
cout<<ptr[i]<<endl;
}
Añadiendo las funciones de ordenamiento y por supuesto del ingreso de datos. El proceso a seguir es similar.
Pero recomiendo que te bajes el libro que te mencione al principio, explica los punteros de manera bastante amigable y comprensible.
Saludos