char message[6]= "Smile";
char message[]= "Smile";
Первый элемент массива message[0] содержит код символа «S», последний элемент message[5] — код конца строки 0x00.
Массив может быть многомерным. Количество измерений определяется количеством индексов массива. Пример определения двухмерного массива:
int matrix[2],[3];
По аналогии с одномерными массивами, для многомерных массивов возможна инициализация в процессе его определения:
int matrix[2],[3]= {1,2,3}{4,5,6};
Многомерный массив будет располагаться в памяти в следующем порядке:
m[0][0] m[0][1] m[0][2] m[1][0] m[1][1] m[1][2]
Обращение к элементам многомерного массива осуществляется посредством указания сразу нескольких индексов. Так после выполнения следующего выражения переменная m примет значение 6:
m = matrix[1][2]
Объединение некоторой группы данных в массив позволяет оперировать с этой группой, используя всего лишь одно имя переменной. Программы становятся более логичными и читабельными, что уменьшает вероятность появления ошибок программирования. Допустим по ходу исполнения алгоритма необходимо каждый элемент массива odd из 100 элементов, увеличить на 1. Следующий программный фрагмент демонстрирует реализацию этой задачи:
for (i=0, i<100, i++) odd[i] = odd[i] + 1;
Внимательный читатель должен был бы заметить, что в примерах этого параграфа мы использовали только массивы целочисленных элементов. Далее в примерах программирования МК семейства 68HC12 будут использоваться именно целочисленные исчисления, поскольку вычисления в формате с плавающей запятой предполагают достаточно сложный алгоритм управления, который вряд ли уместен при начальном обучении. Однако мы рассмотрим более сложный вариант массива — массив структур в параграфе 3.12.
В языке Си заложена возможность определения отдельного класса переменных, которые называются указателями. Также предусмотрены операции, которые могут быть использованы для доступа к этим указателям и для манипулирования ими. Указателем называется переменная, предназначенная для хранения адреса другой переменной. Например, указатель однобайтовой переменной содержит в себе адрес переменной типа char. Указатели могут применяться для упрощения манипулирования массивами, структурами и другими блоками данных, а также для доступа к конкретным физическим ячейкам памяти микроконтроллерных систем. Именно это свойство языка Си делает его столь популярным среди сообщества разработчиков встраиваемых систем.
Для определения переменной указателя используется оператор *:
int *ptr
Приведенная запись означает, что переменная ptr содержит в себе адрес старшего байта двухбайтовой переменной типа int. Переменная указатель может быть определена для адресации различных типов переменных: целочисленных однобайтовых типа char и двухбайтовых типа int, одномерных и многомерных массивов из переменных char или int, одиночных переменных или массивов из элементов в формате с плавающей запятой, а также для структур, определенных пользователем. Спецификация типа указателя информирует компилятор о размере и типе объекта, на который показывает указатель. Таким образом, при обращении к любой области памяти через указатель, содержимое этой области будет трактоваться в соответствие с заданным типом указателя. В микроконтроллерах, поддерживающих различные способы формирования адресов объектов, спецификация типа может влиять на размер области памяти, отводимой для хранения указателя.
Применение указателей в реальных программах требует особого внимания программистов, поскольку именно с указателями связано основное количество ошибок в исходном тексте программы на Си. При манипулировании указателями, а также при выполнении операций присваивания следует убедиться в корректном использовании различных типов переменных. Приведем пример применения указателя:
1 void main(void)
2 {
3 char *ptr;
4 static char message[] = "What a wonderful day!";
5 ptr = message;
6 printf("%s\n", ptr);
7 }
В этом примере переменная ptr была определена как указатель для однобайтовой переменной типа char. Поэтому переменная ptr должна содержать 16 разрядный адрес однобайтовой переменной. В строке 4 примера был определен и инициализирован массив однобайтовых переменных message. Этот массив содержит 22 элемента: 21 символ в кодах ASCII и один байт признака конца строки. Выражение в строке 5 имеет своей целью запись в переменную ptr начального адреса массива message, т.е. адреса символа «W». Выражение, записанное в строке 6, должно начать вывод на экран монитора символа, на который указывает содержимое переменной указателя ptr. В строке 5 данного примера может быть записано другое, более понятное выражение:
Читать дальше