Lyt 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба Как выбирать размер для указателя на массив? например unsigned char RTC_array[2]; unsigned char *index_RTC_array; index_RTC_array=RTC_array; В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба Элементы массива располагаются последовательно. Указатель содержит адрес первого элемента. Для доступа к конкретному элементу в скомпилированном коде будет обращение через регистр+смещение Компилятор не учитывает размер массива - это задача программиста. В конце концов, какая разница, куда обращаться... ну схлопочите исключение в конце концов :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 13 января, 2014 Опубликовано 13 января, 2014 · Жалоба если не ошибаюсь, для задания размерности указателя есть ключевые слова near, tiny, far, huge ( по крайней мере в IAR for AVR ) P.S. вот PDF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 14 января, 2014 Опубликовано 14 января, 2014 · Жалоба В указателе содержится адрес 1 элемента массива в памяти, который может выходить за 0xff. Указатель автоматически приводится компилятором к необходимому типу для сохранения полного адреса 1 элемента? Но тогда если 1 элемент находится по адресу 0xff, а следующий по адресу 0x100, то будет ошибка? Или компилятор также учитывает длину массива и размер указателя выбирается с учетом возможности сохранить вдрес последнего элемента? Компилятор ничего не анализирует, а чисто формально выбирает размерность указателя (отводимое под него место) по типу памяти, не обращая внимания на то, что там лежит. Скажем, если это у вас 32-битный МК, то и все указатели на память будут у него 32-битными (4 байта длиной), даже если указует тот указатель на массив из одиночных байтов (например, текстовую строку). Т.е. в выражениях языка C/C++, подобных unsigned char *index_RTC_array; квалификатор "unsigned char" относится не к размеру указателя, а к типу памяти/массива, на который он указывает. А размерность самого указателя в этой записи не видна, а лишь подразумевается из общих соображений. В тех случах, когда в программе используются сегменты с более, чем одним типом памяти (near, tiny, far, huge), то этот тип памяти придется указывать при объявлении указателся, чтобы не возникло путаницы. Но об этом вам уже написал предыдущий оратор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться