Форум программистов, компьютерный форум CyberForum.ru

Указатели С - C++

Восстановить пароль Регистрация
 
Inocs
28 / 28 / 3
Регистрация: 28.10.2011
Сообщений: 183
05.11.2012, 00:19     Указатели С #1
Объясните пожалуйста как получается что запись типа *(1+data) эквивалентна записи 1[data].
Как из data[1] получается *(1+data) и *(data+1) разобрался, но вот с последней записью 1[data] беда.
data - массив.
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 00:19     Указатели С
Посмотрите здесь:

C++ Указатели
Указатели C++
Указатели C++
Указатели C++
C++ указатели
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
05.11.2012, 00:24     Указатели С #2
так и получается. Квадратные скобки - лишь удобный способ записать последовательность действий
*(1+data)
Компилятор всё равно преобразует этот [] оператор в нечто подобное.
Inocs
28 / 28 / 3
Регистрация: 28.10.2011
Сообщений: 183
05.11.2012, 00:38  [ТС]     Указатели С #3
Спасибо конечно за ответ, но честно говоря все равно не очень понятно как это преобразовывается.

Добавлено через 6 минут
Наверно, это просто нужно принять за должное
asidorchenko
379 / 205 / 25
Регистрация: 09.04.2012
Сообщений: 635
05.11.2012, 08:43     Указатели С #4
идентификатор не может начинаться с цифры (ограничено наложено ассемблером). Чтобы понять, нужно копать ассемблер. Доступ осуществляется по указателю, который обозначается как ptr в ассемблере. Указатель на байт (8бит) byte ptr, на слово(16бит) word ptr, на двойное слово(32бит) dword ptr. Выделяется область памяти под массив, и доступ к этой области памяти осущенствляется по указателю ptr (это особенности архитектуры микропроцессора i386). Примерно следующим образом ptr[HHHHHHHH + HHh] , где HHHHHHHH это адрес области памяти 32 разрядной архитектуры системы, HHh это смещение.
См. книгу Art Of Assembly http://www.plantation-productions.com/Webster/
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.11.2012, 21:27     Указатели С #5
asidorchenko, эмм... А какое это всё имеет отношение к теме?
Inocs, это поведение связано с особенностями грамматики языка. Перед прочтение следующего текста советую получить общие сведения о том, что такое грамматика, и иметь ввиду, что по грамматике строится синтаксический анализатор - неотъемлемая часть компилятора. Предупреждаю, всё сказанное является достаточно непростым для восприятия для неподготовленного человека, на это объяснения является достаточно исчерпывающим для того, чтобы понять, как же компилятор видит абсурдное с первого взгляда выражение 1[data].
Лезем в стандарт языка С, приложение A, грамматика языка. Видим там:
Код
postfix-expression:
    primary-expression
    postfix-expression [ expression ]
    postfix-expression ( argument-expression-listopt )
    postfix-expression . identifier
    postfix-expression -> identifier
    postfix-expression ++
    postfix-expression --
    ( type-name ) { initializer-list }
    ( type-name ) { initializer-list , }
В соответствии с этой грамматикой можем иметь
postfix-expression -> postfix-expression [ expression ] -> primary-expression [ expression ]
Смотрим чуть выше. Видим там:
Код
primary-expression:
    identifier
    constant
    string-literal
    ( expression )
    generic-selection
Отсюда имеем
primary-expression -> constant
Значит с учётом двух приведённых выше выводов
postfix-expression -> constant [ expression ]
Далее смотрим, что такое expression. Полностью грамматику приводить тут нет смысла, достаточно привести следующий вывод:
expression -> assignment-expression -> conditional-expression -> logical-OR-expression -> logical-AND-expression -> inclusive-OR-expression -> exclusive-OR-expression -> AND-expression -> equality-expression -> relational-expression -> shift-expression -> additive-expression -> multiplicative-expression -> cast-expression -> unary-expression -> postfix-expression -> primary-expression -> identifier
Исходя из этого получаем:
postfix-expression -> constant [ identifier ]
Можно аналогичными рассуждениями прийти к тому, что
constant -> integer-constant
а разобравшись с тем, что же такое integer-constant, понять, что под это понятие подпадает константа 1. Разобравшись же с тем, что есть identifier, можно понять, что data является identifier. Окончательно можно заключить, что
1[data] является корректной для языка конструкцией и выводится из constant [ identifier ], т.е. является postfix-expression. Именно так, как я привел здесь устно, будет действовать компилятор при построении дерева разбора для выражения 1[data]. В конце концов он свернёт это выражение к postfix-expression, и этот узел дерева станет вершиной поддерева выражения, в которое входит данное подвыражение. Раз компилятор смог построить для этого выражения дерево разбора, то он сможет построить и код для вычисления этого выражения.
Yandex
Объявления
09.11.2012, 21:27     Указатели С
Ответ Создать тему
Опции темы

Текущее время: 14:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru