Арифметика указателей, массивы
От: Костарев Александр Николаевич Россия  
Дата: 15.07.11 08:05
Оценка: 41 (4) -3
Статья:
Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика указателей, массивы
Автор(ы): Костарев Александр Николаевич
Дата: 15.07.2011
Рассмотрены вопросы организации памяти в С++, базовые принципы управления ею, основы работы с указателями. Представление рассматриваемых конструкций и понятий осуществляется с позиций их реализации, внутреннего устройства, что позволяет не только запомнить, как работает тот или иной оператор, та или иная конструкция, но и понять, почему они работают именно так.


Авторы:
Костарев Александр Николаевич

Аннотация:
Рассмотрены вопросы организации памяти в С++, базовые принципы управления ею, основы работы с указателями. Представление рассматриваемых конструкций и понятий осуществляется с позиций их реализации, внутреннего устройства, что позволяет не только запомнить, как работает тот или иной оператор, та или иная конструкция, но и понять, почему они работают именно так.
Чтобы хорошо работать, надо получать от этого удовольствие! (c) Michael Schumacher

Re: Арифметика указателей, массивы
От: AlexanderK Россия  
Дата: 15.07.11 08:56
Оценка:
Это простая обучающая статья, посвященная основам работы с массивами и указателями.
Чтобы хорошо работать, надо получать от этого удовольствие! (c) Michael Schumacher

Re: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 15.07.11 09:02
Оценка: +1
On 15.07.2011 12:05, Костарев Александр Николаевич wrote:
> Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика
> указателей, массивы <http://rsdn.ru/article/?1103&gt;
Автор(ы): Костарев Александр Николаевич
Дата: 15.07.2011
Рассмотрены вопросы организации памяти в С++, базовые принципы управления ею, основы работы с указателями. Представление рассматриваемых конструкций и понятий осуществляется с позиций их реализации, внутреннего устройства, что позволяет не только запомнить, как работает тот или иной оператор, та или иная конструкция, но и понять, почему они работают именно так.


Кстати, неверно же:

С/C++ позволяют создавать в стеке только массивы фиксированного размера.
Posted via RSDN NNTP Server 2.1 beta
Re: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 15.07.11 09:08
Оценка: 1 (1) +4 -1 :))) :))) :))) :)))
On 15.07.2011 12:05, Костарев Александр Николаевич wrote:

> *Статья:*

> Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика
> указателей, массивы

Круто. Скоро у нас будут статьи типа
"Работа оператора if. Часть 5. else и его разновидности."
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Арифметика указателей, массивы
От: Vain Россия google.ru
Дата: 15.07.11 09:33
Оценка: :)))
Здравствуйте, MasterZiv, Вы писали:

>> *Статья:*

>> Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика
>> указателей, массивы
MZ>Круто. Скоро у нас будут статьи типа
MZ>"Работа оператора if. Часть 5. else и его разновидности."
Статью не читал но одобряю. По крайней мере для C больше будет статей чем для немерле
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 15.07.11 09:37
Оценка:
On 15.07.2011 12:05, Костарев Александр Николаевич wrote:

"Массив — это упорядоченный набор (коллекция) однотипных объектов, размещаемых в
едином блоке памяти ..."

Это что за "блок памяти" такой ? Может определение надо дать сначала понятия
"блок памяти" ? Да и нет никакого блока памяти, есть просто память.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 15.07.11 09:55
Оценка:
On 15.07.2011 13:37, MasterZiv wrote:

Ой, извиняюсь, ещё замечания (раньше отправил).

"Массивы, равно как и любые другие виды объектов, могут быть размещены как в
стеке, так и в динамической памяти."

Ещё массивы можно просто в памяти размещать. В виде глобальных и статических
глобальных переменных. Ещё можно локальные статические переменные функций
делать.

"Код первой строки функции main выполняет такое размещение:"

Это объявление переменной и её инициализация. Никакого размещения там нет.

Замечания типа:

"
Ещё раз отметим, что объекты, составляющие массив, размещаются в памяти
непосредственно друг за другом — адрес каждого следующего объекта есть адрес
предыдущего, смещённый на размер объекта."

Потому как есть ли дырки между элементами массива -- науке неизвестно.

"Операция постфиксного инкремента имеет более высокий приоритет, чем операция
разыменования, следовательно, в выражении *p++ сначала к указателю p применяется
операция постфиксного инкремента, после чего к её результату (к значению,
возвращенному операцией постфиксного инкремента) применяется операция
разыменования."

-- тоже достаточно мутная формулировка. Надо было написать что
*p++
--
это
*(p++)

и о ПОРЯДКЕ не говорить ничего, либо что СНАЧАЛА выполнится разименование,
а ЗАТЕМ инкрементация указателя.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Арифметика указателей, массивы
От: breee breee  
Дата: 15.07.11 10:49
Оценка: +1
Здравствуйте, MasterZiv, Вы писали:

MZ>Замечания типа:


MZ>"

