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

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

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

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

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

Объясните пожалуйста как получается что запись типа *(1+data) эквивалентна записи 1[data].
Как из data[1] получается *(1+data) и *(data+1) разобрался, но вот с последней записью 1[data] беда.
data - массив.
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.11.2012, 00:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели С (C++):

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

Через указатели на указатели посчитать сумму двух чисел и записать в третье - C++
1. Через указатели на указатели посчитать сумму двух чисел и записать в третье. 2. Написать примитивный калькулятор, пользуясь только...

Указатели на указатели с числами. Почему можно присвоить число в 4-ый элемент, если массив из 2 элементов? - C++
Есть массив int **mas; mas=new int*; // выделил место под пять строк, верно ? mas=new int;// выделил для первой строки матрицы два...

Есть три переменные. Используя указатели на указатели, поменять значение максимальной и минимальной переменной - C++
Мой код. #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; void min_max(int*pa, int*pb,...

Отсортировать массив и вывести на экран (массивы и указатели на указатели) - C++
Даны массивы F-фамилий студентов и S-результаты сессии (5 оценок) , причем s- результат сессии F студента. Отсортировать массив S по...

Указатели на слонов или А зачем нужны указатели? - C++
Знаю что таких вопросов было уйма, но я так и не нашел ответа на свой вопрос. Для чего нужны указатели? Что такое указатели я знаю, это...

4
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,926
Записей в блоге: 1
05.11.2012, 00:24 #2
так и получается. Квадратные скобки - лишь удобный способ записать последовательность действий
*(1+data)
Компилятор всё равно преобразует этот [] оператор в нечто подобное.
0
Inocs
28 / 28 / 3
Регистрация: 28.10.2011
Сообщений: 183
05.11.2012, 00:38  [ТС] #3
Спасибо конечно за ответ, но честно говоря все равно не очень понятно как это преобразовывается.

Добавлено через 6 минут
Наверно, это просто нужно принять за должное
0
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/
0
silent_1991
Эксперт С++
4984 / 3041 / 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, и этот узел дерева станет вершиной поддерева выражения, в которое входит данное подвыражение. Раз компилятор смог построить для этого выражения дерево разбора, то он сможет построить и код для вычисления этого выражения.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2012, 21:27
Привет! Вот еще темы с ответами:

Написать программу сортировки через указатели на указатели - C++
Вот моя программа #include <iostream> #include <conio.h> #include <string> using namespace std; //Сортировка "пузырьком". ...

Используются ли на практике указатели на указатели объектов? - C++
Имеются ввиду указатели именно на объекты, а не динамические массивы. Например такой: Object** obj; А как насчёт такого: Object***...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
09.11.2012, 21:27
Ответ Создать тему
Опции темы

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