unsigned int * а;     /* переменная а представляет собой указатель на целочисленную беззнаковую переменную */

float * х;               /* переменная х может указывать на переменную с плавающей точкой */

char * fuffer;         /* объявляется указатель с именем fuffer, который может указывать на символьную переменную */

float *nomer;

Задавая вместо спецификатора типа ключевое слово void, можно отсрочить определение типа, на который ссылается указатель. Переменная, объявляемая как указатель на тип void, может быть использована для ссылки на объект любого типа. Однако для того, чтобы можно было выполнить арифметические и логические операции над указателями или над объектами, на которые они указывают, необходимо при выполнении каждой операции явно определить тип объектов. Такие определения типов могут быть выполнены с помощью операции приведения типов.

void *addres;          /* Переменная addres объявлена как указатель на объект любого типа. Поэтому ей можно присвоить адрес любого объекта */

addres = &nomer    /* (& — операция вычисления адреса). */

(float *)address ++; /* Однако, как было отмечено выше, ни одна арифметическая операция не может быть выполнена над указателем, пока не будет явно определен тип данных, на которые он указывает. В данном примере используется операция приведения типа (float *) для преобразования типа указателя address к типу float. Затем оператор ++ отдает приказ перейти к следующему адресу переменной с таким же типом. */

В качестве модификаторов при объявлении указателя могут выступать ключевые слова const, data, idata, xdata, code. Ключевое слово const указывает, что указатель не может быть изменен в программе.

Вследствие уникальности архитектуры контроллера 8051 и его производных компилятор С-51 поддерживает 2 вида указателей: специализированные (memory-specific pointers) и общего вида (generic pointers).

Указатели общего вида

Указатели общего вида объявляются точно так же, как указатели в стандартном языке программирования С. Для того чтобы не зависеть от типа памяти, в которой может быть размещена переменная, для указателей общего вида выделяется 3 байта. В первом байте указывается вид памяти переменной, во втором байте — старший байт адреса, в третьем — младший байт адреса переменной. Указатели общего вида могут быть использованы для обращения к любым переменным независимо от типа памяти микроконтроллера. Многие библиотечные функции языка программирования С-51 используют указатели этого типа, поскольку в этом случае совершенно неважно, в какой именно области памяти размещаются переменные. Приведем листинг 9.1, в котором отображаются особенности трансляции указателей общего вида.

Специализированные указатели

В объявления специализированных указателей всегда включается модификатор памяти. Обращение всегда происходит к указанной области памяти, например:

char data *str;          /* указатель на строку во внутренней памяти данных data */

int xdata *numtab;    /* указатель на целое во внешней памяти данных xdata */

long code *powtab;  /* указатель на длинное целое в памяти программ code */

Поскольку модель памяти определяется во время компиляции, специализированным указателям не нужен байт, в котором указывается тип памяти микроконтроллера. Поэтому программа с использованием типизированных указателей короче и будет выполняться быстрее по сравнению с программой, использующей указатели общего вида. Специализированные указатели могут иметь размер в 1 байт (указатели на память idata, data, bdata и pdata) или в 2 байта (указатели на память code и xdata).

Массивы
Перейти на страницу:

Поиск

Похожие книги