Перейти к содержанию
    

выбор типа указателя

Как выбирать размер для указателя на массив?

например

 

unsigned char RTC_array[2];
unsigned char *index_RTC_array;
index_RTC_array=RTC_array;

 

В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Элементы массива располагаются последовательно. Указатель содержит адрес первого элемента. Для доступа к конкретному элементу в скомпилированном коде будет обращение через регистр+смещение

Компилятор не учитывает размер массива - это задача программиста. В конце концов, какая разница, куда обращаться... ну схлопочите исключение в конце концов :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

если не ошибаюсь, для задания размерности указателя есть ключевые слова near, tiny, far, huge ( по крайней мере в IAR for AVR )

 

P.S. вот PDF

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента?

 

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

 

Т.е. в выражениях языка C/C++, подобных

unsigned char *index_RTC_array;

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...