Александр Микушин - Занимательно о микроконтроллерах стр 62.

Шрифт
Фон

Указатели

Указатель - это переменная, которая может содержать адрес другой переменной. Указатель может быть использован для работы с переменной, адрес которой он содержит. Для инициализации указателя (записи в него начального адреса) можно использовать идентификатор переменной, при этом в качестве идентификатора может выступать имя переменной, массива, структуры, литеральной строки.

При объявлении переменной-указателя необходимо определить тип объекта данных, адрес которых будет содержать эта переменная, и идентификатор указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя:

Спецификатор типа [Модификатор] '*' Описатель.

Спецификатор типа задает тип объекта и может быть любого основного типа, структуры или объединения (об этих типах данных будет сказано ниже). Примеры объявления указателей:

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).

Массивы

При обработке данных достаточно часто приходится работать с рядом переменных одинакового типа (и описывающих одинаковые объекты). В этом случае эти переменные имеет смысл объединить одним идентификатором. Это позволяют сделать массивы.

Массивы - это группа элементов одинакового типа (char, float, int и т. п.).

Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. Объявление массива имеет два формата:

Спецификатор типа Имя [Константное выражение];

Спецификатор типа Имя [];

Имя - это идентификатор массива.

Спецификатор типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

Константное выражение в квадратных скобках задает количество элементов массива - размерность массива. При объявлении массива размерность может быть опущена в следующих случаях:

- массив инициализируется при объявлении;

- массив объявлен как формальный параметр функции;

- массив объявлен как внешняя переменная, явно определенная в другом файле.

В языке С-51 определены только одномерные массивы, но поскольку элементом массива в свою очередь тоже может быть массив, то таким образом можно определить и многомерные массивы. Они формализуются списком размерностей массива, следующих за идентификатором массива, причем каждое константное выражение размерности массива заключается в свои квадратные скобки.

Каждое константное выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит две размерности, трехмерного - три и т. д.

К каждому конкретному элементу массива можно обратиться при помощи его индекса (порядкового номера). Отметим, что в языке С первый элемент массива всегда имеет индекс, равный 0. Например:

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке