/*
   - Pointers
   - Array allocation
   - Arguments passing
   by Jeff Souza

*/



#include <iostream>

using namespace std;


void pointers();

void arrays();

void arguments();

void swapV(int x, int y);

void swapR(int& x, int& y);



int main() {

//Pointers
pointers();


//Allocating Arrays
//arrays();


//Argument passing
//arguments();

 return 0;
}



// This function shows how to define and
// use pointers and their operations

void pointers() {

    int   *pt_int1, *pt_int2;

    float *pt_float;
    int   a = 7, b = 27;
    float x = 1.2345, y = 32.14;

   cout << "\n -------------------\n";
   cout << "| Pointers          |\n";
   cout << " -------------------\n\n";

   pt_int1 = &a;
   *pt_int1 += b;
   cout << "A now has the value of " << *pt_int1 << "\n";

   pt_float = &x;
   y += 5 * (*pt_float);
   cout << "Y now has the value of " << y << "\n";

   pt_int2 = pt_int1;
   a = 123;
   cout << "Pt_int2 in pointing to a variable with value " << *pt_int2 << "\n\n";


   cout << "Pt_int1 in pointing to position " << pt_int1 << " in memory.\n";

   cout << "Pt_int2 in pointing to position " << pt_int2 << " in memory.\n";

   cout << "Pt_float in pointing to position " << pt_float << " in memory.\n\n";

}


// This function demonstrates three different
// methods to allocate arrays in C++
//        - Direct static allocation
//      - Static allocation with constant
//      - Dynamic allocation with pointer and variable
void arrays() {

   const int num_elements_const = 100;

   int num_elements_variable;


   cout << "\n -------------------\n";

   cout <<   "| Arrays            |\n";
   cout <<   " -------------------\n\n";


   // static allocation

   int array1[100];

   cout << "Array1 allocated\n";



   // static allocation with constant

    int array2[num_elements_const];

   cout << "Array2 allocated\n";



   // dynamic allocation with pointer and variable

   cout << "Type the number of elements for array3 : ";

   cin >> num_elements_variable;



    int *array4;

    array4 = new int[num_elements_variable];



   cout << "Array3 allocated with " << num_elements_variable << " positions.\n";



   // don't forget to destroy this array after use

   delete[] array4;

}



// This function is designed to make use of

// two other functions that receive arguments

// as reference and value

void arguments() {

    int a = 10;

    int b = 20;



   cout << "\n -------------------\n";

   cout <<   "| Argument passing  |\n";
   cout <<   " -------------------\n\n";


    cout << "Initial Values:" << endl;

    cout << "  a = " << a << endl;

    cout << "  b = " << b << endl;



    // Passing arguments by value

    swapV(a,b);

    cout << "Passing by Value:" << endl;

    cout << "  a = " << a << endl;

    cout << "  b = " << b << endl;



    // Passing arguments by reference

    swapR(a,b);

    cout << "Passing by Reference:" << endl;

    cout << "  a = " << a << endl;

    cout << "  b = " << b << endl;

}



// This function demostrates the C++ "default"

// argument passing method : by-value

void swapV(int x, int y) {

   int tmp = x;

   x = y;

   y = tmp;

}



// This functions shows how to pass argument

// by-reference in C++

void swapR(int& x, int& y) {

   int tmp = x;

   x = y;

   y = tmp;

}