Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: выбор типа указателя
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Lyt
Как выбирать размер для указателя на массив?
например

Код
unsigned char RTC_array[2];
unsigned char *index_RTC_array;
index_RTC_array=RTC_array;


В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента?
toweroff
Элементы массива располагаются последовательно. Указатель содержит адрес первого элемента. Для доступа к конкретному элементу в скомпилированном коде будет обращение через регистр+смещение
Компилятор не учитывает размер массива - это задача программиста. В конце концов, какая разница, куда обращаться... ну схлопочите исключение в конце концов sm.gif
megajohn
если не ошибаюсь, для задания размерности указателя есть ключевые слова near, tiny, far, huge ( по крайней мере в IAR for AVR )

P.S. вот PDF
Xenia
Цитата(Lyt @ Jan 14 2014, 00:13) *
В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента?


Компилятор ничего не анализирует, а чисто формально выбирает размерность указателя (отводимое под него место) по типу памяти, не обращая внимания на то, что там лежит. Скажем, если это у вас 32-битный МК, то и все указатели на память будут у него 32-битными (4 байта длиной), даже если указует тот указатель на массив из одиночных байтов (например, текстовую строку).

Т.е. в выражениях языка C/C++, подобных
unsigned char *index_RTC_array;
квалификатор "unsigned char" относится не к размеру указателя, а к типу памяти/массива, на который он указывает. А размерность самого указателя в этой записи не видна, а лишь подразумевается из общих соображений.

В тех случах, когда в программе используются сегменты с более, чем одним типом памяти (near, tiny, far, huge), то этот тип памяти придется указывать при объявлении указателся, чтобы не возникло путаницы. Но об этом вам уже написал предыдущий оратор.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.