Ссылка (программирование)

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

Ссылка не является указателем, а просто является другим именем для объекта. Главное отличие ссылки от указателей в том, что ссылка ссылается всегда на валидные данные, указатель же может быть нулевым (нулевой указатель), невалидным или неинициализированным.

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

Примеры реализаций ссылок

Стандарт языка C++ определяет ссылку как псевдоним обьекта на который она ссылается, исходя из этого определения ссылка не является обьектом с которым можно выполнять операции, все операции применимые к ссылке в действительности выполняются на обьектом на который она ссылается

В языке отсутствует возможность получить доступ к значению ссылки или изменить её, таким образом ссылка на протяжении своего существования ссылается на обьект которым она инициализирована, а моментом создания ссылки является её инициализация

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

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

#include <iostream>

struct Window{
      int Width;
      int Height;
};

void WindowWidth(Window &Link){
      /*&Link ссылка на структуру Window*/
      std::cout << Link.Width << std::endl;
}

int main(){
      Window App{800, 400}; 
/*обьявление и инициализация обьекта App*/
      WindowWidth(App);
/*инициализация ссылки &Link обьектом App*/
}

Java и C#

В Java понятие указателя отсутствует, а в C# редко применяется, вместо него используется понятие ссылки. Разыменование ссылок и взятие адресов объектов для присваивания их ссылкам не требует специального оператора.

Ссылки в PHP — это средство доступа к содержимому одной переменной под разными именами. Они не похожи на указатели C и не являются псевдонимами таблицы символов. В PHP имя переменной и её содержимое — это разные вещи, поэтому одно содержимое может иметь разные имена. Ближайшая аналогия — имена файлов Unix и файлы — имена переменных являются элементами каталогов, а содержимое переменных это сами файлы. Ссылки в PHP — аналог жёстких ссылок (hardlinks) в файловых системах Unix.

<?php
$a = 'text';
$b =& $a;
print $b;
$a = 5;
print $b;
 text
 5

Ссылка (англ. reference) в Erlang является типом данных для уникального идентификатора, служащего только для выполнения сравнений и сопоставлений с образцом[1]:

send_kv(N, K, V) ->
  Reference = make_ref(),                           % создание ссылки
  {server, N} ! {put, self(), Reference, K, V},     % отправить запрос, включающий ссылку
  receive {reply, Reference, ok} -> ok                    % реакция на запрос
  after 5000 -> {error, timeout}                    % или таймаут
  end.

См. также

Примечания

  1. Martin Logan, Eric Merritt, Richard Carlsson. Erlang and OTP in Action. — Manning, 2011. — P. 36,343. — 397 p. — ISBN 9781933988788.