MZ>Ещё раз отметим, что объекты, составляющие массив, размещаются в памяти
MZ>непосредственно друг за другом — адрес каждого следующего объекта есть адрес
MZ>предыдущего, смещённый на размер объекта."

MZ>Потому как есть ли дырки между элементами массива -- науке неизвестно.


Со структурами не путаете? Между элементами массива никаких дырок не может быть.
Re[2]: Арифметика указателей, массивы
От: MxMsk Португалия  
Дата: 16.07.11 18:01
Оценка:
Здравствуйте, MasterZiv, Вы писали:

>> *Статья:*

>> Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика
>> указателей, массивы
MZ>Круто. Скоро у нас будут статьи типа
MZ>"Работа оператора if. Часть 5. else и его разновидности."
Статья для начинающих, что такого
Re[4]: Арифметика указателей, массивы
От: Abyx Россия  
Дата: 16.07.11 21:11
Оценка:
Здравствуйте, breee breee, Вы писали:

BB>Здравствуйте, MasterZiv, Вы писали:


MZ>>Замечания типа:


MZ>>"

MZ>>Ещё раз отметим, что объекты, составляющие массив, размещаются в памяти
MZ>>непосредственно друг за другом — адрес каждого следующего объекта есть адрес
MZ>>предыдущего, смещённый на размер объекта."

MZ>>Потому как есть ли дырки между элементами массива -- науке неизвестно.


BB>Со структурами не путаете? Между элементами массива никаких дырок не может быть.


могут быть изза выравнивания
(не по стандарту, но IRL такое возможно)
In Zen We Trust
Re[2]: Арифметика указателей, массивы
От: о_О
Дата: 16.07.11 21:29
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>On 15.07.2011 12:05, Костарев Александр Николаевич wrote:


>> *Статья:*

>> Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика
>> указателей, массивы

MZ>Круто. Скоро у нас будут статьи типа

MZ>"Работа оператора if. Часть 5. else и его разновидности."

после мартовского бунта теперь только такие
Re: Арифметика указателей, массивы
От: Abyx Россия  
Дата: 16.07.11 22:05
Оценка: -3
Здравствуйте, Костарев Александр Николаевич, Вы писали:

КАН>Статья:

КАН>Размещение объектов в оперативной памяти. Понятие указателя. Часть 2. Арифметика указателей, массивы
Автор(ы): Костарев Александр Николаевич
Дата: 15.07.2011
Рассмотрены вопросы организации памяти в С++, базовые принципы управления ею, основы работы с указателями. Представление рассматриваемых конструкций и понятий осуществляется с позиций их реализации, внутреннего устройства, что позволяет не только запомнить, как работает тот или иной оператор, та или иная конструкция, но и понять, почему они работают именно так.


для такой простой статьи — слишком много ошибок, неточностей, плохого кода

> cout << arr[0] << endl << arr[1] << endl << arr[2] << endl;

endl имеет сложную семантику, чтобы просто вставить символ перевода строки лучше использовать '\n'

> Массивы, равно как и любые другие виды объектов, могут быть размещены как в стеке, так и в динамической памяти.

и еще много где

> int arr[3] = {10, 20, };

в тексте не прокомментирована запятая в конце списка

> объекты, составляющие массив, размещаются в памяти непосредственно друг за другом — адрес каждого следующего объекта есть адрес предыдущего, смещённый на размер объекта.

> количество элементов размещённого в стеке массива можно рассчитать по формуле sizeof(имя массива) / sizeof(тип элемента).
в реальной жизни это может быть не так. лучше использовать что-то вроде
sizeof(arr) / ((const char*)&arr[1] — (const char*)&arr[0])
или метафункцию (std::extent например)

> Наличие модификатора const в определении объекта n существенно. Без этого модификатора n становится переменной;

одного const не достаточно, надо чтобы n была константой времени компиляции.

> while(*p++ = *s++);

этот код не будет компилироваться если предупреждения компилятора трактуются как ошибки

> Строка (более точно, C-строка) — это массив символов (объектов типа char), завершающийся нулём (символом ‘\0’).

а еще более точно "Строка символов типа char с нулевым символом на конце — это ..."
L"..." тоже строка

ИМО, обучающие статьи не должны писаться так как будто "новичкам и такое объяснение сойдет"
In Zen We Trust
Re[4]: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 17.07.11 10:26
Оценка:
BB>Со структурами не путаете? Между элементами массива никаких дырок не может быть.

А если в массиве структуры ?
Re[2]: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 17.07.11 10:36
Оценка:
On 07/17/2011 02:05 AM, Abyx wrote:
>
> для такой простой статьи — слишком много ошибок, неточностей, плохого кода

Да ладно, не всё так плохо, шансы ещё есть.
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Арифметика указателей, массивы
От: trophim Россия  
Дата: 17.07.11 14:03
Оценка:
А как верно?
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Let it be! — Давайте есть пчелу!
Re[5]: Арифметика указателей, массивы
От: dilmah США  
Дата: 17.07.11 14:46
Оценка: 1 (1) +4
BB>>Со структурами не путаете? Между элементами массива никаких дырок не может быть.

