--- title: "⤵️ Передача переменной по ссылке в C/C++" date: 2023-03-27T23:25:00+03:00 draft: false tags: [c, cpp, development, tips] --- ## Введение Дано: передать в класс внешную переменную, чтобы её изменения во вне класса передавались в пременную класса. **Простым языком:** Мне необходимо было из класса обрабатывать данные телеметрии, значения которых изменялись в программе и хранились в объявленных перменных вне класса. При передачи переменной `variable` в функцию `example_func()` передаётся значение перменной. Если это значение изменить в переменной, само значение `variable` не изменится. ```c void example_func(int variable); ``` Для реализации цели, нужно передать в функцию значение по ссылке. Для этого использую операнд `*`, символ звёдочки. Простой пример функции, которая меняет значение переданных в неё двуъ перменных `x` и `y`. ```c void swap(int *x, int *y) { int temp; temp = *x; /* сохраняю значения по адресу х */ *х = *у; /* помещаю у в х */ *у = temp; /* помещаю х в у */ } ``` Следует помнить, что `swap()` или любая другая функция, использующая указатели на параметры должна вызываться с адресами аргументов. Для этого используется оператор `&`, символ амперсанда. Следующая программа демонстрирует правильный способ вызова `swap()`: ```c #include void swap (int *x, int *y); int main(void) { int x, y; x = 10; у = 20; swap(&x, &y); printf ("%d %d", x, y); return 0; } ``` В данном примере переменной `х` присваивается значение `10`, а переменной `у` значение `20`. Затем вызывается функция `swap()` с адресами переменных `х` и `у`. Унарный оператор `&` используется для получения адресов переменных. Поэтому в функцию `swap()` передаются адреса переменных `х` и `у`, а не их значения. Спасибо ресурсу [c-cpp.ru](http://www.c-cpp.ru/books/sozdanie-peredachi-po-ssylke) за код. _Когда я кипел над кодом, то не мог вспомнить как проделать такой трюк. (на Си последнее время пишу не часто, вот и запамятывал). Вышеуказанную статью нагуглить получилось только в ходе написании этого руководста, а результать того, что я вспомнил самостоятельно, я расписал ниже._ ## Код с использованием класса Имеется класс `Example`, у которого есть приватная переменная `variable`, которая объявлена с сиволом звёдочки. А также конструктор и метод `show()`. При создании класса я передаю в него ссылку на переменную и сохраняю эту ссылку в приватной переменной класса `variable`. Метод `show()` выводит значение перменной. ```cpp class Example { public: Example(int *xxx) { variable = xxx; } void show() { cout << "value: " << *variable << endl; } private: int *variable; }; ``` Полный код: ```cpp #include using namespace std; class Example { public: Example(int *xxx) { variable = xxx; } void show() { cout << "value: " << *variable << endl; } private: int *variable; }; int main() { int test_var = 13; Example x = Example(&test_var); x.show(); // тут выведется 13 test_var = 14; // изменяю значение внешней переменной x.show(); // тут выведется 14 return 0; } ```