5. Адреса, указатели и массивы

Поскольку в языке определен только один тип (var), поддержка указателей и массивов ограничена (по сравнению, с такими языками, как Си). Указатель на переменную типа var в свою очередь также является переменной типа var. Все массивы (кроме статических) являются массивами элементов типа var.

В языке определены 4 адресных пространства:

Карта памяти определяется конкретной имплементацией языка (см. разделы 9.2 и 9.3).

Адрес переменной - это значение адреса ячейки адресного пространства (оперативная память), где лежит эта переменная.

Адрес регистра- это значение в карте памяти, закрепленное за данным регистром. Явное взятие указателя от других конструкций не допускается.

Разыменование переменной - это чтение значения, лежащего в ячейке памяти с адресом равным значению переменной.

Разыменование числа - это чтение значения, лежащего в ячейке памяти с соответствующим адресом.

Разыменование регистров не допускается - чтение значения регистра производится путем приравнивание переменой данному регистру (var pin_value = PA0.VALUE;)

При разыменовании любой другой конструкции происходит вычисление значения конструкции, затем производится разыменование числа. Любую переменную можно использовать как указатель на массив. При этом значение переменной является началом ячеек памяти, где расположен массив.

Следует обратить внимание на принципиальное различие в работе массивов в TOIC и, например, Си. Предположим, что наша TOIC-платформа имеет размер переменной var равный 4 байта (аналог в си - uint32_t). Объявим массивы в TOIC и Си.

TOIC: var array = SYS.RAM;
C: uint32_t* array = (uint32_t*)malloc(16);

Массив в TOIC - переменная, в которой записан адрес начала оперативной памяти. Проинициализируем элементы массивов:

TOIC: array[0] = 1; array[1] = 2; array[2] = 3; array[3] = 4;
C: аналогично.

Попробуем создать указатель на второй элемент и разыменовать его:

TOIC: var second = array+1; sprintf(&PC.TX, “%u”, *second);
C: uint32_t* second = array + 1; printf(“%u”, *second);

Си выведет “2”, однако TOIC - 0x2000000 (если платформа little-endian). В чем причина? В TOIC нет типа данных “указатель на целочисленную переменную”, поэтому если в Си адрес second отличается от адреса array на 4, то в TOIC - на 1. TOIC просто прибавил 1 к переменной array.