MZ>А если в массиве структуры ?


если в массиве структуры, то дырки (если они есть) есть в структуре (либо между членами, либо паддинг в конце) -- все эти дырки учитываются в размере sizeof структуры. А дырок между элементами массива нет в любом случае.
Re[3]: Арифметика указателей, массивы
От: watch-maker  
Дата: 17.07.11 16:22
Оценка: 2 (1)
Здравствуйте, trophim, Вы писали:
T>А как верно?
В языке C есть variable-length arrays — массивы переменного размера, которые обычно как-раз и размещаются на стеке.
Кроме того, массив на стеке можно явно создать вызовом функции alloca(), или, если нужно, комбинацией alloca() + placement new в С++. И хотя функция alloca() непосредственно не входит в стандарты C/C++, она доступна на многих платформах.
Re[4]: Арифметика указателей, массивы
От: trophim Россия  
Дата: 17.07.11 17:07
Оценка:
Ну, MSVC в число поддерживающих C99 не входит? GCC я полагаю такое умеет. Да?
... << RSDN@Home 1.2.0 alpha 5 rev. 1495>>
Let it be! — Давайте есть пчелу!
Re[5]: Арифметика указателей, массивы
От: watch-maker  
Дата: 17.07.11 18:59
Оценка:
Здравствуйте, trophim, Вы писали:

T>Ну, MSVC в число поддерживающих C99 не входит?

Да. Но, строго говоря, для реализации VLA не обязательно поддерживать весь C99. MSVC и C++98 целиком не поддерживает, но это же не значит, что в нём не реализована более-менее значительная часть языка, описанная этим стандартом
T>GCC я полагаю такое умеет. Да?
gcc умеет, icc умеет, clang похоже тоже умеет. MSVC видимо не умеет.
Re[6]: Арифметика указателей, массивы
От: Nuzhny Россия https://github.com/Nuzhny007
Дата: 18.07.11 04:56
Оценка:
Здравствуйте, watch-maker, Вы писали:

WM>gcc умеет, icc умеет, clang похоже тоже умеет. MSVC видимо не умеет.


alloca умеет, этого вполне достаточно.
Re[7]: Арифметика указателей, массивы
От: dilmah США  
Дата: 18.07.11 05:11
Оценка:
N>alloca умеет, этого вполне достаточно.

изначально вопрос был о неверности утверждения:

С/C++ позволяют создавать в стеке только массивы фиксированного размера.


alloca не является ни частью С, ни частью С++ поэтому наличие alloca недостаточно для опровержения этого утверждения (мало ли что можно сделать ассемблерными вставками )

а вот наличия в С99 массивов переменного размера -- достаточно.
Re[6]: Арифметика указателей, массивы
От: MasterZiv СССР  
Дата: 18.07.11 05:49
Оценка: -1
On 17.07.2011 18:46, dilmah wrote:

> если в массиве структуры, то дырки (если они есть) есть в структуре (либо между

> членами, либо паддинг в конце) -- все эти дырки учитываются в размере sizeof
> структуры. А дырок между элементами массива нет в любом случае.

Я ж не говорил, что sizeof элемента массива эти дырки не учитывает.
Я говорил, что в принципе дырки есть.
Posted via RSDN NNTP Server 2.1 beta
Re: Арифметика указателей, массивы
От: LLI  
Дата: 19.07.11 10:57
Оценка: +1
Статья, достаточно хорошая... Для начинающих изучать С++ — достаточно подробно (хотя и есть ляпы: про *p++, ИМХО, проще надо было).
Вопрос к редакционной коллегии RSDN-а: можно как-нибудь ввести условный уровень знаний/умений, необходимый для познания какого-либо материала? или же класс (уровень) для кого сие чтиво предназначено?
Re[2]: Арифметика указателей, массивы
От: The Lex Украина  
Дата: 20.07.11 14:05
Оценка:
Здравствуйте, LLI, Вы писали:

LLI>Статья, достаточно хорошая... Для начинающих изучать С++ — достаточно подробно (хотя и есть ляпы: про *p++, ИМХО, проще надо было).

Полезно и подробно — оно, конечно, да, но вот "для начинающих изучать Си++" ли? Это скорее "краткий обобщенный курс ассемблера х-86 с упрощениями", в котором для удобства видимо автора использован Си++ (на кой вообще си++ то? куда сюда лезут new()?) в качестве базового языка. Отношения к самим "плюсам" — весьма опосредствованное.

Да и к полезности, вообще, тоже: у меня помнится в детстве книжка была что-то там то ли про профессора Фортрана, то ли про путешествие каких-то детей в компьютер — по-моему там примерно такое же на примерно таком же уровне объяснялось. Разве что явно меньшим количеством текста и картинок тоже.

имхо, место данной теории в разделе "общее устройство компьютера и базовые концепции оперативной памяти и адресного пространства".
Голь на выдумку хитра, однако...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.