#include <iostream>
using std::cout, std::endl;


/*
    В 90% случаях ссылки используются для того чтобы передать что либо в функцию
    Часто нам хочется передать переменную в функцию и изменить её там (внутри функции)
    Это можно делать и с помощью указателей, но с помощью ссылок это делать гораздо удобней
    Рассмотрим два эквивалентных участка кода:

    Передаём по указателю:                    Передаём по ссылке:

    void sqr(int* p)                          void sqr(int& r)
    {                                         {
        *p = *p * *p;                             r = r * r;
    }                                         }
                                          
    int main()                                int main() 
    {                                         {
        int a = 5;                                int a = 5;
        sqr(&a);                                  sqr(a);
        cout << a << endl;                        cout << a << endl;
    }                                         }

    
    Обратите внимание на 2 вещи:
    1)  Ссылку не нужно разыменовывать внутри функции, это происходит автоматически

    2)  При передаче в функцию, не нужно передавать адрес переменной
        Нужно передать саму переменную, компилятор сам вычислит её адрес

        При этом копирования объекта a в функцию не происходит, 
        ссылки работают также быстро как и указатели
*/

void sqr(int& r)
{
    r = r * r;
}

int main() 
{
    int a = 5;
    sqr(a);

    cout << a << endl;
}


/*
    Задачи:
    
    1)  Напишите функцию void inc(int& x), которая должна принимать объект типа int
        и увеличивать его на 1
        Вызовите эту функцию из main и протестируйте её работу

    2)  Напишите функцию void normalize(float& x, float& y), которая должна принимать 
        2 объекта типа float и нормализировать их. То есть делить их на некоторое число,
        так чтобы было x*x + y*y == 1
        
        Для этого x и y нужно разделить на sqrt(x*x + y*y)


    3)  Можно ли передать в функцию sqr не переменную, а число?
        То есть, можно ли написать так: 
            sqr(5)
 

*/