| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > как это работает? |
| Автор: LeonidPr 23.12.2014, 16:02 | ||
Добрый день. Разбираясь с ОСРВ RTX для микроконтроллеров наткнулся на некоторую для меня странность. Выделил её в такой вот код, который работает. но вот почему, я не до конца понимаю.
т.е. как возможно что функция отрабатывает успешно в обоих случаях? Добавлю еще что код вызова функции одинаков в обоих случаях, ей передается указатель на указатель. |
| Автор: xvr 23.12.2014, 16:25 |
| Array - это массив. При передаче его через формальный параметр (строка 28) он преобразуется в указатель на первй элемент (по семантике маасивов в С). Т.е. то же самое, что делается вручную в строке 35 |
| Автор: xvr 23.12.2014, 16:55 | ||
Нет, не является. Массив есть своя собственная, отдельная сущность. Просто практически везде он автоматически преобразовывается в указатель на свой первый элемент. В данном случае автоматического преобразования не происходит, а явно берется указатель на массив (это одно из тех немногих мест в семантике С, где массив не пытается прикинуться указателем PS. Второе место - оператор sizeof |
| Автор: LeonidPr 23.12.2014, 20:48 | ||||||
Сейчас проверил еще раз, в первом сообщении я неправильно написал, действительно в обоих случаях передается указатель на первый элемент массива. Но тогда возникает вопрос, что такое указатель на массив, чисто синтаксическое понятие? т.к. сейчас провел такой эксперимент. Вот функция:
Компилятор позволяет вызвать её только так:
Хотя код генерирует, как будто я её вызывал так:
Добавлено через 4 минуты и 11 секунд Мда, сначала задал вопрос, потом подумал. так же и получается как вы сказали, если массив это некое отдельное понятие, то все правильно, функция и получает указатель на этот именованный блок ячеек, суть указатель на первую... Спасибо за разъяснение, надо будет еще почитать по этой теме где-нибудь. |
| Автор: LeonidPr 24.12.2014, 10:24 |
| м-м-м, забыл еще поинтересоваться, является ли эта особенность массивов implementation-defined, или это где-то описано в стандарте языка? сейчас ковыряю стандарт C++ 2003 , что-то пока не могу понять из чего следует такое поведение. |
| Автор: xvr 25.12.2014, 14:56 | ||||||
Указатель на масив - это указатель на его первый элемент. Получить указатель на сам массив, как целое, нельзя - нет такого понятия. Но есть ссылка на массив:
Вывод:
Описанно конечно. С++ 11 (драфт), раздел 8.3.4: Arrays |
| Автор: LeonidPr 21.1.2015, 09:58 |
| Нашел интересную ссылку по теме, оказывается не у одного меня эта проблема возникла, даже в FAQ внесли. http://c-faq.com/aryptr/index.html |