---
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 <stdio.h>

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 <iostream>

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;
}
```
