variable by link
This commit is contained in:
parent
337aa2d33c
commit
5881d77f95
133
content/posts/2023/cpp/link_to_class.md
Normal file
133
content/posts/2023/cpp/link_to_class.md
Normal file
@ -0,0 +1,133 @@
|
||||
---
|
||||
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;
|
||||
}
|
||||
```
|
Loading…
Reference in New Issue
Block a user