Почему dereference переводят как разыменование?

302
16 декабря 2017, 07:00

Пример кода:

int x = 10;
int *p = &x; // reference - получение адреса объекта x
int y = *p;  // dereference - получение объекта по указателю p

Во многих книгах на русском при переводе dereference используют термин "разыменовать". Насколько я понимаю значение слова "разыменование" - это лишение имени. Но тут вроде никого имени не лишают.

Другой вариант перевода который мне встречался - "снятие косвенности". Этот вариант уже ближе по смыслу к оригиналу.

Так почему же "разыменование"?

Answer 1

На самом деле - перевод совершенно правильный. Смотрите, что получается:

Любой объект в любом языке программирования состоит из двух неразрывных сущностей:

  1. Значения (что бы мы под этим не понимали)
  2. Имени этого значения

Во многих языках программирования типа С различие между этими сущностями не подчёркивается. Так например, во многих языках можно написать нечто вроде:

a := a + 7;

Здесь одна и та же лексема "а" используется в разных смыслах. Справа - как значение, слева - как имя. Начинающие программисты зачастую этого не осознают. В некоторых языках это различие делается явным. Например, в языке Shell имя переменной может быть "A", а значение - "${A}".

Возвращаясь к Вашему вопросу. Во многих языках программирования существует особый тип переменных, значениями которых являются имена других переменных. Ведь что такое ссылка (указатель) ? Это машинный адрес - имя ячейки, содержащей значение.

Поэтому "разыменовать" означает - сказать процессору, что значение данной переменной надо превратит в имя некоторой другой переменной. Вот так:

int a;
int *pa = &a;
a = 3;
*pa = a + 4;

Результат довольно очевиден. А на самом деле, мы сказали процессору, что:

  • Хотя pa стоит слева от знака присваивания, но её имя нас не интересует.
  • Нам нужно имя некоторой другой переменной, заданной её значением.
  • Фактически, в данном примере имя pa изчезает! Она "разыменовывается".
READ ALSO
D3D_MIN_PRECISION не определён

D3D_MIN_PRECISION не определён

Пишу приложение с использованием DirectX SDK на C++Всё было нормально до того момента как я стал писать поддержку шейдеров в своём приложении

191
QEventLoop останавливает загрузку страницы

QEventLoop останавливает загрузку страницы

Пишу приложение для просмотра расписания автобусов в городеРасписание беру с сайта: downloader_

204
Проблема с поиском элемента в списке

Проблема с поиском элемента в списке

Существует шаблон списка:

190