реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> выбор типа указателя
Lyt
сообщение Jan 13 2014, 20:13
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 7-07-12
Пользователь №: 72 660



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

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


В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента?
Go to the top of the page
 
+Quote Post
toweroff
сообщение Jan 13 2014, 20:17
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Элементы массива располагаются последовательно. Указатель содержит адрес первого элемента. Для доступа к конкретному элементу в скомпилированном коде будет обращение через регистр+смещение
Компилятор не учитывает размер массива - это задача программиста. В конце концов, какая разница, куда обращаться... ну схлопочите исключение в конце концов sm.gif
Go to the top of the page
 
+Quote Post
megajohn
сообщение Jan 13 2014, 21:27
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



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

P.S. вот PDF


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 14 2014, 01:31
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(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), то этот тип памяти придется указывать при объявлении указателся, чтобы не возникло путаницы. Но об этом вам уже написал предыдущий оратор.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016