![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
LeonidPr |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Добрый день. Разбираясь с ОСРВ RTX для микроконтроллеров наткнулся на некоторую для меня странность. Выделил её в такой вот код, который работает. но вот почему, я не до конца понимаю.
т.е. как возможно что функция отрабатывает успешно в обоих случаях? Добавлю еще что код вызова функции одинаков в обоих случаях, ей передается указатель на указатель. Это сообщение отредактировал(а) LeonidPr - 23.12.2014, 16:03 --------------------
pkunzip.zip |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Array - это массив. При передаче его через формальный параметр (строка 28) он преобразуется в указатель на первй элемент (по семантике маасивов в С). Т.е. то же самое, что делается вручную в строке 35
|
|||
|
||||
LeonidPr |
|
||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Это-то понятно, я вот вот что не могу въехать... переменная типа ArrayType - это константный указатель, когда я передаю аргумент в функцию таким образом
то я сначала получаю указатель на Array (который сам является указателем), получая указатель на указатель и полученное значение передается в функцию, т.е. по моей логике разыменовав его она должна была-бы достучаться не до Array[0], а до той ячейки, где лежит указатель на Array[0]. --------------------
pkunzip.zip |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Нет, не является. Массив есть своя собственная, отдельная сущность. Просто практически везде он автоматически преобразовывается в указатель на свой первый элемент. В данном случае автоматического преобразования не происходит, а явно берется указатель на массив (это одно из тех немногих мест в семантике С, где массив не пытается прикинуться указателем ![]() PS. Второе место - оператор sizeof |
|||
|
||||
LeonidPr |
|
||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
![]() Сейчас проверил еще раз, в первом сообщении я неправильно написал, действительно в обоих случаях передается указатель на первый элемент массива. Но тогда возникает вопрос, что такое указатель на массив, чисто синтаксическое понятие? т.к. сейчас провел такой эксперимент. Вот функция:
Компилятор позволяет вызвать её только так:
Хотя код генерирует, как будто я её вызывал так:
Добавлено через 4 минуты и 11 секунд Мда, сначала задал вопрос, потом подумал. так же и получается как вы сказали, если массив это некое отдельное понятие, то все правильно, функция и получает указатель на этот именованный блок ячеек, суть указатель на первую... Спасибо за разъяснение, надо будет еще почитать по этой теме где-нибудь. --------------------
pkunzip.zip |
||||||
|
|||||||
LeonidPr |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
м-м-м, забыл еще поинтересоваться, является ли эта особенность массивов implementation-defined, или это где-то описано в стандарте языка? сейчас ковыряю стандарт C++ 2003 , что-то пока не могу понять из чего следует такое поведение.
--------------------
pkunzip.zip |
|||
|
||||
xvr |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Указатель на масив - это указатель на его первый элемент. Получить указатель на сам массив, как целое, нельзя - нет такого понятия. Но есть ссылка на массив:
Вывод:
Описанно конечно. С++ 11 (драфт), раздел 8.3.4: Arrays |
||||||
|
|||||||
LeonidPr |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
Нашел интересную ссылку по теме, оказывается не у одного меня эта проблема возникла, даже в FAQ внесли.
Arrays and Pointers --------------------
pkunzip.zip |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |