Страницы

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

суббота, 7 декабря 2019 г.

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

#cpp #c


Пример кода:

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


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

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

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


Ответы

Ответ 1



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

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

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