2.4 Лабораторная работа №4. Одномерные массивы и указатели
Цель работы: приобретение навыков программирования при решении задач с использованием структур данных типа массив, научиться правильно описывать одномерные массивы, графически описывать алгоритмы обработки одномерных массивов, то есть строить блок-схемы, приобрести навыки программирования с переменными типа указатель. Перед выполнением работы необходимо изучить правила описания и использования переменных типа массив и указатель.
Общие сведения:
Массивы - это последовательная группа ячеек памяти, имеющих одинаковое имя. Доступ к отдельным элементам массивов организуется посредством указания имени массива и порядкового номера (индекса) необходимого элемента. Индекс определяет положение элемента относительно начала массива.
При описании массива необходимо указать:
- тип элементов;
- имя массива;
- размерность массива.
Общая форма описания массива имеет вид:
тип имя_масссива [размер1][размер 2]….;
При описании одномерного массива в скобках указывается только один индекс, определяющий количество элементов в массиве. Например:
float A[5], B[25];
При описании можно инициализировать элементы массива заданными значениями.
Например:
int D[5]={23, 45, 32, 12, 88};
В языке Си элементы в массиве нумеруются, начиная с нуля, т.е. индекс первого элемента равен 0, а индекс последнего элемента – на единицу меньше размера массива.
Связь между указателями и массивами. В языке Си массивы и указатели тесно связаны.
Указатель – это переменная, в которой хранится адрес другой переменной или участка памяти.
Указатель объявляется следующим образом:
тип *<имя переменной>;
Указатели объявляются в списке переменных, но перед их именем ставится знак *. Указатель всегда указывает на переменную того типа, для которого он был объявлен.
Унарная операция &, примененная к некоторой переменной, показывает, что нам нужен адрес этой переменной, а не ее текущее значение. Если переменная uk объявлена как указатель, то оператор присваивания uk=&x означает: "взять адрес переменной x и присвоить его значение переменной-указателю uk".
Унарная операция *. примененная к указателю, обеспечивает доступ к содержимому ячейки памяти, на которую ссылается указатель. Например, *uk можно описать словами как "то, что содержится по адресу, на который указывает uk".
Доступ к любому элементу массива может быть выполнен с помощью указателей. Если uk -указатель на целое, описанный как int *uk, то uk после выполнения операции uk=&a[0] содержит адрес a[0], а uk+i указывает на i -й элемент массива. Таким образом, uk+i является адресом a[i]. Так как имя массива в программе отождествляется с адресом его первого элемента, то выражение uk=&a[0] эквивалентно такому: uk=a. Поэтому значение a[i] можно записать как *(a+i). Применив к этим двум элементам операцию взятия адреса, получим, что &a[i] и a+i идентичны.
Рассмотрим пример программы , которая печатает строку символов в обратном порядке.
#include <stdio.h> main() { char *uk1,*uk2; uk1=uk2="ЯЗЫКИ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ"; while(*uk2!='\0') putchar(*uk2++); putchar('\n'); while(--uk2 >= uk1) putchar(*uk2); putchar('\n'); }
В самом начале указателям uk1 и uk2 присваивается начальный адрес строки "ЯЗЫКИ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ". Затем строка посимвольно печатается и одновременно указатель uk2 смещается вдоль строки. В конце вывода uk2 указывает на последний символ исходной строки. Во втором цикле while все тот же указатель uk2 начинает изменяться в обратном направлении, уменьшаясь до тех пор, пока он не будет указывать на нулевой элемент массива, обеспечивая выдачу строки в обратном порядке.