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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Inocs
28 / 28 / 3
Регистрация: 28.10.2011
Сообщений: 183
#1

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

05.11.2012, 00:19. Просмотров 278. Ответов 4
Метки нет (Все метки)

Объясните пожалуйста как получается что запись типа *(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++
char str="Kak<dela>rab?"; char *p; p=str; for(int i=0;p;i++) p=toupper(p); cout<<&str<<endl;//ПОЧЕМУ ЗДЕСЬ ВЫВОДИТ ВСЮ СТРОКУ, А...

Указатели - C++
Используя вместо самой переменной указатель на нее написать программу в соответствии с заданием (выполнение задания оформить...

Указатели - C++
например мы имеем данный кусок кода char str="eto prostoi test"; char *start; start=str; cout<<start; *start='b'; ...

Указатели - C++
int k=5; int *ukaz; ukaz=&k; *ukaz=17; printf("%o\n",ukaz); printf("%o\n",k); system("pause"); Может, что то я делаю не...

Указатели - C++
Как эту программу можно записать через указатели? #include <iostream> #include <conio.h> using namespace std; int min(int ,int);...

Указатели. - C++
#include <iostream> #include <conio.h> #define N 4 #define M 5 void main() { { int mass; for(int i = 0; i< N; i++){ ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 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/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 21:27     Указатели С
Еще ссылки по теме:

Указатели - C++
Почему выводятся какие-то непонятные цифры? И почему если приводить к типу char то все норм? #include <iostream> using namespace...

Указатели. - C++
Да в конце концов, хочу понять и выучить эти указатели. Немного понял, но все же проблемы и хочу узнать ваши советы. практиковался...

Указатели - C++
Задача: Если в матрице есть две одинаковых строки, то упорядочить столбцы матрицы по неубыванию суммы положительных элементов. Память под...

Указатели - C++
Подскажите пожалуйста с чего начать. Задания в файле. Вроде бы все просто. А сел уже на первом. :wall: :wall: :wall: :wall: :wall: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4961 / 3037 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 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     Указатели С
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru