134 lines
4.7 KiB
Markdown
134 lines
4.7 KiB
Markdown
|
---
|
|||
|
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;
|
|||
|
}
|
|||
|
```
|