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