#include <iostream>

using namespace std;

/**
   W programie tym używamy instrukcji reinterpret_cast<long>(p), by
   zamienić wskaźnik p na liczbę całkowitą długą w celu wyświetlenia
   jego wartości. Na rysunkach 3 i 4 w książce umownie założono, że
   adres ten jest równy 20300. Po uruchomieniu programu wartość ta będzie
   inna. Istotne jest jednak to, czy wartości obu wskaźników są takie
   same, a jeśli nie, to o jaką wartość się różnią.
*/

double sum(double values[], int size)
{
   cout << "Wartość tablicy values: " << reinterpret_cast<long>(values) << endl;
   double total = 0;
   for (int i = 0; i < size; i++)
   {
      total = total + values[i];
   }
   return total;
}

int main()
{
   double a[10];
   for (int i = 0; i < 10; i++) { a[i] = i * i; }

   double* p = a; // Wskazuje element a[0].
   cout << "Początkowy element: " << *p << endl;
   cout << "Trzy elementy dalej: " << *(p + 3) << endl;

   cout << "Wartość wskaźnika p: " << reinterpret_cast<long>(p) << endl;
   cout << "Wartość wyrażenia p + 3: " << reinterpret_cast<long>(p + 3) << endl;
   cout << "Pamiętaj, ze p + 3 znajduje się 24 bajty dalej niż p." << endl;

   double s = sum(a, 10);
   cout << "Pamiętaj, ze do funkcji sum przekazano adres tablicy a." << endl;
   cout << "Suma: " << s << endl;
   return 0;
}

