unsigned int * а; /* переменная
float * х; /* переменная
char * fuffer; /* объявляется указатель с именем
float *nomer;
Задавая вместо спецификатора типа ключевое слово void, можно отсрочить определение типа, на который ссылается указатель. Переменная, объявляемая как указатель на тип void, может быть использована для ссылки на объект любого типа. Однако для того, чтобы можно было выполнить арифметические и логические операции над указателями или над объектами, на которые они указывают, необходимо при выполнении каждой операции явно определить тип объектов. Такие определения типов могут быть выполнены с помощью операции приведения типов.
void *addres; /* Переменная
addres = &nomer /* (
(float *)address ++; /* Однако, как было отмечено выше, ни одна арифметическая операция не может быть выполнена над указателем, пока не будет явно определен тип данных, на которые он указывает. В данном примере используется операция приведения типа (float *) для преобразования типа указателя
В качестве модификаторов при объявлении указателя могут выступать ключевые слова
Вследствие уникальности архитектуры контроллера 8051 и его производных компилятор С-51 поддерживает 2 вида указателей: специализированные (
Указатели общего вида
Указатели общего вида объявляются точно так же, как указатели в стандартном языке программирования С. Для того чтобы не зависеть от типа памяти, в которой может быть размещена переменная, для указателей общего вида выделяется 3 байта. В первом байте указывается вид памяти переменной, во втором байте — старший байт адреса, в третьем — младший байт адреса переменной. Указатели общего вида могут быть использованы для обращения к любым переменным независимо от типа памяти микроконтроллера. Многие библиотечные функции языка программирования С-51 используют указатели этого типа, поскольку в этом случае совершенно неважно, в какой именно области памяти размещаются переменные. Приведем листинг 9.1, в котором отображаются особенности трансляции указателей общего вида.
Специализированные указатели
В объявления специализированных указателей всегда включается модификатор памяти. Обращение всегда происходит к указанной области памяти, например:
char data *str; /* указатель на строку во внутренней памяти данных data */
int xdata *numtab; /* указатель на целое во внешней памяти данных xdata */
long code *powtab; /* указатель на длинное целое в памяти программ code */
Поскольку модель памяти определяется во время компиляции, специализированным указателям не нужен байт, в котором указывается тип памяти микроконтроллера. Поэтому программа с использованием типизированных указателей короче и будет выполняться быстрее по сравнению с программой, использующей указатели общего вида. Специализированные указатели могут иметь размер в 1 байт (указатели на память