Оператор разыменования - Dereference operator

В оператор разыменования или же оператор косвенного обращения, иногда обозначается "*"(т.е. звездочка ), это унарный оператор (то есть с одним операндом), найденным в C -подобные языки, которые включают указатель переменные. Он работает с переменной-указателем и возвращает l-значение эквивалентно значению по адресу указателя. Это называется «разыменованием» указателя. Например, код C

 int Икс; int *п;  // * используется в объявлении:          // p - указатель на целое число, поскольку (после разыменования)          // * p - целое число Икс = 0; // теперь x == 0 п = &Икс;  // & принимает адрес x // теперь * p == 0, так как p == & x и, следовательно, * p == x *п = 1;  // эквивалент x = 1, поскольку p == & x // сейчас * p == 1 и x == 1

присвоено 1 переменной Икс с помощью оператора разыменования и указателя на переменную Икс.

Сочинение

Унарный оператор *, как определено в C и C ++, может использоваться в композициях в случаях множественное косвенное обращение, где требуется несколько действий разыменования. Указатели, конечно, могут ссылаться на другие указатели, и в таких случаях требуется несколько приложений оператора разыменования. Точно так же оператор точки Java может использоваться в композициях, формирующих довольно сложные операторы, которые требуют существенного разыменования указателей за кулисами во время оценки.

Базовый пример множественного указателя косвенное обращение это argv аргумент к основная функция в C (и C ++), который в прототипе задан как char ** argv. Имя вызываемого исполняемого файла программы, а также все последующие аргументы командной строки сохраняются как независимые символьные строки. Массив указателей на char содержит указатели на первый символ каждой из этих строк, и этот массив указателей передается в главный функционировать как argv аргумент. Сам переданный массив "распадается" на указатель, поэтому argv на самом деле указатель на указатель на char, даже если это массив указателей на char (аналогично указатели в массиве, каждый из которых формально указывает на один char, фактически указывают на то, что такое строки символов). Сопровождающий главный аргумент argc, предоставляет размер массива (то есть количество строк, на которые указывают элементы массива), поскольку размер (крайнего) массива в противном случае теряется, когда он передается в функцию и преобразуется в указатель. Таким образом, argv указатель на 0-й элемент массива указателей на char, * argv, который, в свою очередь, является указателем на ** argv, символ (точнее, 0-й символ первой строки аргумента, которая по соглашению является именем программы).

Другой синтаксис

В BCPL, предок C, эквивалентный оператор был представлен с помощью восклицательный знак.

В C - адрес структуры (или объединения). s обозначается & s. Адрес оператора & является обратным оператору разыменования *, так * & s эквивалентно s. Адрес структуры (или объединения) s может быть назначен указателю п:

 п = &s; // адрес s был присвоен p; p == & s; // * p эквивалентно s

Ценность члена а структуры s обозначается s.a. Учитывая указатель п к s (т.е. p == & s), s.a эквивалентно (* p) .a, а также стенографию р-> а который синтаксический сахар за доступ к участникам структуры (или объединения) через указатель:

 п = &s; // адрес s был присвоен p; p == & s; // s.a эквивалентно (* p) .a // s.a эквивалентно p-> a // (* p) .a эквивалентно p-> a

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

В Unix сценарии оболочки и в таких коммунальных услугах, как Makefiles, знак доллара "$"- это оператор разыменования, используемый для перевода имени переменной в ее содержимое и, в частности, отсутствует при присвоении переменной.

На разных языках префиксы используются в идентификаторах, известных как сигилы. Это не унарные операторы - синтаксически они являются лексической частью идентификатора и имеют разную семантику, такую ​​как указание типа данных идентификатора, но синтаксически похожи на оператор разыменования и могут быть перепутаны с ним. Например, в сценарии оболочки $ FOO это оператор разыменования $ применяется к переменной FOO, а в Perl $ foo это скалярная переменная называется фу. В PHP FOO - это константа (определяемая пользователем или встроенная), $ FOO - это переменная с именем FOO, а $$ FOO - это переменная, имя которой хранится в переменной с именем FOO.

Смотрите также