View Categories

Ссылки

Ссылка (reference) - это переменная определённого типа, которая по сути предоставляет доступ к указанной переменной по новому имени, делает её "зеркальную копию":

  • Синтаксис создания ссылки: тип данных& имя = переменная;. Так как в C/C++ не учитываются отступы, запись может иметь вид тип данных & имя, тип данных &имя и тип данных&имя - это всё одно и то же
  • Ссылка должна быть инициализирована переменной такого же типа
  • Ссылка не может быть изменена в процессе работы, так как меняться будут данные по ней
//int& ref;     // ошибка - ссылка не инициализирована

int a = 0;
int& a_ref = a; // ссылка на a
a_ref = 123;    // запись в переменную a по ссылке
// здесь a равна 123

a_ref = a;      // здесь a присваивается к a, код не имеет смысла
// здесь a равна 123

int b = 456;
a_ref = b;      // здесь b присваивается к a - сама ссылка не меняется
// здесь a равна 456

int a_copy = a; // новая переменная со значением, равным a
// a_copy a равна 456

a_copy = 789;   // здесь меняется переменная a_copy
// здесь a равна 456
// a_copy равна 789

Несколько ссылок #

Чтобы создать несколько ссылок в одну строку, нужно указывать символ & перед каждой ссылкой:

int a;

int &ref0 = a, &ref1 = a, &ref2 = a;

Const ссылка #

Ссылка может быть const - данные по такой ссылке нельзя менять, можно только читать:

int a = 123;
const int& a_ref = a;

//a_ref = 456;  // ошибка компиляции

Ссылка на константу #

Можно создать ссылку на константу - в этом случае ссылка и сама должна быть const:

const int a = 10;
const int& a_cref = a;

//int& a_ref = 123; // ошибка компиляции, ссылка не на константу

Более того, так как числа в программе являются константами своего типа, можно создать константную ссылку на число. Это не имеет смысла, но компилируется и работает:

const int& ref = 123;

В некоторых случаях это позволяет писать более гибкий код, рассмотрим в следующих уроках.

Вес ссылки #

Ссылка по сути хранит в себе адрес переменной, поэтому сама имеет фиксированный размер адреса на текущей платформе 2/4/8 байт (AVR 2 байта, ESP 4 байта).

Зачем нужны ссылки? #

Переменную можно передать по ссылке в другое место программы, сохранив связь с этой переменной. Также в отличие от переменных, ссылки на любой тип данных занимают в памяти один и тот же размер, равный размеру адреса на конкретной платформе. Например для МК AVR это 2 байта, для ESP8266/ESP32 - 4 байта. Мы можем создать свой тип данных, который будет занимать в памяти много места, но ссылка на него будет такой же лёгкой. Это очень пригодится в случае, когда данные нужно передать в другую часть программы - ссылка займёт меньше места, лишняя память под данные не выделится и программа будет работать быстрее. Конкретные примеры будут разобраны в следующих уроках.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Прокрутить вверх