//maxrif.cpp
//mostra uso di puntatori e riferimenti

#include<iostream.h>


//restituisce il valore (cioe' il right value) dell'elemento massimo
int Max1(int v[], int n)
{
  int max = 0;
  for (int i = 0; i<n; i++)
    if (v[i] > v[max]) max = i;

  int res = v[max];
  return res;
}


//restituisce un puntatore all'elemento massimo
int* Max2(int v[], int n)
{
  int max = 0;
  for (int i = 0; i<n; i++)
    if (v[i] > v[max]) max = i;

  int* res = &v[max];
  return res;
}

//restituisce il riferimento all' (cioe' il left value dell') elemento massimo
int& Max3(int v[], int n)
{
  int max = 0;
  for (int i = 0; i<n; i++)
    if (v[i] > v[max]) max = i;

  int& res = v[max];
  return res;
}


void main()
{
  const DIM = 10;
  int vett[DIM] = {0,2,3,4,5,6,7,8,9}; // nota: vett[5] e' il max

  vett[5] = 100;
  int a;
  a = Max1(vett,DIM);
  cout << a << ' ' << vett[5] << endl;
  a = 200;
  cout << a << ' ' << vett[5] << endl;

  vett[5] = 100;
  int* pa;
  pa = Max2(vett,DIM);
  cout << (*pa) << ' ' << vett[5] << endl;
  *pa = 200;
  cout << (*pa) << ' ' << vett[5] << endl;

  vett[5] = 100;
  int& aa = Max3(vett,DIM); //riferimenti devono essere sempre inizializzati
  cout << aa << ' ' << vett[5] << endl;
  aa = 200;
  cout << aa << ' ' << vett[5] << endl;
}
