Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмизация и ОП / 4 Лабораторная работа №4.doc
Скачиваний:
16
Добавлен:
09.02.2016
Размер:
78.85 Кб
Скачать

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 начинает изменяться в обратном направлении, уменьшаясь до тех пор, пока он не будет указывать на нулевой элемент массива, обеспечивая выдачу строки в обратном порядке.