Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

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

Пример кода:
int x = 10; int *p = &x; // reference - получение адреса объекта x int y = *p; // dereference - получение объекта по указателю p
Во многих книгах на русском при переводе dereference используют термин "разыменовать". Насколько я понимаю значение слова "разыменование" - это лишение имени. Но тут вроде никого имени не лишают.
Другой вариант перевода который мне встречался - "снятие косвенности". Этот вариант уже ближе по смыслу к оригиналу.
Так почему же "разыменование"?


Ответ

На самом деле - перевод совершенно правильный. Смотрите, что получается:
Любой объект в любом языке программирования состоит из двух неразрывных сущностей:
Значения (что бы мы под этим не понимали) Имени этого значения
Во многих языках программирования типа С различие между этими сущностями не подчёркивается. Так например, во многих языках можно написать нечто вроде:
a := a + 7;
Здесь одна и та же лексема "а" используется в разных смыслах. Справа - как значение, слева - как имя. Начинающие программисты зачастую этого не осознают. В некоторых языках это различие делается явным. Например, в языке Shell имя переменной может быть "A", а значение - "${A}".
Возвращаясь к Вашему вопросу. Во многих языках программирования существует особый тип переменных, значениями которых являются имена других переменных. Ведь что такое ссылка (указатель) ? Это машинный адрес - имя ячейки, содержащей значение.
Поэтому "разыменовать" означает - сказать процессору, что значение данной переменной надо превратит в имя некоторой другой переменной. Вот так:
int a; int *pa = &a;
a = 3; *pa = a + 4;
Результат довольно очевиден. А на самом деле, мы сказали процессору, что:
Хотя pa стоит слева от знака присваивания, но её имя нас не интересует. Нам нужно имя некоторой другой переменной, заданной её значением. Фактически, в данном примере имя pa изчезает! Она "разыменовывается".

Комментариев нет:

Отправить комментарий