Язык C. Производные типы данных: массивы, указатели, структуры, массивы структур. Статические и динамические массивы

Страницы работы

Содержание работы

1.1.3. Язык C. Производные типы данных: массивы, указатели, структуры, массивы структур. Статические и динамические массивы

Производные типы данных составляются из основных. К ним относятся указатели, массивы, структуры.

Указатели – это переменные, которые содержат адреса других переменных в памяти. Перед использованием они должны быть объявлены:

тип *имя;

Например, int count, *countPtr; объявляет переменную count целого типа и countPtr как указатель на целое число. Указатель может получить в качестве значения 0, NULL или адрес. Указатель со значением 0 или NULL ни на что не указывает. NULL – это константа, определённая в нескольких заголовочных файлах стандартной библиотеки C.

Операция адресации & возвращает адрес своего операнда. Например,

countPtr = &count;

присваивает адрес переменной count указателю countPtr. Операция *, называемая операцией косвенной адресации или операцией разыменования, возвращает значение объекта, на который указывает её операнд:

y = *countPtr;

присвоит переменной y значение переменной count, на которую ссылается countPtr.

С указателями могут выполняться некоторые арифметические операции: их можно увеличивать (++), уменьшать (--), складывать с ними целые числа (+ или +=), вычитать из них целые числа (- или -=) и вычитать один указатель из другого. Когда целое складывается или вычитается из указателя, оно предварительно умножается на размер объекта, на который ссылается указатель. При вычитании указателей разность адресов делится на размер объектов. Указатели также можно сравнивать, используя операции проверки равенства и отношения, и присваивать другим указателям того же типа.

Массив – это именованный набор однотипных переменных, расположенных в памяти непосредственно друг за другом, доступ к которым осуществляется по индексу. Объявление массива:

тип имя[n] = {н.з. 1-го эл., … н.з. n-го эл.};

– где n – количество элементов массива. Задание начальных значений необязательно; если они задаются – необязательно указывать размер массива в квадратных скобках. Имя массива является указателем на его первый элемент.

Обращение к элементу производится по его индексу. Нумерация элементов начинается с 0. Например, чтобы обратиться к первому элементу массива a, нужно записать: a[0]

Массивы могут быть многомерными. Двумерный массив можно сравнить с таблицей, значение в которой ищут по координатам строки и столбца. Пример объявления двумерного массива:

int a[2][3] = {{1,2,3}, {4,5,6}};

Здесь a[0][2] = 3. Можно использовать сечения массива: a[0] возвращает первую «строку» {1,2,3} двумерного массива. Пары квадратных скобок можно отбрасывать только справа налево и строго последовательно. Таким образом, в приведённом примере «столбец» массива получить нельзя.

Массивы, размеры которых могут изменяться в процессе выполнения программы, называются динамическими. Обычные массивы называются статическими. Работа с динамическими массивами ведётся через указатели:

int *a, x, i;

a = (int *)calloc(x, sizeof(int));

for(i=0; i<x; i++)

a[i] = i;

free(a);

a = NULL;

Функция calloc выделяет x блоков по sizeof(int) байт каждый. Адрес начала выделенной области преобразуется в указатель на целое число и присваивается указателю a. Теперь a указывает на первый элемент массива целых чисел. В цикле for массив заполняется числами от 0 до x–1. В конце работы с динамическим массивом память, занимаемая им, освобождается с помощью функции free, а указателю a во избежание путаницы присваивается значение NULL.

Структуры – это составные типы данных, построенные с использованием любых других типов, кроме функций. Описание структуры начинается с ключевого слова struct:

struct тег_структуры

{

тип_элемента1 имя_элемента1;

тип_элементаN имя_элементаN;

};

Это описание не резервирует пространства в памяти, а только создаёт новый тип данных. Тег структуры – название этого типа данных. Элементы одной и той же структуры должны иметь уникальные имена. Структура не может содержать экземпляры самой себя, но может быть включён указатель на другую структуру того же типа (рекурсивная структура). Объявляются переменные структурного типа так же, как и другие:

Time timeObject, timeArray[10], *timePtr;

– если описана структура Time, timeObject будет структурой этого типа, timeArray – массивом из 10 структур, timePtr – указателем на структуру. Переменные можно также объявлять вместе с описанием структуры – между «}» и «;». В этом случае указание тега структуры необязательно.

Для доступа к элементам структуры используется точка: timeArray[2].hour возвращает значение поля hour 3-го элемента массива структур timeArray. Для доступа к элементам структуры через указатель на неё используется стрелка: timePtr->hour

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

Похожие материалы

Информация о работе